LINUX.ORG.RU

Расширение языка C поверх C89/99

 , objects,


0

3

Помню на гитхабе смотрел некий проект, но не могу вспомнить его название. Не Vala. Какой-то язык, расширенная версия Си, с поддержкой классов и многого другого. Напомните пожалуйста его название, или просто посоветуйте проекты. Там кажется даже сигналы слоты эвенты были, или их суррогат...

Хочется на платформе, которая застряла на C89/99 и на старой версии C++, что-то современнее и удобнее.

А еще интересует, чем бы заменить Qt? Нет возможности там Qt 5 использовать, как бы мне этого ни хотелось. Графику заменю на Nuklear, а вот чем заменить базовые классы Core, типа контейнеров?

Может есть еще хорошие классы для работы с памятью и массивами, но не STL, а что то ближе к Qt?

★★★★★

Последнее исправление: I-Love-Microsoft (всего исправлений: 2)
Ответ на: комментарий от anonymous

EFL я буду портировать дольше, чем у Земли будет сохраняться атмосфера. Как кодить без воздуха?

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от Pentium02
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/dev.h>
#include <sys/mman.h>
#include <semaphore.h>
#include <sys/types.h>
#include <sys/sched.h>
#include <sys/kernel.h>
#include <sys/proxy.h>
#include <termios.h>
#include <unistd.h>

#include <Pt.h>
#include <photon/PtRaw.h>

#define Pt_DEFAULT_PARENT NULL
#define Pt_NO_PARENT NULL

#define NK_ZERO_COMMAND_MEMORY
#define NK_INCLUDE_DEFAULT_ALLOCATOR
#define NK_INCLUDE_DEFAULT_FONT
#define NK_INCLUDE_FONT_BAKING
#define NK_IMPLEMENTATION
#include "nuklear.h"

int clicked(PtWidget_t *w, void *data, PtCallbackInfo_t *cbinfo)
{
	printf("clicked\n");
	return(Pt_CONTINUE);
}

int raw_kb(PtWidget_t *w, void *data, PtCallbackInfo_t *cbinfo)
{
	PhKeyEvent_t *ke;
	// Pk_Up, Pk_Down, Pk_q, Pk_w, Pk_e, Pk_r, Pk_t, Pk_y
	if(cbinfo->event->type == Ph_EV_KEY)
	{
		ke = (PhKeyEvent_t*) PhGetData(cbinfo->event);
		if(ke->key_mods & Pk_KM_Ctrl) printf("ctrl\n");
		if(ke->key_flags & Pk_KF_Key_Down) printf("key down\n");
		if(ke->key_flags & Pk_KF_Key_Repeat) printf("key repeat\n");
		if(ke->key_flags & Pk_KF_Cap_Valid)
		{
			if(ke->key_cap == Pk_Up) printf("up\n");
			else if(ke->key_cap == Pk_Down) printf("down\n");
			else printf("other\n");
		}
	}

	printf("raw_kb r= %d, st= %d\n", cbinfo->reason, cbinfo->reason_subtype);
	return(Pt_CONTINUE);
}

int raw_mouse(PtWidget_t *w, void *data, PtCallbackInfo_t *cbinfo)
{
	PhPointerEvent_t *pointer;
	short mouse_x, mouse_y;
	PhRect_t *pos;

	pointer = PhGetData(cbinfo->event);
	pos	= PhGetRects(cbinfo->event);
	mouse_x = pos->ul.x;
	mouse_y = pos->ul.y;

	printf("raw_mouse r= %d, st= %d | x= %d, y= %d\n", cbinfo->reason, cbinfo->reason_subtype, mouse_x, mouse_y);
	if(cbinfo->event->type & Ph_EV_BUT_PRESS)
	{
		if(pointer->buttons & Ph_BUTTON_SELECT) printf("click\n");
		else if(pointer->buttons & Ph_BUTTON_MENU) printf("rmb\n");
	}
	if(cbinfo->event->type & Ph_EV_BUT_RELEASE)
	{
		printf("release\n");
	}
	return(Pt_CONTINUE);
}

void raw_draw(PtWidget_t *widget, PhTile_t *damage)
{
	PhRect_t rect;
	PtSuperClassDraw(PtBasic, widget, damage);
	//PtCalcCanvas(widget, &rect);
	rect.ul.x = 0;
	rect.ul.y = 0;
	rect.lr.x = 640;
	rect.lr.y = 480;
	PgSetFillColor(Pg_BLUE);
	PgDrawRect(&rect, Pg_DRAW_FILL);
}

