Forth
http://fforum.winglion.ru/

Forth++
http://fforum.winglion.ru/viewtopic.php?f=4&t=2674
Страница 7 из 8

Автор:  oco [ Вт сен 10, 2013 17:33 ]
Заголовок сообщения:  Re: Forth++

Разбирался недавно со связкой Forth + GTK. В принципе, все просто, никакой мороки с объектами, как в Qt.
1. Понадобится GLADE - построитель интерфейса
2. В проекте подключаете GTK:
Код:
USE libgtk-3.so.0

3. Инициализируете билдер
Код:
   (()) gtk_builder_new TO builder
    (( builder z" glade-test.glade" 0  )) gtk_builder_add_from_file DROP

4. Берете главное окно
Код:
(( builder z" demoWindow"     )) gtk_builder_get_object TO window

5. Запускаете все
Код:
    (( window )) gtk_widget_show DROP
    (()) gtk_main DROP

6. Подключение сигналов
- сначала опишем CALLBACK:
Код:
:NONAME ( user_data widget -- n1 n2 n3 )
    2DUP \ must leave parameters on stack
    CR ." Close callback! Caller: "
    1 <( )) gtk_buildable_get_name ZTYPE CR
    (()) gtk_main_quit DROP
    DROP 0 \ return value (even for void!)
; 2 CELLS CALLBACK: closeEvent

