Разбирался недавно со связкой Forth + GTK. В принципе, все просто, никакой мороки с объектами, как в Qt.

    1. Понадобится GLADE — построитель интерфейса
    2. В проекте подключаете GTK:
      1
      USE libgtk-3.so.0
    3. Инициализируете билдер
      1
      2
      (()) gtk_builder_new TO builder
      (( builder z" glade-test.glade" 0 )) gtk_builder_add_from_file DROP
    4. Берете главное окно
      1
      (( builder z" demoWindow"     )) gtk_builder_get_object TO window
    5. Запускаете все
      1
      2
      (( window )) gtk_widget_show DROP
      (()) gtk_main DROP
    6. Подключение сигналов
      • сначала опишем CALLBACK:
        1
        2
        3
        4
        5
        6
        7
        :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)
      • подключаем сигнал:
        1
        window z" destroy" ['] closeEvent 0 g_signal_connect DROP
    7. Подводные камни, которые я обнаружил:
      • С-функция, которая возвращает число с плавающей точкой (gdouble), ложит его на стек сопроцессора
      • Но передавать такое число из форта нужно со стека данных:
        1
        FLOAT>DATA
    8. Написал небольшую прослойку для интернационализации приложений на основе GNU gettext.
      • строки для перевода отмечаются словами gettext(« и ngettext(«, файлы .glade распознаются автоматически
      • исходники обрабаытваются скриптом i18n (см.файлы проекта)
      • .po-файлы можно переводить
      • запускается скрипт еще раз, после этого приложение будет уже переведено
      • не забываем в начале
        1
        2
        3
        (( z" glade-test" z" ./po/translations" )) bindtextdomain DROP
        (( z" glade-test" )) textdomain DROP
        (( LC_ALL z" " )) setlocale DROP

Файлы проекта находятся здесь

Страница просмотрена 2285 раз(а)