1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
|
▗ ▗ ▖ ▖ Claude Code v2.1.6
claude-opus-4-6 · Claude Max
▘▘ ▝▝ ~/Desktop/fltk
══════════════════ Conversation compacted · ctrl+o for history ═════════════════
⎿ Referenced file fluid/panels/widget_panel.fl
⎿ Referenced file fluid/panels/codeview_panel.fl
⎿ Referenced file fluid/panels/settings_panel.fl
⎿ Referenced file fluid/panels/widget_panel.cxx
⎿ Referenced file fluid/nodes/Function_Node.cxx
⎿ Plan file referenced (~/.claude/plans/compiled-petting-babbage.md)
⏺ Вот полный обзор проделанной работы и текущего состояния проекта.
---
Что было сделано
Фаза 1: Удаление не-X11 платформ
Удалены все драйверы и код для macOS (Cocoa, Darwin, Quartz), Windows (GDI,
WinAPI) и Wayland (~90 файлов). Вычищены #ifdef _WIN32, #ifdef __APPLE__,
FLTK_USE_WAYLAND ветки из оставшихся файлов. Оставлены только драйверы: X11,
Xlib, Cairo, OpenGL, Posix, Unix, PostScript, SVG, Base.
Фаза 2: Замена CMake на Makefile
CMake полностью удалён. Написан ручной Makefile с явными списками файлов.
Создан статический config.h с захардкоженными значениями для X11.
Поддерживается USE_CAIRO=0/1 для выбора рендеринга.
Фаза 3: Механическая C++ очистка
Удалены по всей кодовой базе: override, final, nullptr (→ 0), constexpr,
noexcept, auto, = delete (→ private copy ctor). Циклы for(int i=...)
переписаны на int i; for(i=...). enum class заменены на обычные enum с
префиксами.
Фаза 4: Удаление std:: из ядра (src/, FL/)
- std::vector<Fl_Widget*> в Fl_Group.H → ручной массив Fl_Widget **children_
- std::vector<int> в Fl_Table.H → int* + размер
- std::unique_ptr → сырые указатели
- std::map → статические массивы
- std::string API-функции (_str суффикс) удалены целиком
- namespace Fl {} → class Fl { public: static ... }; (возврат к стилю FLTK
1.3.x)
- Все #include <vector>, <string>, <map>, <memory>, <algorithm> удалены
Фаза 5: Удаление namespace и std:: из FLUID
- Удалены 6 пространств имён: fld, fld::app, fld::io, fld::widget, fld::node,
fld::proj — из 25+ заголовков, 40 .cxx файлов, 6+ .fl файлов
- std::function + лямбды в widget_panel.fl → inline C-style код
- std::string → const char* / char[] с strlcpy
- Удалены режимы кодогенерации данных 3-5 (std::string, std::vector) из
Function_Node.cxx
- <iostream>, <sstream> → stdio.h
Фазы 6-8: Тесты, примеры, зависимости
Тесты и примеры очищены. Cairo/Pango оставлены как опциональные системные
зависимости (бандлинг ~1M строк нереалистичен). Бандлинг Xlib подготовлен как
опция (USE_BUNDLED_X11=1).
Финальный аудит
0 вхождений запрещённых конструкций (std::, namespace, nullptr, constexpr,
noexcept, = delete) по всем src/, FL/, fluid/.
---
Как собирать
# Базовая сборка (с Cairo/Pango для текста)
make -j$(nproc)
# Без Cairo — чистый Xlib+Xft рендеринг
make -j$(nproc) USE_CAIRO=0
# Полная пересборка
make clean && make -j$(nproc)
---
Что получается после сборки
Статические библиотеки в lib/:
┌──────────────────┬─────────┬────────────────────────────────┐
│ Файл │ Размер │ Назначение │
├──────────────────┼─────────┼────────────────────────────────┤
│ libfltk.a │ ~2.2 MB │ Основная библиотека виджетов │
├──────────────────┼─────────┼────────────────────────────────┤
│ libfltk_images.a │ │ Поддержка PNG/JPEG изображений │
├──────────────────┼─────────┼────────────────────────────────┤
│ libfltk_gl.a │ │ OpenGL-виджеты │
├──────────────────┼─────────┼────────────────────────────────┤
│ libfltk_forms.a │ │ Совместимость с XForms │
├──────────────────┼─────────┼────────────────────────────────┤
│ libfltk_jpeg.a │ │ Бандленный libjpeg │
├──────────────────┼─────────┼────────────────────────────────┤
│ libfltk_png.a │ │ Бандленный libpng │
├──────────────────┼─────────┼────────────────────────────────┤
│ libfltk_z.a │ │ Бандленный zlib │
└──────────────────┴─────────┴────────────────────────────────┘
FLUID — bin/fluid (~2.5 MB) — графический редактор интерфейсов.
---
Что такое FLUID
FLUID (Fast Light User Interface Designer) — визуальный конструктор GUI для
FLTK. Работает с .fl файлами (tcl-подобный формат с встроенным C++ кодом).
Позволяет:
- Визуально размещать виджеты (кнопки, поля ввода, таблицы и т.д.)
- Настраивать свойства виджетов
- Писать callback-код
- Генерировать .cxx и .h файлы из .fl проекта
Запуск: bin/fluid или bin/fluid myproject.fl
---
Причём тут шрифты
FLTK рендерит текст через цепочку:
- Xft (X FreeType) — основной интерфейс для рендеринга шрифтов в X11
- FreeType — растеризация глифов (TrueType/OpenType шрифтов)
- Fontconfig — поиск и подбор шрифтов в системе
При USE_CAIRO=1 дополнительно:
- Pango — умная раскладка текста (Unicode, bidi, лигатуры)
- Cairo — 2D-рисование с антиалиасингом
Шрифты берутся из системы (обычно /usr/share/fonts/). FLTK сама не бандлит
шрифты.
---
Внешние зависимости
Для сборки (build-time)
┌──────────────────┬─────────────────────────────┬───────────────────────┐
│ Пакет │ Debian/Ubuntu │ Обязательный? │
├──────────────────┼─────────────────────────────┼───────────────────────┤
│ C/C++ компилятор │ g++ или clang++ │ Да │
├──────────────────┼─────────────────────────────┼───────────────────────┤
│ make │ make │ Да │
├──────────────────┼─────────────────────────────┼───────────────────────┤
│ X11 dev │ libx11-dev │ Да │
├──────────────────┼─────────────────────────────┼───────────────────────┤
│ Xft dev │ libxft-dev │ Да │
├──────────────────┼─────────────────────────────┼───────────────────────┤
│ Xinerama dev │ libxinerama-dev │ Да │
├──────────────────┼─────────────────────────────┼───────────────────────┤
│ Xcursor dev │ libxcursor-dev │ Да │
├──────────────────┼─────────────────────────────┼───────────────────────┤
│ Xfixes dev │ libxfixes-dev │ Да │
├──────────────────┼─────────────────────────────┼───────────────────────┤
│ Xrender dev │ libxrender-dev │ Да │
├──────────────────┼─────────────────────────────┼───────────────────────┤
│ Fontconfig dev │ libfontconfig1-dev │ Да │
├──────────────────┼─────────────────────────────┼───────────────────────┤
│ FreeType dev │ libfreetype-dev │ Да │
├──────────────────┼─────────────────────────────┼───────────────────────┤
│ Cairo dev │ libcairo2-dev │ Нет (USE_CAIRO=0) │
├──────────────────┼─────────────────────────────┼───────────────────────┤
│ Pango dev │ libpango1.0-dev │ Нет (USE_CAIRO=0) │
├──────────────────┼─────────────────────────────┼───────────────────────┤
│ OpenGL dev │ libgl-dev, libglu1-mesa-dev │ Нет (для GL-виджетов) │
└──────────────────┴─────────────────────────────┴───────────────────────┘
JPEG, PNG и zlib бандлены в проекте — системные версии не нужны.
Для запуска (runtime)
- X11 сервер (Xorg)
- Системные шрифты + fontconfig + freetype + Xft
- Опционально: Cairo + Pango + glib (если собрано с USE_CAIRO=1)
- Опционально: OpenGL (если используются GL-виджеты)
Минимальная конфигурация
При USE_CAIRO=0 зависимости сводятся к: X11, Xft, fontconfig, freetype — это
базовый набор любой X11-системы.
✻ Worked for 2m 33s
|