OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 17 Август, 2019 13:34

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 34 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: IUP - Portable User Interface
СообщениеДобавлено: Понедельник, 20 Май, 2013 15:46 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Решил выделить отдельную тему.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IUP - Portable User Interface
СообщениеДобавлено: Вторник, 21 Май, 2013 09:13 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Поддержки внешних лексеров в контроле IupScintilla пока тоже нет. Появится скорее всего в следующем релизе.
Но, конечно, можно слинковать статически.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IUP - Portable User Interface
СообщениеДобавлено: Среда, 22 Май, 2013 21:35 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Первый пример с использованием 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 МБ]
Скачиваний: 255
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IUP - Portable User Interface
СообщениеДобавлено: Среда, 22 Май, 2013 23:41 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Пришло письмо от разработчика:
Цитата:
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");


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IUP - Portable User Interface
СообщениеДобавлено: Пятница, 24 Май, 2013 14:58 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Доделал бинды к IUP и CD для CP:
https://code.google.com/p/cp-iup/
https://code.google.com/p/cp-cd/

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IUP - Portable User Interface
СообщениеДобавлено: Воскресенье, 26 Май, 2013 23:34 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Сделал первую версию бинда к 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 МБ]
Скачиваний: 136
IUP383.txt [59.93 КБ]
Скачиваний: 270
IM000.txt [53.8 КБ]
Скачиваний: 263
CD560.txt [44.44 КБ]
Скачиваний: 263
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IUP - Portable User Interface
СообщениеДобавлено: Вторник, 28 Май, 2013 19:42 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Собрал в VS комплексный тест из исходников Canvas Draw.
Это такая небольшая демонстрация возможностей библиотеки. Писано на Си.

Изображение

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


Вложения:
simple.zip [2.41 МБ]
Скачиваний: 133
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IUP - Portable User Interface
СообщениеДобавлено: Среда, 29 Май, 2013 22:49 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Пример четыре в одном :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 ~


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IUP - Portable User Interface
СообщениеДобавлено: Пятница, 31 Май, 2013 22:31 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9128
Откуда: Россия, Орёл
Хотя меня гуи не интересуют прямо сейчас...

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IUP - Portable User Interface
СообщениеДобавлено: Пятница, 31 Май, 2013 22:53 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Спасибо :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IUP - Portable User Interface
СообщениеДобавлено: Суббота, 17 Август, 2013 14:33 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Пришло письмо от разработчика:
Цитата:
Hi,
Don't improved Scintilla, but support for UTF-8 is ready on CVS.
Best,
Scuri


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IUP - Portable User Interface
СообщениеДобавлено: Пятница, 29 Ноябрь, 2013 16:08 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Вышел очередной релиз с поддержкой 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.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IUP - Portable User Interface
СообщениеДобавлено: Воскресенье, 04 Май, 2014 23:10 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
В следующей версии IUP 3.11 появится возможность подключать внешние лексеры для scintilla. Собсна воспользоваться можно уже сейчас (если скачать и собрать текущий tarball).

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IUP - Portable User Interface
СообщениеДобавлено: Понедельник, 05 Май, 2014 04:52 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2309
Откуда: Россия, Томск
ilovb писал(а):
Все просто. Нужно только преодолеть отвращение к мерзким плюсам :)

viewtopic.php?f=30&t=2205


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IUP - Portable User Interface
СообщениеДобавлено: Понедельник, 05 Май, 2014 11:00 

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IUP - Portable User Interface
СообщениеДобавлено: Понедельник, 05 Май, 2014 11:17 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2309
Откуда: Россия, Томск
ilovb писал(а):
GetLexerCount
GetLexerName
GetLexerFactory

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IUP - Portable User Interface
СообщениеДобавлено: Понедельник, 05 Май, 2014 11:35 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
У меня вопрос в другом.
Как реализовать в твоем лексере GetLexerFactory?
Что такое ILexer?

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IUP - Portable User Interface
СообщениеДобавлено: Понедельник, 05 Май, 2014 13:59 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2309
Откуда: Россия, Томск
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++ нет интерфейсов, есть только классы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IUP - Portable User Interface
СообщениеДобавлено: Понедельник, 05 Май, 2014 14:19 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Действительно там ниже написано:
Цитата:
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?)

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IUP - Portable User Interface
СообщениеДобавлено: Вторник, 06 Май, 2014 21:02 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2309
Откуда: Россия, Томск
Александр Ильин писал(а):
Я попробую сегодня сделать...
Пока что не взлетело. Работаю.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 34 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB