OberonCore
https://forum.oberoncore.ru/

Библиотеки виджетов для XDS?
https://forum.oberoncore.ru/viewtopic.php?f=30&t=2446
Страница 2 из 2

Автор:  Александр Ильин [ Понедельник, 06 Май, 2013 10:44 ]
Заголовок сообщения:  Re: Библиотеки виджетов для XDS?

ilovb писал(а):
Большое спасибо!
Это вам спасибо за интересный проект и, тем более, за поддержку XDS!
ilovb писал(а):
А насчет псевдонимов функций не подскажете?
Подскажу, раз такое дело.

Чтобы переименовать функции надо lib-файл создавать не сразу из DLL, а из IDF-файла (import definition). В этом самом IDF-файле задаёте переименования какие вам нужны. Удобнее всего получить IDF-файл из EDF-файла путём ручной или автоматической правки (я использовал SED).

Например, получаем EDF-файл: xlib /edf iup.edf iup.dll
Цитата:
LIBRARY iup.dll

EXPORTS
IupAlarm
IupAppend
IupButton
IupCanvas
IupCbox
IupCboxv
...

Обрабатываем и создаём IDF-файл:
Цитата:
FROM iup.dll IMPORT
IupAlarm AS Alarm,
IupAppend AS Append,
IupButton AS Button,
IupCanvas AS Canvas,
IupCbox,
IupCboxv,
...
;
Если что-то переименовывать не нужно, оставляете просто имя импортируемой функции, не добавляя часть "AS ...". То есть, это просто список импортируемых функций через запятую, в конце должна быть точка с запятой.

Затем из этого текстового списка формируем бинарный lib-файл для линкера: xlib /implib iup.lib iup.idf

Автор:  Димыч [ Понедельник, 06 Май, 2013 10:46 ]
Заголовок сообщения:  Re: Библиотеки виджетов для XDS?

ilovb писал(а):
Допилю этот бинд сегодня вечером и выложу на google code.

Лучше на http://GitHub.com, там заметно удобнее.

Автор:  ilovb [ Понедельник, 06 Май, 2013 10:59 ]
Заголовок сообщения:  Re: Библиотеки виджетов для XDS?

Александр, отлично! Спасибо еще раз. А я уж было подумал что никак :)

Димыч, а чем github лучше?

Мне google code нравится за:
1. высокая скорость работы
2. простота интерфейса
3. возможность писать описания к файлам
4. удобно делать ссылки на исходники
5. нет нужды делать readme.md
6. много настроек интерфейса
7. можно указывать ключевые слова для проекта
и т.д.

Автор:  Димыч [ Понедельник, 06 Май, 2013 11:22 ]
Заголовок сообщения:  Re: Библиотеки виджетов для XDS?

ilovb писал(а):
Димыч, а чем github лучше?

Мне google code нравится за:
...
и т.д.


Это GIT, в первую очередь.
Ну а все остальное - удобство и пр. - относится и к github.

Автор:  ilovb [ Понедельник, 06 Май, 2013 12:23 ]
Заголовок сообщения:  Re: Библиотеки виджетов для XDS?