int main()
{
	PtArg_t argt[5];
	PtWidget_t *window;
	PhPoint_t raw_pos;
	PhDim_t raw_dim;
	PtWidget_t *raw;

	struct nk_context ctx;
	struct nk_font_atlas atlas;
	int img_width = -1, img_height = -1;
	struct nk_draw_null_texture nulltex;
	struct nk_font *font;
	const void *img;

	// nuklear

	printf("nuklear 1\n");
	font = nk_font_atlas_add_default(&atlas, 13, 0);
	printf("nuklear 2\n");
	img = nk_font_atlas_bake(&atlas, &img_width, &img_height, NK_FONT_ATLAS_RGBA32);
	printf("nuklear 3\n");
	nk_font_atlas_end(&atlas, nulltex.texture, 0);
	printf("nuklear 4\n");
	nk_init_default(&ctx, &font->handle);
	printf("nuklear 5\n");

	// photon raw

	if(PtInit(NULL) == -1)
	{
		exit(EXIT_FAILURE);
	}

	PtSetArg(&argt[0], Pt_ARG_WINDOW_TITLE, "Photon RAW", 0);
	if((window = PtCreateWidget(PtWindow, Pt_NO_PARENT, 1, &argt[0])) == NULL)
	{
		exit(EXIT_FAILURE);
	}

	raw_pos.x = 0;
	raw_pos.y = 0;
	raw_dim.w = 640;
	raw_dim.h = 480;
	PtSetParentWidget(window);
	PtSetArg(&argt[0], Pt_ARG_DIM, &raw_dim, 0);
	PtSetArg(&argt[1], Pt_ARG_POS, &raw_pos, 0);
	PtSetArg(&argt[2], Pt_ARG_RAW_DRAW_F, &raw_draw, 1);
	raw = PtCreateWidget(PtRaw, Pt_DEFAULT_PARENT, 3, &argt[0]);
	PtAddEventHandler(raw, Ph_EV_BUT_PRESS | Ph_EV_BUT_RELEASE | Ph_EV_PTR_MOTION_BUTTON | Ph_EV_PTR_MOTION_NOBUTTON, raw_mouse, NULL);
	PtAddEventHandler(window, Ph_EV_KEY, raw_kb, NULL);
	PtRealizeWidget(window);

	PtMainLoop();
	return EXIT_SUCCESS;
}

Вот код. После «nuklear 1» падает так:

Assertion failed: atlas->temporary.alloc, file nuklear.h, line 13699
#ifdef NK_INCLUDE_DEFAULT_FONT
NK_API struct nk_font*
nk_font_atlas_add_default(struct nk_font_atlas *atlas,
    float pixel_height, const struct nk_font_config *config)
{
    NK_ASSERT(atlas);
    NK_ASSERT(atlas->temporary.alloc);
    NK_ASSERT(atlas->temporary.free);
    NK_ASSERT(atlas->permanent.alloc);
    NK_ASSERT(atlas->permanent.free);
    return nk_font_atlas_add_compressed_base85(atlas,
        nk_proggy_clean_ttf_compressed_data_base85, pixel_height, config);
}
#endif
Эти первые строки инициализации я беру из своего работающего примера поверх Qt и QPainter:
	struct nk_context ctx;
	struct nk_font_atlas atlas;
	int img_width = -1, img_height = -1;
	struct nk_draw_null_texture nulltex;
	struct nk_font *font;
	const void *img;

	font = nk_font_atlas_add_default(&atlas, 13, 0);
	img = nk_font_atlas_bake(&atlas, &img_width, &img_height, NK_FONT_ATLAS_RGBA32);
	nk_font_atlas_end(&atlas, nulltex.texture, 0);
	nk_init_default(&ctx, &font->handle);

I-Love-Microsoft ★★★★★
() автор топика

Хочется на платформе, которая застряла на C89/99 и на старой версии C++, что-то современнее и удобнее. А еще интересует, чем бы заменить Qt? Нет возможности там Qt 5 использовать, как бы мне этого ни хотелось.

Вряд ли ты для такой ситуации найдешь что-то более современное и удобное, чем Qt 4.

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

Увы, и Qt 4 тоже недоступно. Даже на той версии QNX6 что есть возможность применить. Эту ситуацию можно рассматривать как задание написать приложение для PlayStation 2, хоть и есть Linux для PS2, но установить его запрещено, как бы ни хотелось. Вот и тут, вроде x86, и вроде можно натянуть Linux 2019-го года, но по факту запрещено заказчиком.

Я в западне, либо уволиться, либо выпрыгнуть в окно, либо таки сделать всё возможное для осовременивания платформы, или хотя бы кроссплатформенности, чтобы работать с нормальными инструментами на Linux, но затем компилять под старое УГ

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Сам нашел решение, покопался и понял что эти указатели не инициализируются у меня, сделал вот еще что:

	nk_font_atlas_init_default(&atlas);
	nk_font_atlas_begin(&atlas);
	font = nk_font_atlas_add_default(&atlas, 13, 0);
	img = nk_font_atlas_bake(&atlas, &img_width, &img_height, NK_FONT_ATLAS_RGBA32);
	nk_font_atlas_end(&atlas, nulltex.texture, 0);
	nk_init_default(&ctx, &font->handle);
Не было nk_font_atlas_init_default и nk_font_atlas_begin, хотя в моих тестах работало без этого. Это явно неверно, сейчас и выплыло.

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от Pentium02

Нужен double buffer, иначе всё будет мигать

Сдается мне, что причина в PtSuperClassDraw(PtBasic, widget, damage); Подобная проблема была и в Qt 3, я просто убрал PtSuperClassDraw и оно перестало мигать, как минимум при перерисовке фона. А то оно сначала фоновый виджет красит, затем поверх. Естественно это мигает. Пока не уверен что это помогло, пока еще подступаю к прорисовке непосредственно GUI

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Неа, не в этом дело. Дело в классической проблеме, которую решает double buffer. Когда картинка именно перерисовывается прямо у тебя на глазах. А должно быть: в один буфер рисуем, пока рисуем, показываем второй, потом меняем их местами. Memroy context в photon вполне приемлемо решает проблему. Просто для концепта сойдут и PtDBContainer с PtRaw, ускорить можно и потом. Когда доберусь до компа, гляну в каком там состоянии мой екзампл с Nuklear, и скину весь код.

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

PtDBContainer

Спасибо за наводку, буду это изучать. Пока удалось нарисовать нечто, что реагирует на клики в обработчике, реализовать кучу функций отрисовки для более менее рабочего интерфейса. И да, это мигает конечно...

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

https://github.com/manfredmann/PtSoko

Суровый геймдев под мёртвые системы :D Можешь там посмотреть работу с memory context. Вчера сходу к nuklear прикрутить не получилось, почему-то падает с сегфолтом, при попытке сделать Flush. Желания разбираться куда-то пропало, может вернусь к этому позже. Если прикрутишь, поделись плз)

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

Нашёл в чём была ошибка, забыл PhImage_t забить нулями. В общем, прикрутил рисование через memory context к Nuklear. Работает довольно шустро, cpu нагружает приемлемо (для окна разрешением 800x600).

Решение проблемы с мигающим курсором: Отключаем нахрен показ курсора мыши в окне. Рисуем курсор сами (события от мыши по прежнему приходят).

Pentium02 ★★
()
10 декабря 2019 г.
Ответ на: комментарий от Pentium02

PhDoom… Да, забыл отписаться, удалось скомпилить, запустить - работает! )))

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Еще есть Nim, его тоже можешь попробовать.

есть такой вот смоллток, компилирующися в Nim: Spry manual гитхаб бенчмарк описание

фича в том, что этот смоллток компилируется в AST макросы Nim, которые он может быстро интерпретировать и/или, переписывать в свою собственную реализацию на Nim. далее Nim, в свою очередь, компилируется в Си.

то есть, имеем смоллток, в котором примитивы можно частично переписывать на Nim/C реализацию, AST макросами.

anonymous
()
2 декабря 2020 г.
Ответ на: комментарий от Pentium02

Доброго времени суток!

С PhImage_t я долго возился, в итоге из за нерешенного бага, мне пришлось городить свой велосипед, еле еле разгадал способ организации того как там хранятся данные, отгадал сериями паттернов )))

