OberonCore
https://forum.oberoncore.ru/

IUP - Portable User Interface
https://forum.oberoncore.ru/viewtopic.php?f=28&t=4356
Страница 1 из 2

Автор:  ilovb [ Понедельник, 20 Май, 2013 15:46 ]
Заголовок сообщения:  IUP - Portable User Interface

Решил выделить отдельную тему.

viewtopic.php?f=30&t=2446#p79815
viewtopic.php?f=24&t=3865&p=79974#p7874

На данный момент ситуация такая:
Имеются бинды для основной либы из состава IUP 3.7:
XDS Oberon-2 https://code.google.com/p/o2-iup/
зеркало: https://github.com/ilovb/o2-iup
Component Pascal https://code.google.com/p/cp-iup/
Осталось сделать бинды к доп. контролам

Сейчас я занимаюсь биндом к Canvas Draw http://www.tecgraf.puc-rio.br/cd/
Дальше на очереди Image Representation, Storage, Capture and Processing: http://www.tecgraf.puc-rio.br/im/

Недавно вышла версия IUP 3.8
В ней появился доп. контрол Scintilla. Но как оказалось русский ввод в нем под Windows на данный момент не работает. (В Ubuntu работает)
Сейчас я веду переписку с разработчиком и он знает об этой проблеме. Пока неизвестно будет ли патч к версии 3.8, но разработчик заверил меня что в следующей версии (с поддержкой юникода) этой проблемы не будет. Когда это будет пока неизвестно.

У себя я захардкодил так:
В исходнике ScintillaWin.cxx заменяем условие ::IsWindowUnicode(MainHWND()) || keysAlwaysUnicode
Код:
...
case WM_CHAR:
            if (((wParam >= 128) || !iscntrl(wParam)) || !lastKeyDownConsumed) {
                if (::IsWindowUnicode(MainHWND()) || keysAlwaysUnicode) {
                    wchar_t wcs[2] = {static_cast<wchar_t>(wParam), 0};
                    if (IsUnicodeMode()) {
                        // For a wide character version of the window:
                        char utfval[4];
                        unsigned int len = UTF8Length(wcs, 1);
                        UTF8FromUTF16(wcs, 1, utfval, len);
                        AddCharUTF(utfval, len);
                    } else {
                        UINT cpDest = CodePageOfDocument();
                        char inBufferCP[20];
                        int size = ::WideCharToMultiByte(cpDest,
                            0, wcs, 1, inBufferCP, sizeof(inBufferCP) - 1, 0, 0);
                        inBufferCP[size] = '\0';
                        AddCharUTF(inBufferCP, size);
                    }
                } else {
                    if (IsUnicodeMode()) {
                        AddCharBytes('\0', LOBYTE(wParam));
                    } else {
                        AddChar(LOBYTE(wParam));
                    }
                }
            }
            return 0;
...

на TRUE
Код:
...
case WM_CHAR:
            if (((wParam >= 128) || !iscntrl(wParam)) || !lastKeyDownConsumed) {
                if (TRUE) {
                    wchar_t wcs[2] = {static_cast<wchar_t>(wParam), 0};
                    if (IsUnicodeMode()) {
                        // For a wide character version of the window:
                        char utfval[4];
                        unsigned int len = UTF8Length(wcs, 1);
                        UTF8FromUTF16(wcs, 1, utfval, len);
                        AddCharUTF(utfval, len);
                    } else {
                        UINT cpDest = CodePageOfDocument();
                        char inBufferCP[20];
                        int size = ::WideCharToMultiByte(cpDest,
                            0, wcs, 1, inBufferCP, sizeof(inBufferCP) - 1, 0, 0);
                        inBufferCP[size] = '\0';
                        AddCharUTF(inBufferCP, size);
                    }
                } else {
                    if (IsUnicodeMode()) {
                        AddCharBytes('\0', LOBYTE(wParam));
                    } else {
                        AddChar(LOBYTE(wParam));
                    }
                }
            }
            return 0;
...


Собрать IUP можно с помощью GCC или MSVC
Проще всего это сделать с помощью tecmake
Инструкция по установке: http://www.tecgraf.puc-rio.br/tecmake/e ... #win_setup

Автор:  ilovb [ Вторник, 21 Май, 2013 09:13 ]
Заголовок сообщения:  Re: IUP - Portable User Interface

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

Автор:  ilovb [ Среда, 22 Май, 2013 21:35 ]
Заголовок сообщения:  Re: IUP - Portable User Interface

Первый пример с использованием Canvas Draw:

Изображение

Код:
MODULE CdTest;
    IMPORT
        Iup := IupLib, Cd := CdLib, IupCd, SYSTEM;
    VAR
        canvas: Cd.Canvas;
        res: INTEGER;

PROCEDURE [ccall] ActionCB(self: Iup.Ihandle);
BEGIN
    res := Cd.CanvasActivate(canvas);
    Cd.CanvasClear(canvas);
    Cd.CanvasSetForeground(canvas, 0FF0000H);
    Cd.CanvasBox(canvas, 10, 55, 10, 55);
    res := Cd.CanvasFont(canvas, "Times", 0, 24);
    Cd.CanvasText(canvas, 100, 100, "Hello World!");
END ActionCB;   
   
PROCEDURE Main*;
    VAR
        dlg, cnv: Iup.Ihandle;
        context: Cd.Context;
        prev: Iup.Icallback; (* the address of the previous function associated to the action. *)