Напомню, процедура должна оставить все параметры на стеке и еще положить один - возвращаемый (даже если возвращает void)
- подключаем сигнал:
Код:
window z" destroy"  ['] closeEvent 0 g_signal_connect DROP

7. Подводные камни, которые я обнаружил:
- С-функция, которая возвращает число с плавающей точкой (gdouble), ложит его на стек сопроцессора
- Но передавать такое число из форта нужно со стека данных:
Код:
FLOAT>DATA

8. Написал небольшую прослойку для интернационализации приложений на основе GNU gettext.
- строки для перевода отмечаются словами gettext(" и ngettext(", файлы .glade распознаются автоматически
- исходники обрабаытваются скриптом i18n (см.файлы проекта)
- .po-файлы можно переводить
- запускается скрипт еще раз, после этого приложение будет уже переведено
- не забываем в начале
Код:
    (( z" glade-test" z" ./po/translations" )) bindtextdomain DROP
    (( z" glade-test" )) textdomain DROP
    (( LC_ALL z" " )) setlocale DROP


Немного сумбурно изложил, на вопросы отвечу.
Проект

Автор:  mgw [ Вт сен 10, 2013 18:36 ]
Заголовок сообщения:  Re: Forth++

Интересно! Насчет сигналов немного не понятно. Параметры в CALLBACK как передаются? В описании самого сигнала, перечисление параметров ни как не участвует, правильно? Фактически фигурирует только символьное имя сигнала, а передача параметров на совести передающей и принимающей функции, так?

Автор:  KPG [ Вт сен 10, 2013 19:36 ]
Заголовок сообщения:  Re: Forth++

В проекте FFL (Forth Foundation Library) есть вывод графики (мандельброт) средствами GTK
http://ffl.googlecode.com/svn/wiki/mandelbrot.png

Автор:  oco [ Вт сен 10, 2013 19:53 ]
Заголовок сообщения:  Re: Forth++

mgw писал(а):
Интересно! Насчет сигналов немного не понятно. Параметры в CALLBACK как передаются? В описании самого сигнала, перечисление параметров ни как не участвует, правильно? Фактически фигурирует только символьное имя сигнала, а передача параметров на совести передающей и принимающей функции, так?

Все описано здесь.
Подключение сигнала:
Код:
gulong g_signal_connect( gpointer      *object,
                         const gchar   *name,
                         GCallback     func,
                         gpointer      func_data );

object - наш виджет
name - имя сигнала
func - функция, которая обрабатывает сигнал
func_data - данные, которые пойдут в эту функцию

Обработчик сигнала:
Код:
void callback_func( GtkWidget *widget,
                    ... /* другие аргументы - нужно смотреть документацию по конкретному сигналу */
                    gpointer   callback_data );

widget - наш виджет
callback_data - указатель на данные, который мы передали при привязке сигнала (func_data)

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

Автор:  oco [ Ср сен 11, 2013 01:29 ]
Заголовок сообщения:  Re: Forth++

KPG писал(а):
В проекте FFL (Forth Foundation Library) есть вывод графики (мандельброт) средствами GTK
http://ffl.googlecode.com/svn/wiki/mandelbrot.png

Они используют GTK-server, что есть костыль.

Автор:  Mihail [ Ср сен 11, 2013 15:51 ]
Заголовок сообщения:  Re: Forth++

Под Ubuntu/32
Переписал содержимое spf-gtk.tar.gz в ~/work/spf-4.20
запустил
Код:
mihail@mihail-desktop:~/work/spf-4.20$ ./spf4 glade-test.spf
F. isn't unique (glade-test.spf)
>FNUM isn't unique (glade-test.spf)

(spf4:6557): Gtk-WARNING **: Unknown property: GtkVolumeButton.always-show-image

(spf4:6557): Gtk-CRITICAL **: gtk_accel_label_set_accel_closure: assertion `gtk_accel_group_from_accel_closure (accel_closure) != NULL' failed

(spf4:6557): Gtk-CRITICAL **: gtk_accel_label_set_accel_closure: assertion `gtk_accel_group_from_accel_closure (accel_closure) != NULL' failed

(spf4:6557): Gtk-CRITICAL **: gtk_accel_label_set_accel_closure: assertion `gtk_accel_group_from_accel_closure (accel_closure) != NULL' failed

(spf4:6557): Gtk-CRITICAL **: gtk_accel_label_set_accel_closure: assertion `gtk_accel_group_from_accel_closure (accel_closure) != NULL' failed
EXCEPTION!  CODE:00000008  ADDRESS:B76F3209  WORD:<?not found>
USER DATA: 091DB618 THREAD ID: B751D6C0 HANDLER: 40690000
[Floating point exception] Code:Segmentation fault (core dumped)


Чего я не сделал? Или не так сделал?

Автор:  Ilya [ Ср сен 11, 2013 23:04 ]
Заголовок сообщения:  Re: Forth++

А у меня вроде работает, но окно "Тест Adjusmenтов" глючноватое! После его закрытия и попытки вызвать любой другой пункт меню валит основное окно: "Ошибка сегментирования (core dumped)".

Автор:  oco [ Чт сен 12, 2013 01:56 ]
Заголовок сообщения:  Re: Forth++

Mihail писал(а):
Под Ubuntu/32
Переписал содержимое spf-gtk.tar.gz в ~/work/spf-4.20
запустил
...
[Floating point exception] Code:Segmentation fault (core dumped)
...
Чего я не сделал? Или не так сделал?

Что-то с плавающей точкой...
СПФ стандартный?
Какая версия GTK?

Автор:  oco [ Чт сен 12, 2013 01:57 ]
Заголовок сообщения:  Re: Forth++

Ilya писал(а):
А у меня вроде работает, но окно "Тест Adjusmenтов" глючноватое! После его закрытия и попытки вызвать любой другой пункт меню валит основное окно: "Ошибка сегментирования (core dumped)".

Это кнопка Gtk Volume Button глючная, если ее не трогать, должно быть все ОК

Автор:  Mihail [ Чт сен 12, 2013 10:46 ]
Заголовок сообщения:  Re: Forth++

oco писал(а):
СПФ стандартный?

Свежескаченный http://downloads.sourceforge.net/spf/spf-4.20.tar.gz

oco писал(а):
Какая версия GTK?

Думаю, при не той версии, аборт возник-бы на строчке
USE libgtk-3.so.0

Автор:  oco [ Чт сен 12, 2013 11:42 ]
Заголовок сообщения:  Re: Forth++

Mihail писал(а):
oco писал(а):
СПФ стандартный?

Свежескаченный http://downloads.sourceforge.net/spf/spf-4.20.tar.gz

Скачал и попробовал, у меня ОК

Mihail писал(а):
oco писал(а):
Какая версия GTK?

Думаю, при не той версии, аборт возник-бы на строчке
USE libgtk-3.so.0


Код:
dpkg-query -l libgtk-3\*

Что выдает?
У меня 3.6.4-0ubuntu8

Автор:  mgw [ Чт сен 12, 2013 13:19 ]
Заголовок сообщения:  Re: Forth++

У меня работает. Fedora-18 (32) Сама программа работает устойчиво. Завершается правильно.
При запуске есть ошибки:
Код:
(spf4:2469): Gtk-CRITICAL **: gtk_accel_label_set_accel_closure: assertion `gtk_accel_group_from_accel_closure (accel_closure) != NULL' failed
(spf4:2469): Gtk-CRITICAL **: gtk_accel_label_set_accel_closure: assertion `gtk_accel_group_from_accel_closure (accel_closure) != NULL' failed
(spf4:2469): Gtk-CRITICAL **: gtk_accel_label_set_accel_closure: assertion `gtk_accel_group_from_accel_closure (accel_closure) != NULL' failed
(spf4:2469): Gtk-CRITICAL **: gtk_accel_label_set_accel_closure: assertion `gtk_accel_group_from_accel_closure (accel_closure) != NULL' failed
GLib-GIO-Message: Using the 'memory' GSettings backend.  Your settings will not be saved or shared with other applications.
5 файлов скопировано

(spf4:2469): Gtk-CRITICAL **: gtk_widget_get_toplevel: assertion `GTK_IS_WIDGET (widget)' failed
(spf4:2469): Gtk-CRITICAL **: gtk_widget_get_toplevel: assertion `GTK_IS_WIDGET (widget)' failed
(spf4:2469): Gtk-CRITICAL **: gtk_widget_get_toplevel: assertion `GTK_IS_WIDGET (widget)' failed
(spf4:2469): Gtk-CRITICAL **: gtk_widget_get_toplevel: assertion `GTK_IS_WIDGET (widget)' failed
(spf4:2469): Gtk-CRITICAL **: gtk_widget_get_toplevel: assertion `GTK_IS_WIDGET (widget)' failed
(spf4:2469): Gtk-CRITICAL **: gtk_widget_get_toplevel: assertion `GTK_IS_WIDGET (widget)' failed

Думаю, это разница в версиях gtk
У меня 3.6.2-1

:) Отлично! Форту нужен графический интерфейс, а ещё лучше IDE

P.S. Посмотрел сайт http://oco.org.ua Приятное впечатление и мысли ценные!

Автор:  mgw [ Чт сен 12, 2013 13:25 ]
Заголовок сообщения:  Re: Forth++

Обновил gtk3 до версии 3.6.4-2
Ошибки всё равно есть.

Автор:  VoidVolker [ Чт сен 12, 2013 14:10 ]
Заголовок сообщения:  Re: Forth++

Кстати, GTK используется и в VFX-форте - возможно, имеет смысл присмотреться к нему.

Автор:  oco [ Чт сен 12, 2013 17:40 ]
Заголовок сообщения:  Re: Forth++

Код:
(spf4:2469): Gtk-CRITICAL **: gtk_accel_label_set_accel_closure: assertion `gtk_accel_group_from_accel_closure (accel_closure) != NULL' failed

Насколько я знаю, это баг GTK, у меня тоже такая ошибка
Код:
GLib-GIO-Message: Using the 'memory' GSettings backend.  Your settings will not be saved or shared with other applications.
(spf4:2469): Gtk-CRITICAL **: gtk_widget_get_toplevel: assertion `GTK_IS_WIDGET (widget)' failed

Тут ничего не могу сказать :(
assertion `GTK_IS_WIDGET (widget)' failed значит, что в какую-то функцию, которая хочет виджет, передается не виджет
mgw писал(а):
:) Отлично! Форту нужен графический интерфейс, а ещё лучше IDE

Я использую Geany, недавно дорабатывал в нем подсветку синтаксиса
mgw писал(а):
P.S. Посмотрел сайт http://oco.org.ua Приятное впечатление и мысли ценные!

Спасибо!

Страница 7 из 8 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/