Так google code тоже GIT (и SVN и Mercurial)
Я пользуюсь Mercurial (не знаю чем он отличается от GIT, но мне нравится оболочка http://tortoisehg.bitbucket.org/)

Предлагаю всем заинтересованным проголосовать где лучше разместить, и под какую VCS.
Размещу там, где большинству будет удобнее.

Автор:  Димыч [ Понедельник, 06 Май, 2013 12:28 ]
Заголовок сообщения:  Re: Библиотеки виджетов для XDS?

ilovb писал(а):
Размещу там, где большинству будет удобнее.

Размести там, где считаешь нужным, не спрашивая.

Автор:  ilovb [ Понедельник, 06 Май, 2013 12:32 ]
Заголовок сообщения:  Re: Библиотеки виджетов для XDS?

В таком случае я размещу на google code под GIT.
А на github сделаю зеркало.

Автор:  Роман М. [ Понедельник, 06 Май, 2013 13:47 ]
Заголовок сообщения:  Re: Библиотеки виджетов для XDS?

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

https://bitbucket.org/Romiras/bindings

Принципиальной разницы в выборе хостинга для меня нет. Главное, чтобы поддерживались Subversion, Git и не был платным. Они примерно одинаковы.
Один лишь нюанс (на любителя, конечно): исходники в репозитории я держу лишь в текстовом формате в кодировке UTF-8 (CpcUtf8Conv), для простоты просмотра людьми, броузером.
И ещё для любой привязки к библиотеке я использую в имени модуля префикс "Libs" (потому что "Lib" уже занят в коллекции CPC).
А поверх той API я строю КП компоненты в отдельной подсистеме (такие как Cairo).

Автор:  ilovb [ Понедельник, 06 Май, 2013 19:57 ]
Заголовок сообщения:  Re: Библиотеки виджетов для XDS?

Люди, подскажите еще как в XDS адрес процедуры получить. SYSTEM.ADR процедуры не принимает.

Автор:  ilovb [ Понедельник, 06 Май, 2013 20:26 ]
Заголовок сообщения:  Re: Библиотеки виджетов для XDS?

Получение адреса процедуры нужно для установки колбэков.
Вот все их виды:
Код:
typedef int (*IFidle)(void);  /* idle */

typedef void (*IFii)(int, int); /* globalkeypress_cb */
typedef void (*IFiis)(int, int, char*);  /* globalmotion_cb */
typedef void (*IFiiiis)(int, int, int, int, char*);  /* globalbutton_cb */
typedef void (*IFfiis)(float,int,int,char*);  /* globalwheel_cb */

typedef int (*IFn)(Ihandle*);  /* default definition, same as Icallback (ncols_cb, nlines_cb)*/
typedef int (*IFni)(Ihandle*, int);   /* k_any, show_cb, toggle_action, spin_cb, branchopen_cb, branchclose_cb, executeleaf_cb, showrename_cb, rightclick_cb, extended_cb, height_cb, width_cb */
typedef int (*IFnii)(Ihandle*, int, int);  /* resize_cb, caret_cb, matrix_mousemove_cb, enteritem_cb, leaveitem_cb, scrolltop_cb, dropcheck_cb, selection_cb, select_cb, switch_cb, scrolling_cb, vspan_cb, hspan_cb */
typedef int (*IFniii)(Ihandle*, int, int, int); /* trayclick_cb, edition_cb */
typedef int (*IFniiii)(Ihandle*, int, int, int, int); /* dragdrop_cb */
typedef int (*IFniiiiiiC)(Ihandle*, int, int, int, int, int, int, void*);  /* draw_cb */
typedef int (*IFniiiiii)(Ihandle*, int, int, int, int, int, int);  /* OLD draw_cb */

typedef int (*IFnff)(Ihandle*, float, float);    /* canvas_action */
typedef int (*IFniff)(Ihandle*,int,float,float);  /* scroll_cb */
typedef int (*IFnfiis)(Ihandle*,float,int,int,char*);  /* wheel_cb */

typedef int (*IFnsCi)(Ihandle*, char*, void*, int);  /* dragdata_cb */
typedef int (*IFnsCiii)(Ihandle*, char*, void*, int, int, int);  /* dropdata_cb */
typedef int (*IFnsiii)(Ihandle*, char*, int, int, int);  /* dropfiles_cb */

typedef int (*IFnnii)(Ihandle*, Ihandle*, int, int); /* drop_cb */
typedef int (*IFnnn)(Ihandle*, Ihandle*, Ihandle*); /* tabchange_cb */
typedef int (*IFnss)(Ihandle*, char *, char *);  /* file_cb */
typedef int (*IFns)(Ihandle*, char *);  /* multiselect_cb */
typedef int (*IFnsi)(Ihandle*, char *, int);  /* copydata_cb */
typedef int (*IFnis)(Ihandle*, int, char *);  /* text_action, multiline_action, edit_cb, rename_cb */
typedef int (*IFnsii)(Ihandle*, char*, int, int);  /* list_action */
typedef int (*IFniis)(Ihandle*, int, int, char*);  /* motion_cb, click_cb, value_edit_cb */
typedef int (*IFniiis)(Ihandle*, int, int, int, char*);  /* touch_cb */
typedef int (*IFniiiis)(Ihandle*, int, int, int, int, char*);  /* button_cb, matrix_action, mousemotion_cb */
typedef int (*IFniiiiiis)(Ihandle*, int, int, int, int, int, int, char*);  /* mouseclick_cb */

typedef int (*IFnIi)(Ihandle*, int*, int); /* multiselection_cb, multiunselection_cb */
typedef int (*IFnd)(Ihandle*, double);  /* mousemove_cb, button_press_cb, button_release_cb */
typedef int (*IFniiIII)(Ihandle*, int, int, int*, int*, int*); /* fgcolor_cb, bgcolor_cb */
typedef int (*IFniinsii)(Ihandle*, int, int, Ihandle*, char*, int, int); /* dropselect_cb */
typedef int (*IFnccc)(Ihandle*, unsigned char, unsigned char, unsigned char); /* drag_cb, change_cb */
typedef int (*IFniIIII)(Ihandle*, int, int*, int*, int*, int*); /* multitouch_cb */

typedef char* (*sIFnii)(Ihandle*, int, int);  /* value_cb */
typedef char* (*sIFni)(Ihandle*, int);  /* cell_cb */

Автор:  ilovb [ Понедельник, 06 Май, 2013 23:30 ]
Заголовок сообщения:  Re: Библиотеки виджетов для XDS?

В общем я решил таки использовать Mercurial :roll: : https://code.google.com/p/o2-iup/
И сделал зеркало на github: https://github.com/ilovb/o2-iup

Бинд почти готов к использованию. Осталось только с колбэками разобраться.

Функции с переменным количеством параметров работают. Т.е. бинд можно использовать практически один в один как на Си.

Во вложении проект с биндом, библиотекой и примером.

Изображение

ps Очень рекомендую попробовать вставить в примере такую строчку :) :
...
Iup.Show(dlg);
Iup.Show(Iup.LayoutDialog(dlg));
Iup.MainLoop();
...