BEGIN
    res := Iup.Open(NIL, NIL);
   
    cnv := Iup.Canvas(NIL); ASSERT(cnv # NIL);
    Iup.SetAttribute(cnv, "RASTERSIZE", "300x200");
    Iup.SetAttribute(cnv, "EXPAND", "YES");
    prev := Iup.SetCallback(cnv, "ACTION", SYSTEM.ADR(ActionCB));
   
    dlg := Iup.Dialog(Iup.SetAttributes(Iup.Vbox(cnv, NIL), "MARGIN = 10x10, GAP = 10"));
    Iup.SetAttribute(dlg, "TITLE", "Canvas Draw Example");
   
    res := Iup.Map(dlg);
   
    context := IupCd.ContextIup();
    canvas := Cd.CreateCanvas(context, SYSTEM.VAL(Cd.Pointer, cnv));

    res := Iup.Show(dlg);
    res := Iup.MainLoop();
    Cd.KillCanvas(canvas);
    Iup.Destroy(cnv);
    Iup.Close();
       
END Main;
       
BEGIN
    Main;
END CdTest.Main

^Q DevLinker.LinkExe
Simple.exe := CdTest ~


Файлы во вложении:
Цитата:
Iup/Mod/Lib.odc
Iup/Mod/Cd.odc
Cd/Mod/Lib.odc
Cd/Mod/Test.odc
cd.dll
iup.dll
iupcd.dll
freetype6.dll
Simple.exe.manifest


Вложения:
cd_test.txt [1.54 МБ]
Скачиваний: 356

Автор:  ilovb [ Среда, 22 Май, 2013 23:41 ]
Заголовок сообщения:  Re: IUP - Portable User Interface

Пришло письмо от разработчика:
Цитата:
Hi,

Just committed to the CVS a new KEYSUNICODE attribute for IupScintilla on Windows. It will set the keysAlwaysUnicode variable to TRUE.

...

Best,
Scuri


Проверил. Работает.
Достаточно добавить такую строчку в свой код:
Код:
Iup.SetAttribute(sci, "KEYSUNICODE", "YES");

Автор:  ilovb [ Пятница, 24 Май, 2013 14:58 ]
Заголовок сообщения:  Re: IUP - Portable User Interface

Доделал бинды к IUP и CD для CP:
https://code.google.com/p/cp-iup/
https://code.google.com/p/cp-cd/

ps На XDS пока сил не хватило...

Автор:  ilovb [ Воскресенье, 26 Май, 2013 23:34 ]
Заголовок сообщения:  Re: IUP - Portable User Interface

Сделал первую версию бинда к IM.

Во вложении архивы с текущими версиями биндов. (CompileList и CoderList присутствуют)
Кроме того прикладываю минимальный набор dll для запуска тестовых примеров. (iup_scintilla.dll в архиве с патчем для русского языка)

Примеры IUP:
IupTest1 - Простой диалог с кнопкой и текстовым полем + редактор диалога
IupTest2 - То же самое, но вместо текстового поля Scintilla
IupTest3 - http://www.tecgraf.puc-rio.br/iup/en/ct ... l#Examples

Примеры CD:
CdTest1 - Рисование в контексте канвы IUP
CdTest2 - Рисование в контексте всего экрана

Примеры IM:
ImTest1 - Создание снимка экрана и сохранение его в JPEG

Вложения:
dll.7z [1.15 МБ]
Скачиваний: 141
IUP383.txt [59.93 КБ]
Скачиваний: 374
IM000.txt [53.8 КБ]
Скачиваний: 356
CD560.txt [44.44 КБ]
Скачиваний: 365

Автор:  ilovb [ Вторник, 28 Май, 2013 19:42 ]
Заголовок сообщения:  Re: IUP - Portable User Interface

Собрал в VS комплексный тест из исходников Canvas Draw.
Это такая небольшая демонстрация возможностей библиотеки. Писано на Си.

Изображение

Прикладываю exe'шник с минимально необходимым набором dll.

Вложения:
simple.zip [2.41 МБ]
Скачиваний: 137

Автор:  ilovb [ Среда, 29 Май, 2013 22:49 ]
Заголовок сообщения:  Re: IUP - Portable User Interface

Пример четыре в одном :D

Canvas Draw + OpenGL + FTGL + GLFW

Изображение

Код:
MODULE CdTest3;
IMPORT
    gl := OglOpenGL32,
    glu := OglGLU32,
    glfw := GlfwLib,
    Cd := CdLib, CdOgl, (*Log,*) SYSTEM;
CONST w = 640; h = 480;
VAR canvas: Cd.Canvas;
PROCEDURE Main*;
VAR
    res: INTEGER;
    context: Cd.Context;
    oldang: REAL;
    par: Cd.String;
    run: BOOLEAN;
   
    PROCEDURE Status;
    BEGIN (*Log.Int(res); Log.Ln;*) ASSERT(res # 0);
    END Status;
   
BEGIN
   
    res := glfw.Init(); Status;
    res := glfw.OpenWindow(640,480, 0,0,0,0, 32,0, glfw.WINDOW); Status;
    glfw.SetWindowTitle("Test");
    glfw.Enable(glfw.KEY_REPEAT);
    glfw.SwapInterval(1);
   
    context := CdOgl.Context(); ASSERT(context # NIL);
    par := "640x480";
    canvas := Cd.CreateCanvas(context, SYSTEM.VAL(Cd.Pointer, par)); ASSERT(canvas # NIL);
   
    gl.MatrixMode(gl.GL_PROJECTION);
    gl.LoadIdentity();
   glu.Ortho2D(0, 640, 0, 480);

   gl.MatrixMode(gl.GL_MODELVIEW);
   gl.LoadIdentity();
   
    WHILE glfw.GetWindowParam(glfw.OPENED) # 0 DO
        IF Cd.CanvasActivate(canvas) = 0 THEN
           
            Cd.CanvasClear(canvas);
            Cd.CanvasSetForeground(canvas, 0FF0000H);
            Cd.CanvasBox(canvas, 10, 55, 10, 55);
            res := Cd.CanvasFont(canvas, "Times", {6}, 48);
            oldang := Cd.CanvasTextOrientation(canvas, 45);
            Cd.CanvasText(canvas, 100, 100, "Hello World!");
           
        END;
        glfw.SwapBuffers();
    END;
    Cd.KillCanvas(canvas);
    glfw.Terminate();
   
END Main;
       
BEGIN
    (*Main;*)
END CdTest3.Main

DevLinker.LinkExe
CdTest3.exe := CdTest3 ~

Автор:  Илья Ермаков [ Пятница, 31 Май, 2013 22:31 ]
Заголовок сообщения:  Re: IUP - Portable User Interface

Хотя меня гуи не интересуют прямо сейчас...

Но хочется пожелать Вам дальнейших успехов :)

Автор:  ilovb [ Пятница, 31 Май, 2013 22:53 ]
Заголовок сообщения:  Re: IUP - Portable User Interface

Спасибо :)

Автор:  ilovb [ Суббота, 17 Август, 2013 14:33 ]
Заголовок сообщения:  Re: IUP - Portable User Interface

Пришло письмо от разработчика:
Цитата:
Hi,
Don't improved Scintilla, but support for UTF-8 is ready on CVS.
Best,
Scuri

Автор:  ilovb [ Пятница, 29 Ноябрь, 2013 16:08 ]
Заголовок сообщения:  Re: IUP - Portable User Interface

Вышел очередной релиз с поддержкой UTF8
Цитата:
Hi All,
The 3.9 version of the IUP library has been released.
You can find the list of changes and files for download at:
http://www.tecgraf.puc-rio.br/iup/
We would like to highlight some of the improvements:
New: IupProgressDlg pre-defined dialog.
New: support for UTF-8 strings in the Windows and GTK driver using the UTF8MODE global attribute.
New: TYPEL:C attribute and TYPE_CB callback in IupMatrix that allow to display a color, a progress bar, and an image in a cell.
New: TOGGLEVALUE attribute and TOGGLEVALUE_CB callback in IupMatrix to enable a toggle button inside a cell.
New: control IupMatrixList that shows a list using an IupMatrix.
New: IupMatrixEx library with an extension package for IupMatrix.
New: IupSetLanguagePack, IupGetLanguageString and IupSetLanguageString functions to help in application Internationalization. Strings starting in "_@" will be automatically retrieved from the internal string database.
New: PLOT_COUNT, PLOT_NUMCOL, PLOT_CURRENT, PLOT_INSERT and PLOT_REMOVE attributes for IupPPlot to support multiple plots in the same display area.
Best Regards,
Antonio Scuri

http://sourceforge.net/p/iup/news/2013/ ... -released/

В разделе Сontributions на офсайте появилась информация о бинде к CP со ссылкой на сайт центра.
Цитата:
Component Pascal binding for IUP and CD, part of the BlackBox Framework.

Автор:  ilovb [ Воскресенье, 04 Май, 2014 23:10 ]
Заголовок сообщения:  Re: IUP - Portable User Interface

В следующей версии IUP 3.11 появится возможность подключать внешние лексеры для scintilla. Собсна воспользоваться можно уже сейчас (если скачать и собрать текущий tarball).

Осталось написать лексер для CP. Как это делается я уже разобрался и даже собрал по мануалу внешний лексер для python. Все просто. Нужно только преодолеть отвращение к мерзким плюсам :)

Автор:  Александр Ильин [ Понедельник, 05 Май, 2014 04:52 ]
Заголовок сообщения:  Re: IUP - Portable User Interface

ilovb писал(а):
Все просто. Нужно только преодолеть отвращение к мерзким плюсам :)

viewtopic.php?f=30&t=2205

Автор:  ilovb [ Понедельник, 05 Май, 2014 11:00 ]
Заголовок сообщения:  Re: IUP - Portable User Interface

Александр, я попробовал, но подключить не удалось. И я даже знаю в чем причина. В scintilla немного изменилась технология изготовления внешних лексеров: http://www.scintilla.org/nulex.html
Теперь нужно все заворачивать в класс и в интерфейс лексера вытаскивать фабричную функцию: http://www.scintilla.org/LexPython.cxx.html

Интерфейс теперь такой:
GetLexerCount
GetLexerName
GetLexerFactory

Возможно ли такое провернуть с твоим лексером?

Автор:  Александр Ильин [ Понедельник, 05 Май, 2014 11:17 ]
Заголовок сообщения:  Re: IUP - Portable User Interface

ilovb писал(а):
GetLexerCount
GetLexerName
GetLexerFactory

Возможно ли такое провернуть с твоим лексером?

GetLexerCount - вернуть 1.
GetLexerName - вернуть "Oberon-2" или что-нибудь подобное.
GetLexerFactory - вернуть указатель на ILexer. По сути дела, интерфейс - это массив указателей на функции, расположенных в порядке их перечисления в исходном тексте описания интерфейса. См. также тут: http://sourceforge.net/apps/mediawiki/n ... _interface

