Re: Some rookie questions about GUI

T J <[email protected]> Mon, 15 Jul 2019 11:45:31 +0000
Newsgroups gmane.comp.fonts.fontforge.devel
Message-ID <SYAPR01MB3040833E55C8F7A0AADD0263C2CF0@SYAPR01MB3040.ausprd01.prod.outlook.com>
--===============1499409796628532336==
Content-Language: en-AU
Content-Type: multipart/alternative;
	boundary="_000_SYAPR01MB3040833E55C8F7A0AADD0263C2CF0SYAPR01MB3040ausp_"

--_000_SYAPR01MB3040833E55C8F7A0AADD0263C2CF0SYAPR01MB3040ausp_
Content-Type: text/plain; charset="Windows-1252"
Content-Transfer-Encoding: quoted-printable

Regarding your questions:

  1.  gdraw
  2.  Not really, no. Most of the time it=92s just inspecting code to figur=
e out what=92s going on. But if you have some understanding of how gui tool=
kits work, it=92s not too bad. The gist of it is:
gdraw exposes a public interface, which allows you to:
     *   Create toplevel and child windows
     *   Draw and render text to that window (usually using Pango and Cairo=
, unless you=92ve somehow managed to disable that, in which case it uses st=
raight X/Xlib calls)
     *   Receive events on that window (mouse/keyboard events, expose/rende=
r events, resize events etc)
There=92s then some indirection, because behind that interface may be one o=
f three implementations, an X backend (gxdraw), which works directly with X=
lib, a GDK backend (ggdkdraw), which uses GDK to create/manage windows, and=
 a Postscript backend (gpsdraw), which is mostly not functional.

From there, there=92s a somewhat functional, mostly broken toolkit of widge=
ts (ggadget/gwidget), which you can use, so you don=92t completely have to =
implement everything from scratch.

  1.  Painfully. But in brief, you set up some state and desired attributes=
, then either call GDrawCreateTopWindow (toplevel windows) or GDrawCreateSu=
bWindow (child windows). You then probably use some of the widgets from gwi=
dget/ggadget, which involves setting up a lot more state and some event han=
dlers.
  2.  When a window is constructed, it passes in an event handler, in the s=
ource you=92ll often find it called *_e_h, e.g. splash_e_h. This receives i=
nformation about things like mouse click/key events, expose (paint) events =
etc. When you use premade widgets, you can sometimes pass in a callback to =
one of those as well, which just builds on that aforementioned event handle=
r.

Jeremy


From: Thor Christopher<mailto:[email protected]>
Sent: Monday, 8 July 2019 10:45 PM
To: [email protected]<mailto:[email protected]=
ceforge.net>
Subject: [fontforge-devel] Some rookie questions about GUI

Hi, this might seem like some very basic stuff here, but I've been skimming=
 through the code just to get an overview on how FontForge is built and som=
e really basic stuff just seems difficult to discern from the code and docu=
mentation alone.

I think this project could learn a lot from InkScape when it comes to docum=
entation and code structure.

Anyway, the first thing I do when I try and understand code is to look for =
the GUI code so I can see how the UI fits with the functionality of the pro=
gram. For FontForge this has been rather difficult, all I could find about =
the GUI from the docs is this part from the FAQ:

 "Why doesn't it use the native MS Windows or Mac windowing system?
=B7         FontForge is not a commercial product and is not bound by the c=
onstraints of the market.
=B7         Doing that port doesn't interest me.
=B7         I don't have time nor do I have the skill to take that task on.
=B7         I'd like to encourage people to use Linux/unix

Of course, if I were to use either gtk or qt<https://fontforge.github.io/fa=
q.html#widget-set> some of the difficulties of porting would vanish. But un=
fortunately I don't like either of those widget sets.

Now... if you would like to do the port, that would be wonderful. I encoura=
ge you to do so.
 Why is FontForge based on a non-standard widget set? ..."

None of this information explains what this widget set is or how it draws i=
ts GUI, the only hint I've found is that it uses Cairo, somewhere in the co=
de it looks like it draws the GUI pixel by pixel, and there's a GDraw direc=
tory with some datatypes such as GWindow and GWidget that seem to be relate=
d to the UI, but trying to follow the function calls and see where it ends =
it's very difficult to get an idea on how the GUI code works.

Since I'm still confused about this, I think this is probably something a l=
ot of other people might have a problem understanding as well when they fir=
st start looking into the FontForge source code. I'd say it increases the l=
earning curve and reduces the possibility of more developers contributing t=
o this project.

Maybe you should have a more in depth overview on which libraries are used =
and how they work in the docs?

Some of my questions are:

1. What is the name of this non-standard widget set?
2. Is there any documentation for how it works?
3. How is a window created using this widget set?
4. Where do I find the event listeners? Is it a signal/slot pattern, or som=
ething else?
Hope I'm not spamming with too basic stuff here, but I've been trying to ge=
t into the code without any luck several times now, and I'm starting to thi=
nk this is something other people might want to know about as well.

 - Thor Arisland


--_000_SYAPR01MB3040833E55C8F7A0AADD0263C2CF0SYAPR01MB3040ausp_
Content-Type: text/html; charset="Windows-1252"
Content-Transfer-Encoding: quoted-printable