Вложения:
o2iup.zip [374.57 КБ]
Скачиваний: 403

Автор:  Александр Ильин [ Вторник, 07 Май, 2013 09:27 ]
Заголовок сообщения:  Re: Библиотеки виджетов для XDS?

ilovb писал(а):
Люди, подскажите еще как в XDS адрес процедуры получить. SYSTEM.ADR процедуры не принимает.
Покажите пример, как предполагается использовать колбэки. Куда их передавать или устанавливать?

Автор:  ilovb [ Вторник, 07 Май, 2013 09:49 ]
Заголовок сообщения:  Re: Библиотеки виджетов для XDS?

Вот как я в CP сделал: viewtopic.php?f=24&t=3865&p=79803#p79803

Колбэк в бинде определен так:
Код:
Icallback*    = INTEGER;

Функция установки колбэка так:
Код:
PROCEDURE [ccall] SetCallback*   ["IupSetCallback" ] (ih: Ihandle; name: Istring; func: Icallback): Icallback;

Используется так:
Код:
PROCEDURE [ccall] BtnCB(self: Iup.Ihandle); (* наш колбэк *)
BEGIN
    Iup.SetAttribute(ml, "VALUE", "Hello!")     
END BtnCB;
...
bt := Iup.Button("Button", "btn_test"); (* кнопка на форме *)
prev := Iup.SetCallback(bt, "ACTION", SYSTEM.ADR(BtnCB)); (* действие при нажатии на кнопку *)


В CP это возможно т.к. SYSTEM.ADR определена так:
Цитата:
ADR(v) любой INTEGER адрес переменной v
ADR(P) P: PROCEDURE INTEGER адрес процедуры P


В XDS же SYSTEM.ADR не принимает процедуры.

В связи с этим на данный момент я определил колбэк только одного вида (для примера):
Код:
Icallback*    = PROCEDURE ["C"] (self: Ihandle);

Автор:  Александр Ильин [ Вторник, 07 Май, 2013 10:10 ]
Заголовок сообщения:  Re: Библиотеки виджетов для XDS?

Спасибо за пример, вопрос стал гораздо понятнее.
ilovb писал(а):
Колбэк в бинде определен так:
Код:
Icallback*    = INTEGER;
Будьте осторожны: тип INTEGER в XDS Oberon-2 имеет размер два байта, а адрес должен быть четырёхбайтовым. Размер типа INTEGER в XDS Modula-2 определяется директивой M2BASE16.

Для ваших целей нужно использовать приведение к типу LONGINT с помощью SYSTEM.VAL(LONGINT, <ProcName>).

Автор:  ilovb [ Вторник, 07 Май, 2013 10:15 ]
Заголовок сообщения:  Re: Библиотеки виджетов для XDS?

Я это уже понял. :) В бинде к XDS Oberon-2 везде LONGINT https://code.google.com/p/o2-iup/source/browse/iup.ob2

Автор:  ilovb [ Вторник, 07 Май, 2013 16:56 ]
Заголовок сообщения:  Re: Библиотеки виджетов для XDS?

Победил колбэки: https://code.google.com/p/o2-iup/source ... 9e928ae6dc

Самое смешное, что об этом сказано тут: viewtopic.php?f=27&t=4340&start=20#p79807
Цитата:
...pointer, address, opaque, and procedure type values are converted to ADDRESS ...

:D

Автор:  ilovb [ Вторник, 07 Май, 2013 17:35 ]
Заголовок сообщения:  Re: Библиотеки виджетов для XDS?

Александр Ильин писал(а):
Спасибо за пример, вопрос стал гораздо понятнее.
Для ваших целей нужно использовать приведение к типу LONGINT с помощью SYSTEM.VAL(LONGINT, <ProcName>).


Вот я слепой :( Вы же написали решение, а я не обратил внимание на <ProcName> и вложил другой смысл в предложение.

Теперь не знаю какое решение лучше...
Ваше мне кажется более правильным.

Автор:  ilovb [ Вторник, 07 Май, 2013 22:57 ]
Заголовок сообщения:  Re: Библиотеки виджетов для XDS?

Остановился на варианте с SYSTEM.VAL

На github зеркало пересоздал. Что-то оно у меня никак не заводилось. Сейчас вроде заработало.

Страница 2 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/