Автор:  ilovb [ Понедельник, 05 Май, 2014 11:35 ]
Заголовок сообщения:  Re: IUP - Portable User Interface

У меня вопрос в другом.
Как реализовать в твоем лексере GetLexerFactory?
Что такое ILexer?

Достаточно ли описать класс в терминах Oberon 2 и вернуть POINTER?
Я просто не шарю как можно стыковаться с плюсами.

Автор:  Александр Ильин [ Понедельник, 05 Май, 2014 13:59 ]
Заголовок сообщения:  Re: IUP - Portable User Interface

ilovb писал(а):
У меня вопрос в другом.
Как реализовать в твоем лексере GetLexerFactory?
Что такое ILexer?

Достаточно ли описать класс в терминах Oberon 2 и вернуть POINTER?
Я просто не шарю как можно стыковаться с плюсами.

ILexer - это массив указателей на функции, см. здесь.

Код:
TYPE ILexer = ARRAY 11 OF SYSTEM.ADRESS;
VAR iLexer: ILexer;

PROCEDURE ['StdCall'] ILexerVersion(): LONGINT;
BEGIN
   RETURN 1
END ILexerVersion;

PROCEDURE ['StdCall'] GetLexerFactory(): SYSTEM.ADDRESS;
BEGIN
   iLexer[0] := SYSTEM.ADR(ILexerVersion);
   ...
   RETURN SYSTEM.ADR(iLexer)
END GetLexerFactory;


Я попробую сегодня сделать, хорошо? Я не уверен насчёт 'StdCall', скорее всего надо будет сделать 'C'. Кроме того, возможно придётся поколдовать над скрытым instance-параметром, т.е. объявить его явно, ведь в C++ нет интерфейсов, есть только классы.

Автор:  ilovb [ Понедельник, 05 Май, 2014 14:19 ]
Заголовок сообщения:  Re: IUP - Portable User Interface

Действительно там ниже написано:
Цитата:
If you are not using C++ to develop the lexer, you need to manufacture an ILexer object the address is to be returned by the various fatory functions. However, this is easy enough:
1. Define an array of pointers, containing the addresses of the functions listed in the section above. They must appear in the array in exactly the same order as they do in the interface description.
2. Define a variable of a pointer type, and set it to the address of the array just created. This variable is the ILexer object.

До меня сразу не доперло при чем тут какой-то массив... :oops: (А это с любыми плюсовыми объектами так? Получается что там просто шмат памяти где в порядке объявления идут поля и указатели на функции... типа обычный RECORD?)

Цитата:
Я попробую сегодня сделать, хорошо?

Было бы здорово.

Автор:  Александр Ильин [ Вторник, 06 Май, 2014 21:02 ]
Заголовок сообщения:  Re: IUP - Portable User Interface

Александр Ильин писал(а):
Я попробую сегодня сделать...
Пока что не взлетело. Работаю.

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