<html xmlns:o=3D"urn:schemas-microsoft-com:office:office" xmlns:w=3D"urn:sc=
hemas-microsoft-com:office:word" xmlns:m=3D"http://schemas.microsoft.com/of=
fice/2004/12/omml" xmlns=3D"http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3DWindows-1=
252">
<meta name=3D"Generator" content=3D"Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
	{font-family:Wingdings;
	panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
	{font-family:"Yu Gothic";
	panose-1:2 11 4 0 0 0 0 0 0 0;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
	{font-family:"\@Yu Gothic";
	panose-1:2 11 4 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0cm;
	margin-bottom:.0001pt;
	font-size:11.0pt;
	font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
	{mso-style-priority:99;
	color:blue;
	text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
	{mso-style-priority:99;
	color:#954F72;
	text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
	{mso-style-priority:34;
	margin-top:0cm;
	margin-right:0cm;
	margin-bottom:0cm;
	margin-left:36.0pt;
	margin-bottom:.0001pt;
	font-size:11.0pt;
	font-family:"Calibri",sans-serif;}
.MsoChpDefault
	{mso-style-type:export-only;}
@page WordSection1
	{size:612.0pt 792.0pt;
	margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
	{page:WordSection1;}
/* List Definitions */
@list l0
	{mso-list-id:160971631;
	mso-list-type:hybrid;
	mso-list-template-ids:2122881762 -1 134807577 134807579 134807567 13480757=
7 134807579 134807567 134807577 134807579;}
@list l0:level1
	{mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	font-family:"Times New Roman",serif;
	mso-ascii-font-family:Calibri;
	mso-fareast-font-family:"Yu Gothic";
	mso-hansi-font-family:Calibri;
	mso-bidi-font-family:"Times New Roman";
	color:windowtext;}
@list l0:level2
	{mso-level-number-format:alpha-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;}
@list l0:level3
	{mso-level-number-format:roman-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:right;
	text-indent:-9.0pt;}
@list l0:level4
	{mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;}
@list l0:level5
	{mso-level-number-format:alpha-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;}
@list l0:level6
	{mso-level-number-format:roman-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:right;
	text-indent:-9.0pt;}
@list l0:level7
	{mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;}
@list l0:level8
	{mso-level-number-format:alpha-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-18.0pt;}
@list l0:level9
	{mso-level-number-format:roman-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:right;
	text-indent:-9.0pt;}
@list l1
	{mso-list-id:465437809;
	mso-list-template-ids:-1;}
@list l1:level1
	{mso-level-number-format:bullet;
	mso-level-text:\F0B7;
	mso-level-tab-stop:36.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
@list l1:level2
	{mso-level-number-format:bullet;
	mso-level-text:o;
	mso-level-tab-stop:72.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:"Courier New";
	mso-bidi-font-family:"Times New Roman";}
@list l1:level3
	{mso-level-number-format:bullet;
	mso-level-text:\F0A7;
	mso-level-tab-stop:108.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Wingdings;}
@list l1:level4
	{mso-level-number-format:bullet;
	mso-level-text:\F0A7;
	mso-level-tab-stop:144.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Wingdings;}
@list l1:level5
	{mso-level-number-format:bullet;
	mso-level-text:\F0A7;
	mso-level-tab-stop:180.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Wingdings;}
@list l1:level6
	{mso-level-number-format:bullet;
	mso-level-text:\F0A7;
	mso-level-tab-stop:216.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Wingdings;}
@list l1:level7
	{mso-level-number-format:bullet;
	mso-level-text:\F0A7;
	mso-level-tab-stop:252.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Wingdings;}
@list l1:level8
	{mso-level-number-format:bullet;
	mso-level-text:\F0A7;
	mso-level-tab-stop:288.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Wingdings;}
@list l1:level9
	{mso-level-number-format:bullet;
	mso-level-text:\F0A7;
	mso-level-tab-stop:324.0pt;
	mso-level-number-position:left;
	text-indent:-18.0pt;
	mso-ansi-font-size:10.0pt;
	font-family:Wingdings;}
ol
	{margin-bottom:0cm;}
ul
	{margin-bottom:0cm;}
--></style>
</head>
<body lang=3D"EN-AU" link=3D"blue" vlink=3D"#954F72">
<div class=3D"WordSection1">
<p class=3D"MsoNormal">Regarding your questions:</p>
<ol style=3D"margin-top:0cm" start=3D"1" type=3D"1">
<li class=3D"MsoListParagraph" style=3D"color:black;margin-left:0cm;mso-lis=
t:l0 level1 lfo2">
<span style=3D"color:windowtext">gdraw</span><span style=3D"font-family:&qu=
ot;Arial&quot;,sans-serif"><o:p></o:p></span></li><li class=3D"MsoListParag=
raph" style=3D"color:black;margin-left:0cm;mso-list:l0 level1 lfo2">
<span style=3D"font-family:&quot;Arial&quot;,sans-serif">Not really, no. Mo=
st of the time it=92s just inspecting code to figure out what=92s going on.=
 But if you have some understanding of how gui toolkits work, it=92s not to=
o bad. The gist of it is:<br>
gdraw exposes a public interface, which allows you to:<o:p></o:p></span></l=
i><ol style=3D"margin-top:0cm" start=3D"1" type=3D"a">
<li class=3D"MsoListParagraph" style=3D"color:black;margin-left:0cm;mso-lis=
t:l0 level2 lfo2">
<span style=3D"font-family:&quot;Arial&quot;,sans-serif">Create toplevel an=
d child windows<o:p></o:p></span></li><li class=3D"MsoListParagraph" style=
=3D"color:black;margin-left:0cm;mso-list:l0 level2 lfo2">
<span style=3D"font-family:&quot;Arial&quot;,sans-serif">Draw and render te=
xt to that window (usually using Pango and Cairo, unless you=92ve somehow m=
anaged to disable that, in which case it uses straight X/Xlib calls)<o:p></=
o:p></span></li><li class=3D"MsoListParagraph" style=3D"color:black;margin-=
left:0cm;mso-list:l0 level2 lfo2">
<span style=3D"font-family:&quot;Arial&quot;,sans-serif">Receive events on =
that window (mouse/keyboard events, expose/render events, resize events etc=
)<o:p></o:p></span></li></ol>
</ol>
<p class=3D"MsoNormal" style=3D"margin-left:36.0pt"><span style=3D"font-fam=
ily:&quot;Arial&quot;,sans-serif;color:black">There=92s then some indirecti=
on, because behind that interface may be one of three implementations, an X=
 backend (gxdraw), which works directly with Xlib,
 a GDK backend (ggdkdraw), which uses GDK to create/manage windows, and a P=
ostscript backend (gpsdraw), which is mostly not functional.<br>
<br>
From there, there=92s a somewhat functional, mostly broken toolkit of widge=
ts (ggadget/gwidget), which you can use, so you don=92t
<i>completely</i> have to implement everything from scratch.<o:p></o:p></sp=
an></p>
<ol style=3D"margin-top:0cm" start=3D"3" type=3D"1">
<li class=3D"MsoListParagraph" style=3D"color:black;margin-left:0cm;mso-lis=
t:l0 level1 lfo2">
<span style=3D"font-family:&quot;Arial&quot;,sans-serif">Painfully. But in =
brief, you set up some state and desired attributes, then either call GDraw=
CreateTopWindow (toplevel windows) or GDrawCreateSubWindow (child windows).=
 You then probably use some of the widgets from
 gwidget/ggadget, which involves setting up a lot more state and some event=
 handlers.<o:p></o:p></span></li><li class=3D"MsoListParagraph" style=3D"co=
lor:black;margin-left:0cm;mso-list:l0 level1 lfo2">
<span style=3D"font-family:&quot;Arial&quot;,sans-serif">When a window is c=
onstructed, it passes in an event handler, in the source you=92ll often fin=
d it called *_e_h, e.g. splash_e_h. This receives information about things =
like mouse click/key events, expose (paint) events
 etc. When you use premade widgets, you can sometimes pass in a callback to=
 one of those as well, which just builds on that aforementioned event handl=
er.<o:p></o:p></span></li></ol>
<p class=3D"MsoNormal"><span style=3D"font-family:&quot;Arial&quot;,sans-se=
rif;color:black"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span style=3D"font-family:&quot;Arial&quot;,sans-se=
rif;color:black">Jeremy<o:p></o:p></span></p>
<p class=3D"MsoNormal"><o:p>&nbsp;</o:p></p>
<p class=3D"MsoNormal"><o:p>&nbsp;</o:p></p>
<div style=3D"mso-element:para-border-div;border:none;border-top:solid #E1E=
1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class=3D"MsoNormal" style=3D"border:none;padding:0cm"><b>From: </b><a hr=
ef=3D"mailto:[email protected]">Thor Christopher</a><br>
<b>Sent: </b>Monday, 8 July 2019 10:45 PM<br>
<b>To: </b><a href=3D"mailto:[email protected]">fontfor=
[email protected]</a><br>
<b>Subject: </b>[fontforge-devel] Some rookie questions about GUI</p>
</div>
<p class=3D"MsoNormal"><o:p>&nbsp;</o:p></p>
<p class=3D"MsoNormal"><span style=3D"font-family:&quot;Arial&quot;,sans-se=
rif">Hi, this might seem like some very basic stuff here, but I've been ski=
mming through the code just to get an overview on how FontForge is built an=
d some really basic stuff just seems difficult
 to discern from the code and documentation alone.<br>
<br>
I think this project could learn a lot from InkScape when it comes to docum=
entation and code structure.<br>
<br>
Anyway, the first thing I do when I try and understand code is to look for =
the GUI code so I can see how the UI fits with the functionality of the pro=
gram. For FontForge this has been rather difficult, all I could find about =
the GUI from the docs is this part
 from the FAQ:<br>
<i><br>
&nbsp;&quot;<span style=3D"color:black">Why doesn't it use the&nbsp;<a name=
=3D"m_5755080053323772208_m_3795060750477440">native&nbsp;MS Windows or Mac=
 windowing system?</a></span></i></span><span style=3D"mso-bookmark:m_57550=
80053323772208_m_3795060750477440">
<o:p></o:p></span></p>
<p class=3D"MsoNormal" style=3D"mso-margin-top-alt:auto;mso-margin-bottom-a=
lt:auto;margin-left:72.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo1">
<span style=3D"mso-bookmark:m_5755080053323772208_m_3795060750477440"><![if=
 !supportLists]><span style=3D"font-size:10.0pt;font-family:Symbol;color:bl=
ack"><span style=3D"mso-list:Ignore">=B7<span style=3D"font:7.0pt &quot;Tim=
es New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><![endif]><i><span style=3D"font-family:&quot;Arial&qu=
ot;,sans-serif;color:black">FontForge is not a commercial product and is no=
t bound by the constraints of the market.</span></i></span><span style=3D"m=
so-bookmark:m_5755080053323772208_m_3795060750477440"><span style=3D"color:=
black"><o:p></o:p></span></span></p>
<p class=3D"MsoNormal" style=3D"mso-margin-top-alt:auto;mso-margin-bottom-a=
lt:auto;margin-left:72.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo1">
<span style=3D"mso-bookmark:m_5755080053323772208_m_3795060750477440"><![if=
 !supportLists]><span style=3D"font-size:10.0pt;font-family:Symbol;color:bl=
ack"><span style=3D"mso-list:Ignore">=B7<span style=3D"font:7.0pt &quot;Tim=
es New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><![endif]><i><span style=3D"font-family:&quot;Arial&qu=
ot;,sans-serif;color:black">Doing that port doesn't interest me.</span></i>=
</span><span style=3D"mso-bookmark:m_5755080053323772208_m_3795060750477440=
"><span style=3D"color:black"><o:p></o:p></span></span></p>
<p class=3D"MsoNormal" style=3D"mso-margin-top-alt:auto;mso-margin-bottom-a=
lt:auto;margin-left:72.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo1">
<span style=3D"mso-bookmark:m_5755080053323772208_m_3795060750477440"><![if=
 !supportLists]><span style=3D"font-size:10.0pt;font-family:Symbol;color:bl=
ack"><span style=3D"mso-list:Ignore">=B7<span style=3D"font:7.0pt &quot;Tim=
es New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><![endif]><i><span style=3D"font-family:&quot;Arial&qu=
ot;,sans-serif;color:black">I don't have time nor do I have the skill to ta=
ke that task on.</span></i></span><span style=3D"mso-bookmark:m_57550800533=
23772208_m_3795060750477440"><span style=3D"color:black"><o:p></o:p></span>=
</span></p>
<p class=3D"MsoNormal" style=3D"mso-margin-top-alt:auto;mso-margin-bottom-a=
lt:auto;margin-left:72.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo1">
<span style=3D"mso-bookmark:m_5755080053323772208_m_3795060750477440"><![if=
 !supportLists]><span style=3D"font-size:10.0pt;font-family:Symbol;color:bl=
ack"><span style=3D"mso-list:Ignore">=B7<span style=3D"font:7.0pt &quot;Tim=
es New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><![endif]><i><span style=3D"font-family:&quot;Arial&qu=
ot;,sans-serif;color:black">I'd like to encourage people to use Linux/unix<=
/span></i></span><span style=3D"mso-bookmark:m_5755080053323772208_m_379506=
0750477440"><span style=3D"color:black"><o:p></o:p></span></span></p>
<p style=3D"margin-left:36.0pt"><span style=3D"mso-bookmark:m_5755080053323=
772208_m_3795060750477440"><i><span style=3D"font-family:&quot;Arial&quot;,=
sans-serif;color:black">Of course, if I were to use either&nbsp;</span></i>=
</span><a href=3D"https://fontforge.github.io/faq.html#widget-set" target=
=3D"_blank"><span style=3D"mso-bookmark:m_5755080053323772208_m_37950607504=
77440"><i><span style=3D"font-family:&quot;Arial&quot;,sans-serif;color:#33=
3333">gtk
 or qt</span></i></span><span style=3D"mso-bookmark:m_5755080053323772208_m=
_3795060750477440"></span></a><span style=3D"mso-bookmark:m_575508005332377=
2208_m_3795060750477440"><i><span style=3D"font-family:&quot;Arial&quot;,sa=
ns-serif;color:black">&nbsp;some of the difficulties
 of porting would vanish. But unfortunately I don't like either of those wi=
dget sets.</span></i><span style=3D"color:black"><o:p></o:p></span></span><=
/p>
<p style=3D"margin-left:36.0pt"><span style=3D"mso-bookmark:m_5755080053323=
772208_m_3795060750477440"><i><span style=3D"font-family:&quot;Arial&quot;,=
sans-serif;color:black">Now... if&nbsp;you&nbsp;would like to do the port, =
that would be wonderful. I encourage you to do so.</span></i><span style=3D=
"color:black"><o:p></o:p></span></span></p>
<p class=3D"MsoNormal"><span style=3D"mso-bookmark:m_5755080053323772208_m_=
3795060750477440"><i><span style=3D"font-family:&quot;Arial&quot;,sans-seri=
f;color:black">&nbsp;Why is FontForge based on a non-standard widget set? .=
..&quot;</span></i></span><span style=3D"mso-bookmark:m_5755080053323772208=
_m_3795060750477440"></span><span style=3D"color:black"><o:p></o:p></span><=
/p>
<p class=3D"MsoNormal"><span style=3D"color:black"><o:p>&nbsp;</o:p></span>=
</p>
<p class=3D"MsoNormal"><span style=3D"font-family:&quot;Arial&quot;,sans-se=
rif;color:black">None of this information explains what this widget set is =
or how it draws its GUI, the only hint I've found is that it uses Cairo, so=
mewhere in the code it looks like it draws the
 GUI pixel by pixel, and there's a GDraw directory with some datatypes such=
 as GWindow and GWidget that seem to be related to the UI, but trying to fo=
llow the function calls and see where it ends it's very difficult to get an=
 idea on how the GUI code works.</span><span style=3D"color:black"><o:p></o=
:p></span></p>
<p class=3D"MsoNormal"><span style=3D"color:black"><o:p>&nbsp;</o:p></span>=
</p>
<p class=3D"MsoNormal"><span style=3D"font-family:&quot;Arial&quot;,sans-se=
rif;color:black">Since I'm still confused about this, I think this is proba=
bly something a lot of other people might have a problem understanding as w=
ell when they first start looking into the FontForge
 source code. I'd say it increases the learning curve and reduces the possi=
bility of more developers contributing to this project.<br>
<br>
Maybe you should have a more in depth overview on which libraries are used =
and how they work in the docs?<br>
<br>
Some of my questions are:</span><span style=3D"color:black"><o:p></o:p></sp=
an></p>
<p class=3D"MsoNormal"><span style=3D"font-family:&quot;Arial&quot;,sans-se=
rif;color:black"><br>
1. What is the name of this non-standard widget set?&nbsp;</span><span styl=
e=3D"color:black"><o:p></o:p></span></p>
<p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"font-f=
amily:&quot;Arial&quot;,sans-serif;color:black">2. Is there any documentati=
on for how it works?<br>
3. How is a window created using this widget set?<br>
4. Where do I find the event listeners? Is it a signal/slot pattern, or som=
ething else?</span><span style=3D"color:black"><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span style=3D"font-family:&quot;Arial&quot;,sans-se=
rif;color:black">Hope I'm not spamming with too basic stuff here, but I've =
been trying to get into the code without any luck several times now, and I'=
m starting to think this is something other people
 might want to know about as well.</span><span style=3D"color:black"><o:p><=
/o:p></span></p>
<p class=3D"MsoNormal"><span style=3D"color:black"><o:p>&nbsp;</o:p></span>=
</p>
<p class=3D"MsoNormal"><span style=3D"font-family:&quot;Arial&quot;,sans-se=
rif;color:black">&nbsp;- Thor Arisland</span><span style=3D"color:black"><o=
:p></o:p></span></p>
<p class=3D"MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
</body>
</html>

--_000_SYAPR01MB3040833E55C8F7A0AADD0263C2CF0SYAPR01MB3040ausp_--


--===============1499409796628532336==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline


--===============1499409796628532336==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
fontforge-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/fontforge-devel
http://fontforge.10959.n7.nabble.com/Developer-f3.html

--===============1499409796628532336==--