summaryrefslogtreecommitdiff
path: root/project/templates/fltkada.xhtml
blob: 51b808e56ae2db181655ef8334e69475453face3 (plain)
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

{%- extends "base_plain.xhtml" -%}



{%- block title -%}FLTK Ada{%- endblock -%}



{%- block footer -%}{{ plain_footer ("fltkada.xhtml") }}{%- endblock -%}



{%- block content %}
<h4>FLTK Ada Binding</h4>

<p>Git repository: <a href="/cgi-bin/cgit.cgi/fltkada">Link</a><br />
Estimated status: 80% complete</p>


<h5>16/12/2022</h5>

<p>Another year, another lot of bugfixes. Well actually the timing is pure coincidence, but it
sounds kinda nice when I put it that way.</p>

<ul>
  <li>The Get_Value functions for Float_Input and Integer_Input widgets now won't crash if the
  widget contains an empty string.</li>
  <li>Menu widgets have had their internals reworked to properly take into account the extra
  Menu_Item generated by adding a submenu to the widget.</li>
  <li>Popup and Pulldown subprograms in Menu widgets now return an Index value instead of a
  reference to a Menu_Item. This allows them to return a "Not Found" value without using any
  exceptions.</li>
  <li>Key bindings in Text_Editor widgets now bind properly again.</li>
  <li>Selection related subprograms for Text_Buffers now ensure that out mode parameters keep their
  values in bounds.</li>
</ul>

<p>The most vexing thing about all this is that some of the above fixes were needed due to my own
oversights, and some were needed due to FLTK changing in subtle ways in the few point releases it
has had since I made this binding. And I cannot tell which is which.</p>


<h5>9/11/2021</h5>

<p>A few noteworthy bugfixes have been applied to the binding.</p>

<p>First, unbeknownst to me the Fl_Widget constructor doesn't copy the given label string inside
FLTK and merely stores a pointer. This meant that declaring several Widgets in a row each with their
own different label could have unexpected and erratic results. Easily fixed by ensuring the binding
constructor also calls copy_label() afterwards.</p>

<p>And second, somehow I had made an oversight with the type assigned to Color, using a signed
Integer when it really needed an unsigned modular type with 32 bits of range. Again, easily fixed
but even more annoying since it was my fault to begin with.</p>

<p>I'm sure the other guy aside from me who takes an interest in this binding will be happy about
these. You know who you are.</p>


<h5>21/5/2018</h5>

<p>This binding is now complete enough for most purposes. It certainly took more effort than
expected, in part due to underestimation of how much needed binding. The vast majority of useful
classes are now usable in Ada, with a few exceptions such as the Fl_Browser, Fl_Help_View, Fl_Table,
and Fl_Tree widgets.</p>

<p>Noteworthy features and modifications include:</p>
<ul>
  <li>Constructors are not primitive operations and are not inherited</li>
  <li>Additional types have been defined and used to clean up the API</li>
  <li>No heap allocation/deallocation necessary</li>
  <li>Ada 2012 iterators are implemented for Group and Menu widgets</li>
  <li>The API for Menu and Menu_Item has been rearranged to better reflect a container/item
  dichotomy</li>
  <li>The Draw and Handle widget methods are easily overridable</li>
  <li>Static methods from the base Fl.H header have been split up into multiple packages</li>
  <li>Automatic addition of widgets to a Group with fl_group_begin and fl_group_end is not
  supported</li>
</ul>

<p>A mapping of what C++ headers and methods correspond to what Ada packages, functions, and
procedures is included. Also, the below "Hello world" code sample has been modified to work with the
updated binding.</p>


<h5>25/6/2017</h5>

<p>FLTK, or by its full name the <a href="http://www.fltk.org/" class="external">Fast Light Toolkit
</a>, is a graphical widget toolkit noteworthy for being so lightweight that it is commonly
statically linked. Projects that make use of it include the <a href="http://www.dillo.org/"
class="external">Dillo</a> web browser, the <a href="http://flwm.sourceforge.net/" class="external">
FLWM</a> X window manager, and the <a href="http://www.equinox-project.org/" class="external">
Equinox Desktop Environment</a>. There are bindings for it in several languages, including Python,
Perl and Ruby, but not Ada. Until now!</p>

<p>This is a spinoff from Adapad, and so despite not yet being complete it can be at least
guaranteed to be enough to write a text editor. It's a thick, loosely coupled binding, accomplished
by first exporting the interface to C, then importing that to Ada. Attempted usage of the internal C
interface as a binding on its own is not supported.</p>

<p>A typical FLTK Hello World program in Ada:</p>
<div class="precontain">
<code>
with
    FLTK.Widgets.Groups.Windows,
    FLTK.Widgets.Boxes;

function Hello_World return Integer is

    My_Win : FLTK.Widgets.Groups.Windows.Window :=
        FLTK.Widgets.Groups.Windows.Forge.Create (100, 100, 200, 200, "Untitled");

    My_Box : FLTK.Widgets.Boxes.Box :=
        FLTK.Widgets.Boxes.Forge.Create (50, 50, 100, 100, "Hello, World!");

begin

    My_Win.Add (My_Box);
    My_Win.Show;

    return FLTK.Run;

end Hello_World;
</code>
</div>

<p>Aside from reworking the types to better fit the strongly typed philosophy of Ada, the entire
library has been structured to avoid explicit heap usage. As you can see from the above example, the
intended use is to declare FLTK objects on the stack. Allocation and deallocation of the C++
internals is handled automatically.</p>

<p>A few other minor changes were involved, such as requiring widgets to be explicitly added to a
group rather than implicitly being added to the last group not yet ended. At the moment the package
specifications should provide sufficient information to allow programmers to work with the library.
</p>
{% endblock -%}