В итоге на сегодня разработал довольно сложную программу на Nuklear поверх PtRaw. Оно работает всё, да

Но встала проблема - даблбуфер всё же нужен, мигание на локальной машине не страшно. А вот работе через PhWindows, этакий удаленный рабочий стол, да еще на плохом коннекте, приводит к жутким проблемам. Так что сижу думаю как сделать

Вот это надо использовать? PtDBContainer

I-Love-Microsoft ★★★★★
() автор топика
Последнее исправление: I-Love-Microsoft (всего исправлений: 2)
Ответ на: комментарий от I-Love-Microsoft

у нуклеара есть бэкенды для glfw, sdl, sfml, x11, dx9, dx11, rawfb и хз для чего ещё. открой каталог demo. свой бэкенд тоже не сложно сделать. но лучше бы ты не совокуплял мозги, а взял кутэ, но ты наверное не ищешь лёгких путей, да? ну imgui посмотри ещё, там тоже можно куда-нибудь двойной буфер прикрутить если захотеть.

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

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

Там есть rawfb и GDI и черти знает что ещё, бэкенд для rawfb вообще работает через setpixel/getpixel. Новый бэкенд к нуклеару пишется не очень сложно: берётся похожий бэкенд и переделывается методом копипаста. Все эти бэкбуферы и флипы есть где-то в бэкендах для opengl.

Но нуклеар какбы уже заархивировали на гитхабе, держу в курсе.

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

Мне кажется, что все таки кто-то кому-то совокупляет мозги. Phdoom написан на с++ в том числе методом замены апи х11 на апи фотона, у нуклеара есть 2-3 разных бэкенда под иксы.

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

Я написал рендер Nuklear под photon с использованием Memory Context. Это действительно не так сложно, но всё равно, некоторые проблемы есть. А у аффтара может быть много другой работы, кроме как портирования современных вещей под мамонотов. Я лишь пытаюсь помочь. Если возникнет необходимость, могу откопать свой рендер и выоложить полностью (просто хочется, чтобы человек сам сложил кирпичики вместе).

Pentium02 ★★
()
Последнее исправление: Pentium02 (всего исправлений: 1)
Ответ на: комментарий от Pentium02

Спасибо, это ценно. Скачал, буду изучать. Уже пытался делать свои наброски.

Использую просто Nuklear, потому что портировать Nukclear Cross для моей скромной задачи это ад.

Вообще, мне это так, это последние вздохи QNX 4.25, нужно просто закончить этап, уже отказываемся в пользу Linux, получено разрешение для отрасли для перехода на отечественный Linux. Очевидно, там 0.0% проблем с графическими фреймворками.

I-Love-Microsoft ★★★★★
() автор топика
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от anonymous

QNX4 RIP, для своего времени - революционная даже. QNX6 нормальная система, как и ЗОСРВ Нейтрино, но сейчас ползем на Linux

I-Love-Microsoft ★★★★★
() автор топика
11 февраля 2021 г.
Ответ на: комментарий от Pentium02

Вот я как раз сейчас этот пример смотрю, теперь вплотную. Не собирается на QNX4. Какой компилятор ему нужен? У меня Watcom 10.6

Unable to open bool.h, явно среда сборки отличается от того что должно быть

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от Pentium02

Благодаря этому коду мне удалось найти ошибку в примере из документации. И он начал компилироваться и работать на QNX4. Там картинка сначала рисуется в памяти, затем запускается PtMainLoop

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

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от Pentium02

Пример так и не заработал. Но мне удалось решить задачу!!! Благодаря подсматриванию в этот пример, похоже в документации либо ошибка либо устарело а они не обновили

Очень благодарю, теперь у меня интерфейс на Nuklear прекрасный, не мелькает не мерцает не дергается, полноценный качественный интерфейс можно сказать, абсолютно портабельный

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

А свою задачу я решил даже с resize окна, мне очень нужно было его делать, я конечно провозился, но решение получилось красивое надежное (использовал две картинки разного размера, хотя быть может задача решается путем указания корректного area)

I-Love-Microsoft ★★★★★
() автор топика
Последнее исправление: I-Love-Microsoft (всего исправлений: 3)
Ответ на: комментарий от I-Love-Microsoft

Покаж картинко то. Чё как не этот. Чай не жалко. Кофе тоже. ))

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