<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://neogfx.io/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Leigh</id>
	<title>neoGFX - User contributions [en-gb]</title>
	<link rel="self" type="application/atom+xml" href="https://neogfx.io/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Leigh"/>
	<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Special:Contributions/Leigh"/>
	<updated>2026-04-26T19:50:21Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Naming_Convention&amp;diff=36</id>
		<title>Naming Convention</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Naming_Convention&amp;diff=36"/>
		<updated>2026-01-05T22:04:43Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The ''neoGFX'' naming convention is based on the idea that to aid readability of C++ code it is better to encode ''scope'' rather than ''type'' in an identifier name prefix.  The idea of encoding scope in identifier names was introduced by the smartphone operating system ''EPOC32'' (later ''Symbian OS'').&lt;br /&gt;
&lt;br /&gt;
The following table lists the various C++ syntactical constructs with their associated convention:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-left: 0px; margin-right: auto;&amp;quot;&lt;br /&gt;
|+ neoGFX Naming Convention&lt;br /&gt;
|-&lt;br /&gt;
! Construct !! Convention !! Example !! Note&lt;br /&gt;
|-&lt;br /&gt;
| macro || upper snake case || &amp;lt;code&amp;gt;FOO_BAR&amp;lt;/code&amp;gt; || snake_case is used for in-class ''event definition'' macros&lt;br /&gt;
|-&lt;br /&gt;
| function name || snake case || &amp;lt;code&amp;gt;foo_bar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| struct/class name || snake case || &amp;lt;code&amp;gt;foo_bar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| interface class name || snake case; &amp;lt;code&amp;gt;i_&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;i_foo_bar&amp;lt;/code&amp;gt; || an ''interface class'' does not have any member variables, containing only pure virtual functions and any associated helper functions&lt;br /&gt;
|-&lt;br /&gt;
| enum class name || snake case || &amp;lt;code&amp;gt;foo_bar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| enum name || snake case; &amp;lt;code&amp;gt;_e&amp;lt;/code&amp;gt; suffix || &amp;lt;code&amp;gt;foo_bar_e&amp;lt;/code&amp;gt; || C-style enums&lt;br /&gt;
|-&lt;br /&gt;
| enumerator || upper camel case || &amp;lt;code&amp;gt;FooBar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| function parameter || camel case; &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;aFooBar&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; for ''argument''&lt;br /&gt;
|-&lt;br /&gt;
| local variable || lower camel case || &amp;lt;code&amp;gt;fooBar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| member variable (class) || camel case; &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;iFooBar&amp;lt;/code&amp;gt; || &amp;quot;i&amp;quot; for class ''instance'' variable&lt;br /&gt;
|-&lt;br /&gt;
| member variable (struct) || lower camel case || &amp;lt;code&amp;gt;fooBar&amp;lt;/code&amp;gt; || use &amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt; for classes that don't have a ''class invariant''&lt;br /&gt;
|-&lt;br /&gt;
| variable with static storage duration || camel case; &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;sFooBar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| variable with thread local storage duration || camel case; &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;tFooBar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| event object || upper camel case || &amp;lt;code&amp;gt;FooBar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| event (virtual) getter function || snake case || &amp;lt;code&amp;gt;foo_bar&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example class:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
   foo(int aValue) : iValue{ aValue }&lt;br /&gt;
   {&lt;br /&gt;
   }&lt;br /&gt;
public:&lt;br /&gt;
   int value() const&lt;br /&gt;
   {&lt;br /&gt;
       return iValue;&lt;br /&gt;
   }&lt;br /&gt;
   void something()&lt;br /&gt;
   {&lt;br /&gt;
       thread_local qux tQux;&lt;br /&gt;
       /* ... code ... */&lt;br /&gt;
   }&lt;br /&gt;
private:&lt;br /&gt;
   int iValue;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Naming_Convention&amp;diff=35</id>
		<title>Naming Convention</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Naming_Convention&amp;diff=35"/>
		<updated>2026-01-05T22:03:26Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The ''neoGFX'' naming convention is based on the idea that to aid readability of C++ code it is better to encode ''scope'' rather than ''type'' in an identifier name prefix.  The idea of encoding scope in identifier names was introduced by the smartphone operating system ''Symbian OS''.&lt;br /&gt;
&lt;br /&gt;
The following table lists the various C++ syntactical constructs with their associated convention:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-left: 0px; margin-right: auto;&amp;quot;&lt;br /&gt;
|+ neoGFX Naming Convention&lt;br /&gt;
|-&lt;br /&gt;
! Construct !! Convention !! Example !! Note&lt;br /&gt;
|-&lt;br /&gt;
| macro || upper snake case || &amp;lt;code&amp;gt;FOO_BAR&amp;lt;/code&amp;gt; || snake_case is used for in-class ''event definition'' macros&lt;br /&gt;
|-&lt;br /&gt;
| function name || snake case || &amp;lt;code&amp;gt;foo_bar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| struct/class name || snake case || &amp;lt;code&amp;gt;foo_bar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| interface class name || snake case; &amp;lt;code&amp;gt;i_&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;i_foo_bar&amp;lt;/code&amp;gt; || an ''interface class'' does not have any member variables, containing only pure virtual functions and any associated helper functions&lt;br /&gt;
|-&lt;br /&gt;
| enum class name || snake case || &amp;lt;code&amp;gt;foo_bar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| enum name || snake case; &amp;lt;code&amp;gt;_e&amp;lt;/code&amp;gt; suffix || &amp;lt;code&amp;gt;foo_bar_e&amp;lt;/code&amp;gt; || C-style enums&lt;br /&gt;
|-&lt;br /&gt;
| enumerator || upper camel case || &amp;lt;code&amp;gt;FooBar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| function parameter || camel case; &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;aFooBar&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; for ''argument''&lt;br /&gt;
|-&lt;br /&gt;
| local variable || lower camel case || &amp;lt;code&amp;gt;fooBar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| member variable (class) || camel case; &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;iFooBar&amp;lt;/code&amp;gt; || &amp;quot;i&amp;quot; for class ''instance'' variable&lt;br /&gt;
|-&lt;br /&gt;
| member variable (struct) || lower camel case || &amp;lt;code&amp;gt;fooBar&amp;lt;/code&amp;gt; || use &amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt; for classes that don't have a ''class invariant''&lt;br /&gt;
|-&lt;br /&gt;
| variable with static storage duration || camel case; &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;sFooBar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| variable with thread local storage duration || camel case; &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;tFooBar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| event object || upper camel case || &amp;lt;code&amp;gt;FooBar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| event (virtual) getter function || snake case || &amp;lt;code&amp;gt;foo_bar&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example class:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
   foo(int aValue) : iValue{ aValue }&lt;br /&gt;
   {&lt;br /&gt;
   }&lt;br /&gt;
public:&lt;br /&gt;
   int value() const&lt;br /&gt;
   {&lt;br /&gt;
       return iValue;&lt;br /&gt;
   }&lt;br /&gt;
   void something()&lt;br /&gt;
   {&lt;br /&gt;
       thread_local qux tQux;&lt;br /&gt;
       /* ... code ... */&lt;br /&gt;
   }&lt;br /&gt;
private:&lt;br /&gt;
   int iValue;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Naming_Convention&amp;diff=34</id>
		<title>Naming Convention</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Naming_Convention&amp;diff=34"/>
		<updated>2026-01-05T22:02:28Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The ''neoGFX'' naming convention is based on the idea that to aid readability of C++ code it is better to encode ''scope'' rather than ''type'' in an identifier name prefix.  The idea of encoding scope in identifier names was introduced by the smartphone operating system ''Symbian OS''.&lt;br /&gt;
&lt;br /&gt;
The following table lists the various C++ syntactical constructs with their associated convention:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-left: 0px; margin-right: auto;&amp;quot;&lt;br /&gt;
|+ neoGFX Naming Convention&lt;br /&gt;
|-&lt;br /&gt;
! Construct !! Convention !! Example !! Note&lt;br /&gt;
|-&lt;br /&gt;
| macro || upper snake case || &amp;lt;code&amp;gt;FOO_BAR&amp;lt;/code&amp;gt; || snake_case is used for in-class ''event definition'' macros&lt;br /&gt;
|-&lt;br /&gt;
| function name || snake case || &amp;lt;code&amp;gt;foo_bar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| struct/class name || snake case || &amp;lt;code&amp;gt;foo_bar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| interface class name || snake case; &amp;lt;code&amp;gt;i_&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;i_foo_bar&amp;lt;/code&amp;gt; || an ''interface class'' does not have any member variables, containing only pure virtual functions and any associated helper functions&lt;br /&gt;
|-&lt;br /&gt;
| enum class name || snake case || &amp;lt;code&amp;gt;foo_bar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| enum name || snake case; &amp;lt;code&amp;gt;_e&amp;lt;/code&amp;gt; suffix || &amp;lt;code&amp;gt;foo_bar_e&amp;lt;/code&amp;gt; || C-style enums&lt;br /&gt;
|-&lt;br /&gt;
| enumerator || upper camel case || &amp;lt;code&amp;gt;FooBar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| function parameter || camel case; &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;aFooBar&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; for ''argument''&lt;br /&gt;
|-&lt;br /&gt;
| local variable || lower camel case || &amp;lt;code&amp;gt;fooBar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| member variable (class) || camel case; &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;iFooBar&amp;lt;/code&amp;gt; || &amp;quot;i&amp;quot; for class ''instance'' variable&lt;br /&gt;
|-&lt;br /&gt;
| member variable (struct) || lower camel case || &amp;lt;code&amp;gt;fooBar&amp;lt;/code&amp;gt; || use &amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt; for classes that don't have a ''class invariant''&lt;br /&gt;
|-&lt;br /&gt;
| variable with static storage duration || camel case; &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;sFooBar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| variable with thread local storage duration || camel case; &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;tFooBar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| event object || upper camel case || &amp;lt;code&amp;gt;FooBar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| event (virtual) getter function || snake_case || &amp;lt;code&amp;gt;foo_bar&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example class:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
   foo(int aValue) : iValue{ aValue }&lt;br /&gt;
   {&lt;br /&gt;
   }&lt;br /&gt;
public:&lt;br /&gt;
   int value() const&lt;br /&gt;
   {&lt;br /&gt;
       return iValue;&lt;br /&gt;
   }&lt;br /&gt;
   void something()&lt;br /&gt;
   {&lt;br /&gt;
       thread_local qux tQux;&lt;br /&gt;
       /* ... code ... */&lt;br /&gt;
   }&lt;br /&gt;
private:&lt;br /&gt;
   int iValue;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Naming_Convention&amp;diff=33</id>
		<title>Naming Convention</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Naming_Convention&amp;diff=33"/>
		<updated>2026-01-05T19:47:34Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The ''neoGFX'' naming convention is based on the idea that to aid readability of C++ code it is better to encode ''scope'' rather than ''type'' in an identifier name prefix.  The idea of encoding scope in identifier names was introduced by the smartphone operating system ''Symbian OS''.&lt;br /&gt;
&lt;br /&gt;
The following table lists the various C++ syntactical constructs with their associated convention:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-left: 0px; margin-right: auto;&amp;quot;&lt;br /&gt;
|+ neoGFX Naming Convention&lt;br /&gt;
|-&lt;br /&gt;
! Construct !! Convention !! Example !! Note&lt;br /&gt;
|-&lt;br /&gt;
| macro || UPPER_SNAKE_CASE || &amp;lt;code&amp;gt;FOO_BAR&amp;lt;/code&amp;gt; || snake_case is used for in-class ''event definition'' macros&lt;br /&gt;
|-&lt;br /&gt;
| function name || snake_case || &amp;lt;code&amp;gt;foo_bar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| struct/class name || snake_case || &amp;lt;code&amp;gt;foo_bar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| interface class name || snake_case; &amp;lt;code&amp;gt;i_&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;i_foo_bar&amp;lt;/code&amp;gt; || an ''interface class'' does not have any member variables, containing only pure virtual functions and any associated helper functions&lt;br /&gt;
|-&lt;br /&gt;
| enum class name || snake_case || &amp;lt;code&amp;gt;foo_bar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| enum name || snake_case; &amp;lt;code&amp;gt;_e&amp;lt;/code&amp;gt; suffix || &amp;lt;code&amp;gt;foo_bar_e&amp;lt;/code&amp;gt; || C-style enums&lt;br /&gt;
|-&lt;br /&gt;
| enumerator || UpperCamelCase || &amp;lt;code&amp;gt;FooBar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| function parameter || CamelCase; &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;aFooBar&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; for ''argument''&lt;br /&gt;
|-&lt;br /&gt;
| local variable || lowerCamelCase || &amp;lt;code&amp;gt;fooBar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| member variable (class) || CamelCase; &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;iFooBar&amp;lt;/code&amp;gt; || &amp;quot;i&amp;quot; for class ''instance'' variable&lt;br /&gt;
|-&lt;br /&gt;
| member variable (struct) || lowerCamelCase || &amp;lt;code&amp;gt;fooBar&amp;lt;/code&amp;gt; || use &amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt; for classes that don't have a ''class invariant''&lt;br /&gt;
|-&lt;br /&gt;
| variable with static storage duration || CamelCase; &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;sFooBar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| variable with thread local storage duration || CamelCase; &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;tFooBar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| event object || UpperCamelCase || &amp;lt;code&amp;gt;FooBar&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| event (virtual) getter function || snake_case || &amp;lt;code&amp;gt;foo_bar&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example class:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
   foo(int aValue) : iValue{ aValue }&lt;br /&gt;
   {&lt;br /&gt;
   }&lt;br /&gt;
public:&lt;br /&gt;
   int value() const&lt;br /&gt;
   {&lt;br /&gt;
       return iValue;&lt;br /&gt;
   }&lt;br /&gt;
   void something()&lt;br /&gt;
   {&lt;br /&gt;
       thread_local qux tQux;&lt;br /&gt;
       /* ... code ... */&lt;br /&gt;
   }&lt;br /&gt;
private:&lt;br /&gt;
   int iValue;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Naming_Convention&amp;diff=32</id>
		<title>Naming Convention</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Naming_Convention&amp;diff=32"/>
		<updated>2026-01-05T19:43:33Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The ''neoGFX'' naming convention is based on the idea that to aid readability of C++ code it is better to encode ''scope'' rather than ''type'' in an identifier name prefix.  The idea of encoding scope in identifier names was introduced by the smartphone operating system ''Symbian OS''.&lt;br /&gt;
&lt;br /&gt;
The following table lists the various C++ syntactical constructs with their associated convention:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-left: 0px; margin-right: auto;&amp;quot;&lt;br /&gt;
|+ neoGFX Naming Convention&lt;br /&gt;
|-&lt;br /&gt;
! Construct !! Convention !! Example !! Note&lt;br /&gt;
|-&lt;br /&gt;
| macro || UPPER_SNAKE_CASE || &amp;lt;code&amp;gt;MY_MACRO&amp;lt;/code&amp;gt; || snake_case is used for in-class ''event definition'' macros&lt;br /&gt;
|-&lt;br /&gt;
| function name || snake_case || &amp;lt;code&amp;gt;my_function&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| struct/class name || snake_case || &amp;lt;code&amp;gt;my_class&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| interface class name || snake_case; &amp;lt;code&amp;gt;i_&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;i_my_interface&amp;lt;/code&amp;gt; || an ''interface class'' does not have any member variables, containing only pure virtual functions and any associated helper functions&lt;br /&gt;
|-&lt;br /&gt;
| enum class name || snake_case || &amp;lt;code&amp;gt;my_enum&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| enum name || snake_case; &amp;lt;code&amp;gt;_e&amp;lt;/code&amp;gt; suffix || &amp;lt;code&amp;gt;my_enum_e&amp;lt;/code&amp;gt; || C-style enums&lt;br /&gt;
|-&lt;br /&gt;
| enumerator || UpperCamelCase || &amp;lt;code&amp;gt;MyEnumerator&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| function parameter || CamelCase; &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;aMyVariable&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; for ''argument''&lt;br /&gt;
|-&lt;br /&gt;
| local variable || lowerCamelCase || &amp;lt;code&amp;gt;myVariable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| member variable (class) || CamelCase; &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;iMyVariable&amp;lt;/code&amp;gt; || &amp;quot;i&amp;quot; for class ''instance'' variable&lt;br /&gt;
|-&lt;br /&gt;
| member variable (struct) || lowerCamelCase || &amp;lt;code&amp;gt;myVariable&amp;lt;/code&amp;gt; || use &amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt; for classes that don't have a ''class invariant''&lt;br /&gt;
|-&lt;br /&gt;
| variable with static storage duration || CamelCase; &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;sMyVariable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| variable with thread local storage duration || CamelCase; &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;tMyVariable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| event object || UpperCamelCase || &amp;lt;code&amp;gt;MyEvent&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| event (virtual) getter function || snake_case || &amp;lt;code&amp;gt;my_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example class:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
   foo(int aValue) : iValue{ aValue }&lt;br /&gt;
   {&lt;br /&gt;
   }&lt;br /&gt;
public:&lt;br /&gt;
   int value() const&lt;br /&gt;
   {&lt;br /&gt;
       return iValue;&lt;br /&gt;
   }&lt;br /&gt;
   void something()&lt;br /&gt;
   {&lt;br /&gt;
       thread_local qux tQux;&lt;br /&gt;
       /* ... code ... */&lt;br /&gt;
   }&lt;br /&gt;
private:&lt;br /&gt;
   int iValue;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Main_Page&amp;diff=31</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Main_Page&amp;diff=31"/>
		<updated>2024-05-05T17:44:57Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;neoGFX C++ Application/Game Engine and Development Platform -- Coming Soon&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
neoGFX is a C++ app/game engine and development platform targeted at app and game developers that wish to leverage modern GPUs for performant application user interfaces and game graphics.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* clean modern C++20 design including full exception safety supporting various widget allocation patterns (stack, member variable or free store);&lt;br /&gt;
* use of standard non-proprietary C++ data types including using standard string classes (UTF-8 encoding) and containers from the C++ standard library and Boost where possible;&lt;br /&gt;
* simple, easy to use multi-threaded event system (an improvement over traditional signals and slots);&lt;br /&gt;
* no baggage: neoGFX primarily contains only the GUI and graphics related functionality needed for creating apps and games;&lt;br /&gt;
* full library of widgets and layout managers specifiable in RJSON (Relaxed JSON) using the included GUI designer tool;&lt;br /&gt;
* CSS3 style sheet support with support for custom skins;&lt;br /&gt;
* scripting engine, ''neos'', that will be able to support a wide range of scripting languages (on release: ''neoscript'' and ''Lua'');&lt;br /&gt;
* sub-pixel text rendering;&lt;br /&gt;
* simple window style for specifying that a window is &amp;quot;nested&amp;quot; rather than being a separate native desktop window;&lt;br /&gt;
* &amp;quot;text_edit&amp;quot; widget supports multiple fonts, text colours (with optional gradient effects), colour emojis and rendering text in columns;&lt;br /&gt;
* &amp;quot;Green&amp;quot; and &amp;quot;Turbo&amp;quot; modes to optimize CPU power consumption, fight #ClimateChange!&lt;br /&gt;
* GPU shader rendered CSS3 compliant gradients with optional gaussian smoothing;&lt;br /&gt;
* MVC (model-view-controller) related classes supporting robust and fast app design;&lt;br /&gt;
* optional MDI support utilizing &amp;quot;nested&amp;quot; windows;&lt;br /&gt;
* 2D, 2.5D and 3D game support: sprites, objects and physics;&lt;br /&gt;
* Pure ECS (Entity-component-system) usable by both games and apps;&lt;br /&gt;
* flexible asset management: texture images (e.g PNGs) can be stored in .zip archives which can be optionally embedded inside the program binary accessible using simple URLs;&lt;br /&gt;
* support for OpenGL and Vulkan.&lt;br /&gt;
&lt;br /&gt;
== Featured Pages ==&lt;br /&gt;
* '''[[Naming Convention]]'''&lt;br /&gt;
* '''[[Event System]]'''&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Main_Page&amp;diff=30</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Main_Page&amp;diff=30"/>
		<updated>2024-05-05T17:44:19Z</updated>

		<summary type="html">&lt;p&gt;Leigh: /* Features */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;neoGFX C++ Application/Game Engine and Development Platform -- Coming Soon&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
neoGFX is a C++ app/game engine and development platform targeted at app and game developers that wish to leverage modern GPUs for performant application user interfaces and game graphics.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* clean modern C++20 design including full exception safety supporting various widget allocation patterns (stack, member variable or free store);&lt;br /&gt;
* use of standard non-proprietary C++ data types including using standard string classes (UTF-8 encoding) and containers from the C++ standard library and Boost where possible;&lt;br /&gt;
* simple, easy to use multi-threaded event system (an improvement over traditional signals and slots);&lt;br /&gt;
* no baggage: neoGFX primarily contains only the GUI and graphics related functionality needed for creating apps and games;&lt;br /&gt;
* full library of widgets and layout managers specifiable in RJSON (Relaxed JSON) using the included GUI designer tool;&lt;br /&gt;
* CSS3 style sheet support with support for custom skins;&lt;br /&gt;
* scripting engine, ''neos'', that will be able to support a wide range of scripting languages (on release: ''neoscript'' and ''Lua'');&lt;br /&gt;
* sub-pixel text rendering;&lt;br /&gt;
* simple window style for specifying that a window is &amp;quot;nested&amp;quot; rather than being a separate native desktop window;&lt;br /&gt;
* &amp;quot;text_edit&amp;quot; widget supports multiple fonts, text colours (with optional gradient effects), colour emojis and rendering text in columns;&lt;br /&gt;
* &amp;quot;Green&amp;quot; and &amp;quot;Turbo&amp;quot; modes to optimize CPU power consumption, fight #ClimateChange!&lt;br /&gt;
* GPU shader rendered CSS3 compliant gradients with optional gaussian smoothing;&lt;br /&gt;
* MVC (model-view-controller) related classes supporting robust and fast app design;&lt;br /&gt;
* optional MDI support utilizing &amp;quot;nested&amp;quot; windows;&lt;br /&gt;
* 2D, 2.5D and 3D game support: sprites, objects and physics;&lt;br /&gt;
* Pure ECS (Entity-component-system) usable by both games and apps;&lt;br /&gt;
* flexible asset management: texture images (e.g PNGs) can be stored in .zip archives which can be optionally embedded inside the program binary accessible using simple URLs;&lt;br /&gt;
* support for OpenGL, DirectX and Vulkan.&lt;br /&gt;
&lt;br /&gt;
== Featured Pages ==&lt;br /&gt;
* '''[[Naming Convention]]'''&lt;br /&gt;
* '''[[Event System]]'''&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Naming_Convention&amp;diff=29</id>
		<title>Naming Convention</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Naming_Convention&amp;diff=29"/>
		<updated>2024-05-05T15:06:02Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The ''neoGFX'' naming convention is based on the idea that to aid readability of C++ code it is better to encode ''scope'' rather than ''type'' in an identifier name prefix.  The idea of encoding scope in identifier names was introduced by the smartphone operating system ''Symbian OS''.&lt;br /&gt;
&lt;br /&gt;
The following table lists the various C++ syntactical constructs with their associated convention:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-left: 0px; margin-right: auto;&amp;quot;&lt;br /&gt;
|+ neoGFX Naming Convention&lt;br /&gt;
|-&lt;br /&gt;
! Construct !! Convention !! Example !! Note&lt;br /&gt;
|-&lt;br /&gt;
| macro || UPPER_SNAKE_CASE || &amp;lt;code&amp;gt;MY_MACRO&amp;lt;/code&amp;gt; || snake_case is used for in-class ''event definition'' macros&lt;br /&gt;
|-&lt;br /&gt;
| function name || snake_case || &amp;lt;code&amp;gt;my_function&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| struct/class name || snake_case || &amp;lt;code&amp;gt;my_class&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| interface class name || snake_case; &amp;lt;code&amp;gt;i_&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;i_my_interface&amp;lt;/code&amp;gt; || an ''interface class'' does not have any member variables, containing only pure virtual functions and any associated helper functions&lt;br /&gt;
|-&lt;br /&gt;
| enum class name || snake_case || &amp;lt;code&amp;gt;my_enum&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| enum name || snake_case; &amp;lt;code&amp;gt;_e&amp;lt;/code&amp;gt; suffix || &amp;lt;code&amp;gt;my_enum_e&amp;lt;/code&amp;gt; || C-style enums&lt;br /&gt;
|-&lt;br /&gt;
| enumerator || UpperCamelCase || &amp;lt;code&amp;gt;MyEnumerator&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| function parameter || CamelCase; &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;myVariable&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; for ''argument''&lt;br /&gt;
|-&lt;br /&gt;
| local variable || lowerCamelCase || &amp;lt;code&amp;gt;myVariable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| member variable (class) || CamelCase; &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;iMyVariable&amp;lt;/code&amp;gt; || &amp;quot;i&amp;quot; for class ''instance'' variable&lt;br /&gt;
|-&lt;br /&gt;
| member variable (struct) || lowerCamelCase || &amp;lt;code&amp;gt;myVariable&amp;lt;/code&amp;gt; || use &amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt; for classes that don't have a ''class invariant''&lt;br /&gt;
|-&lt;br /&gt;
| variable with static storage duration || CamelCase; &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;sMyVariable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| variable with thread local storage duration || CamelCase; &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;tMyVariable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| event object || UpperCamelCase || &amp;lt;code&amp;gt;MyEvent&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| event (virtual) getter function || snake_case || &amp;lt;code&amp;gt;my_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example class:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
   foo(int aValue) : iValue{ aValue }&lt;br /&gt;
   {&lt;br /&gt;
   }&lt;br /&gt;
public:&lt;br /&gt;
   int value() const&lt;br /&gt;
   {&lt;br /&gt;
       return iValue;&lt;br /&gt;
   }&lt;br /&gt;
   void something()&lt;br /&gt;
   {&lt;br /&gt;
       thread_local qux tQux;&lt;br /&gt;
       /* ... code ... */&lt;br /&gt;
   }&lt;br /&gt;
private:&lt;br /&gt;
   int iValue;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Naming_Convention&amp;diff=28</id>
		<title>Naming Convention</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Naming_Convention&amp;diff=28"/>
		<updated>2024-05-05T15:04:57Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The ''neoGFX'' naming convention is based on the idea that to aid readability of C++ code it is better to encode ''scope'' rather than ''type'' in an identifier name prefix.  The idea of encoding scope in identifier names was introduced by the smartphone operating system ''Symbian OS''.&lt;br /&gt;
&lt;br /&gt;
The following table lists the various C++ syntactical constructs with their associated convention:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-left: 0px; margin-right: auto;&amp;quot;&lt;br /&gt;
|+ neoGFX Naming Convention&lt;br /&gt;
|-&lt;br /&gt;
! Construct !! Convention !! Example !! Note&lt;br /&gt;
|-&lt;br /&gt;
| macro || UPPER_SNAKE_CASE || &amp;lt;code&amp;gt;MY_MACRO&amp;lt;/code&amp;gt; || snake_case is used for in-class ''event definition'' macros&lt;br /&gt;
|-&lt;br /&gt;
| function name || snake_case || &amp;lt;code&amp;gt;my_function&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| struct/class name || snake_case || &amp;lt;code&amp;gt;my_class&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| interface class name || snake_case; &amp;lt;code&amp;gt;i_&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;i_my_interface&amp;lt;/code&amp;gt; || an ''interface class'' does not have any member variables, containing only pure virtual functions and any associated helper functions&lt;br /&gt;
|-&lt;br /&gt;
| enum class name || snake_case || &amp;lt;code&amp;gt;my_enum&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| enum name || snake_case; &amp;lt;code&amp;gt;_e&amp;lt;/code&amp;gt; suffix || &amp;lt;code&amp;gt;my_enum_e&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| enumerator || UpperCamelCase || &amp;lt;code&amp;gt;MyEnumerator&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| function parameter || CamelCase; &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;myVariable&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; for ''argument''&lt;br /&gt;
|-&lt;br /&gt;
| local variable || lowerCamelCase || &amp;lt;code&amp;gt;myVariable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| member variable (class) || CamelCase; &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;iMyVariable&amp;lt;/code&amp;gt; || &amp;quot;i&amp;quot; for class ''instance'' variable&lt;br /&gt;
|-&lt;br /&gt;
| member variable (struct) || lowerCamelCase || &amp;lt;code&amp;gt;myVariable&amp;lt;/code&amp;gt; || use &amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt; for classes that don't have a ''class invariant''&lt;br /&gt;
|-&lt;br /&gt;
| variable with static storage duration || CamelCase; &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;sMyVariable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| variable with thread local storage duration || CamelCase; &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;tMyVariable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| event object || UpperCamelCase || &amp;lt;code&amp;gt;MyEvent&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| event (virtual) getter function || snake_case || &amp;lt;code&amp;gt;my_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example class:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
   foo(int aValue) : iValue{ aValue }&lt;br /&gt;
   {&lt;br /&gt;
   }&lt;br /&gt;
public:&lt;br /&gt;
   int value() const&lt;br /&gt;
   {&lt;br /&gt;
       return iValue;&lt;br /&gt;
   }&lt;br /&gt;
   void something()&lt;br /&gt;
   {&lt;br /&gt;
       thread_local qux tQux;&lt;br /&gt;
       /* ... code ... */&lt;br /&gt;
   }&lt;br /&gt;
private:&lt;br /&gt;
   int iValue;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Naming_Convention&amp;diff=27</id>
		<title>Naming Convention</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Naming_Convention&amp;diff=27"/>
		<updated>2024-05-05T15:04:08Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The ''neoGFX'' naming convention is based on the idea that to aid readability it is better to encode ''scope'' rather than ''type'' in an identifier name prefix.  The idea of encoding scope in identifier names was introduced by the smartphone operating system ''Symbian OS''.&lt;br /&gt;
&lt;br /&gt;
The following table lists the various C++ syntactical constructs with their associated convention:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-left: 0px; margin-right: auto;&amp;quot;&lt;br /&gt;
|+ neoGFX Naming Convention&lt;br /&gt;
|-&lt;br /&gt;
! Construct !! Convention !! Example !! Note&lt;br /&gt;
|-&lt;br /&gt;
| macro || UPPER_SNAKE_CASE || &amp;lt;code&amp;gt;MY_MACRO&amp;lt;/code&amp;gt; || snake_case is used for in-class ''event definition'' macros&lt;br /&gt;
|-&lt;br /&gt;
| function name || snake_case || &amp;lt;code&amp;gt;my_function&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| struct/class name || snake_case || &amp;lt;code&amp;gt;my_class&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| interface class name || snake_case; &amp;lt;code&amp;gt;i_&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;i_my_interface&amp;lt;/code&amp;gt; || an ''interface class'' does not have any member variables, containing only pure virtual functions and any associated helper functions&lt;br /&gt;
|-&lt;br /&gt;
| enum class name || snake_case || &amp;lt;code&amp;gt;my_enum&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| enum name || snake_case; &amp;lt;code&amp;gt;_e&amp;lt;/code&amp;gt; suffix || &amp;lt;code&amp;gt;my_enum_e&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| enumerator || UpperCamelCase || &amp;lt;code&amp;gt;MyEnumerator&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| function parameter || CamelCase; &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;myVariable&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; for ''argument''&lt;br /&gt;
|-&lt;br /&gt;
| local variable || lowerCamelCase || &amp;lt;code&amp;gt;myVariable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| member variable (class) || CamelCase; &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;iMyVariable&amp;lt;/code&amp;gt; || &amp;quot;i&amp;quot; for class ''instance'' variable&lt;br /&gt;
|-&lt;br /&gt;
| member variable (struct) || lowerCamelCase || &amp;lt;code&amp;gt;myVariable&amp;lt;/code&amp;gt; || use &amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt; for classes that don't have a ''class invariant''&lt;br /&gt;
|-&lt;br /&gt;
| variable with static storage duration || CamelCase; &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;sMyVariable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| variable with thread local storage duration || CamelCase; &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;tMyVariable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| event object || UpperCamelCase || &amp;lt;code&amp;gt;MyEvent&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| event (virtual) getter function || snake_case || &amp;lt;code&amp;gt;my_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example class:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
   foo(int aValue) : iValue{ aValue }&lt;br /&gt;
   {&lt;br /&gt;
   }&lt;br /&gt;
public:&lt;br /&gt;
   int value() const&lt;br /&gt;
   {&lt;br /&gt;
       return iValue;&lt;br /&gt;
   }&lt;br /&gt;
   void something()&lt;br /&gt;
   {&lt;br /&gt;
       thread_local qux tQux;&lt;br /&gt;
       /* ... code ... */&lt;br /&gt;
   }&lt;br /&gt;
private:&lt;br /&gt;
   int iValue;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Naming_Convention&amp;diff=26</id>
		<title>Naming Convention</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Naming_Convention&amp;diff=26"/>
		<updated>2024-05-05T15:03:17Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The ''neoGFX'' naming convention is based on the idea that to aid readability it is better to encode ''scope'' rather than ''type'' in an identifier name prefix.  The idea of encoding scope in identifier names was introduced by the smartphone operating system ''Symbian OS''.&lt;br /&gt;
&lt;br /&gt;
The following table lists the various C++ syntactical constructs with their associated convention:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-left: 0px; margin-right: auto;&amp;quot;&lt;br /&gt;
|+ neoGFX Naming Convention&lt;br /&gt;
|-&lt;br /&gt;
! Construct !! Convention !! Example !! Note&lt;br /&gt;
|-&lt;br /&gt;
| macro || UPPER_SNAKE_CASE || &amp;lt;code&amp;gt;MY_MACRO&amp;lt;/code&amp;gt; || snake_case is used for in-class ''event definition'' macros&lt;br /&gt;
|-&lt;br /&gt;
| function name || snake_case || &amp;lt;code&amp;gt;my_function&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| struct/class name || snake_case || &amp;lt;code&amp;gt;my_class&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| interface class name || snake_case; &amp;lt;code&amp;gt;i_&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;i_my_interface&amp;lt;/code&amp;gt; || an ''interface class'' does not have any member variables, containing only pure virtual functions and any associated helper functions&lt;br /&gt;
|-&lt;br /&gt;
| enum class name || snake_case || &amp;lt;code&amp;gt;my_enum&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| enum name || snake_case; &amp;lt;code&amp;gt;_e&amp;lt;/code&amp;gt; suffix || &amp;lt;code&amp;gt;my_enum_e&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| enumerator || UpperCamelCase || &amp;lt;code&amp;gt;MyEnumerator&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| function parameter || CamelCase; &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;myVariable&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; for ''argument''&lt;br /&gt;
|-&lt;br /&gt;
| local variable || lowerCamelCase || &amp;lt;code&amp;gt;myVariable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| member variable (class) || CamelCase; &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;iMyVariable&amp;lt;/code&amp;gt; || &amp;quot;i&amp;quot; for class ''instance'' variable&lt;br /&gt;
|-&lt;br /&gt;
| member variable (struct) || lowerCamelCase || &amp;lt;code&amp;gt;myVariable&amp;lt;/code&amp;gt; || use &amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt; for classes that don't have a ''class invariant''&lt;br /&gt;
|-&lt;br /&gt;
| variable with static storage duration || CamelCase; &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;sMyVariable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| variable with thread local storage duration || CamelCase; &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;tMyVariable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| event object || UpperCamelCase || &amp;lt;code&amp;gt;MyEvent&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| event (virtual) function || snake_case || &amp;lt;code&amp;gt;my_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example class:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
   foo(int aValue) : iValue{ aValue }&lt;br /&gt;
   {&lt;br /&gt;
   }&lt;br /&gt;
public:&lt;br /&gt;
   int value() const&lt;br /&gt;
   {&lt;br /&gt;
       return iValue;&lt;br /&gt;
   }&lt;br /&gt;
   void something()&lt;br /&gt;
   {&lt;br /&gt;
       thread_local qux tQux;&lt;br /&gt;
       /* ... code ... */&lt;br /&gt;
   }&lt;br /&gt;
private:&lt;br /&gt;
   int iValue;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Main_Page&amp;diff=25</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Main_Page&amp;diff=25"/>
		<updated>2024-05-05T15:03:02Z</updated>

		<summary type="html">&lt;p&gt;Leigh: /* Featured Pages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;neoGFX C++ Application/Game Engine and Development Platform -- Coming Soon&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
neoGFX is a C++ app/game engine and development platform targeted at app and game developers that wish to leverage modern GPUs for performant application user interfaces and game graphics.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* clean modern C++20 design including full exception safety supporting various widget allocation patterns (stack, member variable or free store);&lt;br /&gt;
* use of standard non-proprietary C++ data types including using standard string classes (UTF-8 encoding) and containers from the C++ standard library and Boost where possible;&lt;br /&gt;
* simple, easy to use multi-threaded event system (an improvement over traditional signals and slots);&lt;br /&gt;
* no baggage: neoGFX primarily contains only the GUI and graphics related functionality needed for creating apps and games;&lt;br /&gt;
* full library of widgets and layout managers specifiable in RJSON (Relaxed JSON) using the included GUI designer tool;&lt;br /&gt;
* CSS3 style sheet support with support for custom skins;&lt;br /&gt;
* scripting engine, neos, that will be able to support a wide range of scripting languages (on release: neoscript, JavaScript and Lua);&lt;br /&gt;
* sub-pixel text rendering;&lt;br /&gt;
* simple window style for specifying that a window is &amp;quot;nested&amp;quot; rather than being a separate native desktop window;&lt;br /&gt;
* &amp;quot;text_edit&amp;quot; widget supports multiple fonts, text colours (with optional gradient effects), colour emojis and rendering text in columns;&lt;br /&gt;
* &amp;quot;Green&amp;quot; and &amp;quot;Turbo&amp;quot; modes to optimize CPU power consumption, fight #ClimateChange!&lt;br /&gt;
* GPU shader rendered CSS3 compliant gradients with optional gaussian smoothing;&lt;br /&gt;
* MVC (model-view-controller) related classes supporting robust and fast app design;&lt;br /&gt;
* optional MDI support utilizing &amp;quot;nested&amp;quot; windows;&lt;br /&gt;
* 2D, 2.5D and 3D game support: sprites, objects and physics;&lt;br /&gt;
* Pure ECS (Entity-component-system) usable by both games and apps;&lt;br /&gt;
* flexible asset management: texture images (e.g PNGs) can be stored in .zip archives which can be optionally embedded inside the program binary accessible using simple URLs;&lt;br /&gt;
* support for OpenGL, DirectX and Vulkan.&lt;br /&gt;
&lt;br /&gt;
== Featured Pages ==&lt;br /&gt;
* '''[[Naming Convention]]'''&lt;br /&gt;
* '''[[Event System]]'''&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Naming_Convention&amp;diff=24</id>
		<title>Naming Convention</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Naming_Convention&amp;diff=24"/>
		<updated>2024-05-05T15:02:40Z</updated>

		<summary type="html">&lt;p&gt;Leigh: Created page with &amp;quot;The neoGFX naming convention is based on the idea that to aid readability it is better to encode ''scope'' rather than ''type'' in an identifier name prefix.  The idea of encoding scope in identifier names was introduced by the smartphone operating system ''Symbian OS''.  The following table lists the various C++ syntactical constructs with their associated convention:  {| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-left: 0px; margin-right: auto;&amp;quot; |+ neoGFX Naming Convention |- ! Co...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The neoGFX naming convention is based on the idea that to aid readability it is better to encode ''scope'' rather than ''type'' in an identifier name prefix.  The idea of encoding scope in identifier names was introduced by the smartphone operating system ''Symbian OS''.&lt;br /&gt;
&lt;br /&gt;
The following table lists the various C++ syntactical constructs with their associated convention:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-left: 0px; margin-right: auto;&amp;quot;&lt;br /&gt;
|+ neoGFX Naming Convention&lt;br /&gt;
|-&lt;br /&gt;
! Construct !! Convention !! Example !! Note&lt;br /&gt;
|-&lt;br /&gt;
| macro || UPPER_SNAKE_CASE || &amp;lt;code&amp;gt;MY_MACRO&amp;lt;/code&amp;gt; || snake_case is used for in-class ''event definition'' macros&lt;br /&gt;
|-&lt;br /&gt;
| function name || snake_case || &amp;lt;code&amp;gt;my_function&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| struct/class name || snake_case || &amp;lt;code&amp;gt;my_class&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| interface class name || snake_case; &amp;lt;code&amp;gt;i_&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;i_my_interface&amp;lt;/code&amp;gt; || an ''interface class'' does not have any member variables, containing only pure virtual functions and any associated helper functions&lt;br /&gt;
|-&lt;br /&gt;
| enum class name || snake_case || &amp;lt;code&amp;gt;my_enum&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| enum name || snake_case; &amp;lt;code&amp;gt;_e&amp;lt;/code&amp;gt; suffix || &amp;lt;code&amp;gt;my_enum_e&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| enumerator || UpperCamelCase || &amp;lt;code&amp;gt;MyEnumerator&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| function parameter || CamelCase; &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;myVariable&amp;lt;/code&amp;gt; || &amp;quot;a&amp;quot; for ''argument''&lt;br /&gt;
|-&lt;br /&gt;
| local variable || lowerCamelCase || &amp;lt;code&amp;gt;myVariable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| member variable (class) || CamelCase; &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;iMyVariable&amp;lt;/code&amp;gt; || &amp;quot;i&amp;quot; for class ''instance'' variable&lt;br /&gt;
|-&lt;br /&gt;
| member variable (struct) || lowerCamelCase || &amp;lt;code&amp;gt;myVariable&amp;lt;/code&amp;gt; || use &amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt; for classes that don't have a ''class invariant''&lt;br /&gt;
|-&lt;br /&gt;
| variable with static storage duration || CamelCase; &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;sMyVariable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| variable with thread local storage duration || CamelCase; &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; prefix || &amp;lt;code&amp;gt;tMyVariable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| event object || UpperCamelCase || &amp;lt;code&amp;gt;MyEvent&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| event (virtual) function || snake_case || &amp;lt;code&amp;gt;my_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example class:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
   foo(int aValue) : iValue{ aValue }&lt;br /&gt;
   {&lt;br /&gt;
   }&lt;br /&gt;
public:&lt;br /&gt;
   int value() const&lt;br /&gt;
   {&lt;br /&gt;
       return iValue;&lt;br /&gt;
   }&lt;br /&gt;
   void something()&lt;br /&gt;
   {&lt;br /&gt;
       thread_local qux tQux;&lt;br /&gt;
       /* ... code ... */&lt;br /&gt;
   }&lt;br /&gt;
private:&lt;br /&gt;
   int iValue;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=22</id>
		<title>Event System</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=22"/>
		<updated>2024-05-04T21:53:14Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The ''neoGFX'' event system is a modern, simple improvement over traditional signals and slots.&lt;br /&gt;
&lt;br /&gt;
To create an event handler simply use a lambda expression thus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If automatic event handler de-registration (traditional role of a &amp;quot;slot&amp;quot;) is wanted:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
neogfx::sink s;&lt;br /&gt;
s += button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When 's' is destroyed any associated event registrations are de-registered automatically. Sink objects can be on the stack, member variables or the more traditional slot-like base class sub-object.&lt;br /&gt;
&lt;br /&gt;
The event system is fully multi-threaded. If you want to handle the event in the same thread that is emitting the event rather than the thread that created the event handler then one simply uses the ''thread snake'', &amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;, which has the nice side effect of making it obvious that the lambda is being executed in a thread that may be different to that which is running the surrounding code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
~~~~machine.started([](){ /* ... code ... */ });&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For defining events and triggering them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    define_event(OurEvent, our_event, int)&lt;br /&gt;
public:&lt;br /&gt;
    void something()&lt;br /&gt;
    {&lt;br /&gt;
        // Using event object directly&lt;br /&gt;
        OurEvent.trigger(42); // by default a synchronous trigger&lt;br /&gt;
        OurEvent.sync_trigger(42); // synchronous trigger&lt;br /&gt;
        OurEvent.async_trigger(42); // asynchronous trigger&lt;br /&gt;
        // Using event (virtual) function&lt;br /&gt;
        our_event().trigger(42); // by default a synchronous trigger&lt;br /&gt;
        our_event().sync_trigger(42); // synchronous trigger&lt;br /&gt;
        our_event().async_trigger(42); // asynchronous trigger&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class i_xyzzy // an interface (abstract base) class&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    declare_event(our_event, int)&lt;br /&gt;
public:&lt;br /&gt;
    virtual ~i_xyzzy() = default;&lt;br /&gt;
public:&lt;br /&gt;
    virtual void qux() = 0;&lt;br /&gt;
    /* ... other interface methods or helper functions ... */&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class xyzzy : public i_xyzzy // a concrete class implementing the above interface&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    define_declared_event(OurEvent, our_event, int)&lt;br /&gt;
public:&lt;br /&gt;
    void qux() final {}&lt;br /&gt;
    /* ... code ... */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=20</id>
		<title>Event System</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=20"/>
		<updated>2024-05-04T19:02:32Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The ''neoGFX'' event system is a modern, simple improvement over traditional signals and slots.&lt;br /&gt;
&lt;br /&gt;
To create an event handler simply use a lambda expression thus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If automatic event handler de-registration (traditional role of a &amp;quot;slot&amp;quot;) is wanted:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
neogfx::sink s;&lt;br /&gt;
s += button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When 's' is destroyed any associated event registrations are de-registered automatically. Sink objects can be on the stack, member variables or the more traditional slot-like base class sub-object.&lt;br /&gt;
&lt;br /&gt;
The event system is fully multi-threaded. If you want to handle the event in the same thread that is emitting the event rather than the thread that created the event handler then one simply uses the ''thread snake'', &amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;, which has the nice side effect of making it obvious that the lambda is being executed in a thread that may be different to that which is running the surrounding code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
~~~~machine.started([](){ /* ... code ... */ });&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For defining events and triggering them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    define_event(OurEvent, our_event, int)&lt;br /&gt;
public:&lt;br /&gt;
    void something()&lt;br /&gt;
    {&lt;br /&gt;
        // Using event object directly&lt;br /&gt;
        OurEvent.trigger(42); // by default a synchronous trigger&lt;br /&gt;
        OurEvent.sync_trigger(42); // synchronous trigger&lt;br /&gt;
        OurEvent.async_trigger(42); // asynchronous trigger&lt;br /&gt;
        // Using event (virtual) function&lt;br /&gt;
        our_event().trigger(42); // by default a synchronous trigger&lt;br /&gt;
        our_event().sync_trigger(42); // synchronous trigger&lt;br /&gt;
        our_event().async_trigger(42); // asynchronous trigger&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class i_xyzzy // an interface (abstract base) class&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    declare_event(our_event, int)&lt;br /&gt;
public:&lt;br /&gt;
    virtual ~i_frumple() = default;&lt;br /&gt;
public:&lt;br /&gt;
    virtual void qux() = 0;&lt;br /&gt;
    /* ... code ... */&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class xyzzy : public i_xyzzy // a concrete class implementing the above interface&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    define_declared_event(OurEvent, our_event, int)&lt;br /&gt;
public:&lt;br /&gt;
    void qux() final {}&lt;br /&gt;
    /* ... code ... */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=19</id>
		<title>Event System</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=19"/>
		<updated>2024-05-04T19:01:50Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The ''neoGFX'' event system is a modern, simple improvement over traditional signals and slots.&lt;br /&gt;
&lt;br /&gt;
To create an event handler simply use a lambda expression thus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If automatic event handler de-registration (traditional role of a &amp;quot;slot&amp;quot;) is wanted:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
neogfx::sink s;&lt;br /&gt;
s += button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When 's' is destroyed any associated event registrations are de-registered automatically. Sink objects can be on the stack, member variables or the more traditional slot-like base class sub-object.&lt;br /&gt;
&lt;br /&gt;
The event system is fully multi-threaded. If you want to handle the event in the same thread that is emitting the event rather than the thread that created the event handler then one simply uses the ''thread snake'', &amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;, which has the nice side effect of making it obvious that the lambda is being executed in a thread that may be different to that which is running the surrounding code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
~~~~machine.started([](){ /* ... code ... */ });&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For defining events and triggering them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    define_event(OurEvent, our_event, int)&lt;br /&gt;
public:&lt;br /&gt;
    void something()&lt;br /&gt;
    {&lt;br /&gt;
        // Using event object directly&lt;br /&gt;
        OurEvent.trigger(42); // by default a synchronous trigger&lt;br /&gt;
        OurEvent.sync_trigger(42); // synchronous trigger&lt;br /&gt;
        OurEvent.async_trigger(42); // asynchronous trigger&lt;br /&gt;
        // Using event (virtual) function&lt;br /&gt;
        our_event().trigger(42); // by default a synchronous trigger&lt;br /&gt;
        our_event().sync_trigger(42); // synchronous trigger&lt;br /&gt;
        our_event().async_trigger(42); // asynchronous trigger&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class i_xyzzy // an interface (abstract base) class&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    declare_event(our_event, int)&lt;br /&gt;
public:&lt;br /&gt;
    virtual ~i_frumple() = default;&lt;br /&gt;
public:&lt;br /&gt;
    virtual void qux() = 0;&lt;br /&gt;
    /* ... code ... */&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class xyzzy : public i_xyzzy // a concrete class implementing the interface i_frumple&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    define_declared_event(OurEvent, our_event, int)&lt;br /&gt;
public:&lt;br /&gt;
    void qux() final {}&lt;br /&gt;
    /* ... code ... */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=18</id>
		<title>Event System</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=18"/>
		<updated>2024-05-04T19:01:38Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The ''neoGFX'' event system is a modern, simple improvement over traditional signals and slots.&lt;br /&gt;
&lt;br /&gt;
To create an event handler simply use a lambda expression thus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If automatic event handler de-registration (traditional role of a &amp;quot;slot&amp;quot;) is wanted:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
neoGFX::sink s;&lt;br /&gt;
s += button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When 's' is destroyed any associated event registrations are de-registered automatically. Sink objects can be on the stack, member variables or the more traditional slot-like base class sub-object.&lt;br /&gt;
&lt;br /&gt;
The event system is fully multi-threaded. If you want to handle the event in the same thread that is emitting the event rather than the thread that created the event handler then one simply uses the ''thread snake'', &amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;, which has the nice side effect of making it obvious that the lambda is being executed in a thread that may be different to that which is running the surrounding code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
~~~~machine.started([](){ /* ... code ... */ });&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For defining events and triggering them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    define_event(OurEvent, our_event, int)&lt;br /&gt;
public:&lt;br /&gt;
    void something()&lt;br /&gt;
    {&lt;br /&gt;
        // Using event object directly&lt;br /&gt;
        OurEvent.trigger(42); // by default a synchronous trigger&lt;br /&gt;
        OurEvent.sync_trigger(42); // synchronous trigger&lt;br /&gt;
        OurEvent.async_trigger(42); // asynchronous trigger&lt;br /&gt;
        // Using event (virtual) function&lt;br /&gt;
        our_event().trigger(42); // by default a synchronous trigger&lt;br /&gt;
        our_event().sync_trigger(42); // synchronous trigger&lt;br /&gt;
        our_event().async_trigger(42); // asynchronous trigger&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class i_xyzzy // an interface (abstract base) class&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    declare_event(our_event, int)&lt;br /&gt;
public:&lt;br /&gt;
    virtual ~i_frumple() = default;&lt;br /&gt;
public:&lt;br /&gt;
    virtual void qux() = 0;&lt;br /&gt;
    /* ... code ... */&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class xyzzy : public i_xyzzy // a concrete class implementing the interface i_frumple&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    define_declared_event(OurEvent, our_event, int)&lt;br /&gt;
public:&lt;br /&gt;
    void qux() final {}&lt;br /&gt;
    /* ... code ... */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=17</id>
		<title>Event System</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=17"/>
		<updated>2024-05-04T18:59:34Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The ''neoGFX'' event system is a modern, simple improvement over traditional signals and slots.&lt;br /&gt;
&lt;br /&gt;
To create an event handler simply use a lambda expression thus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If automatic event handler de-registration (traditional role of a &amp;quot;slot&amp;quot;) is wanted:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
neoGFX::sink s;&lt;br /&gt;
s += button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When 's' is destroyed any associated event registrations are de-registered automatically. Sink objects can be on the stack, member variables or the more traditional slot-like base class sub-object.&lt;br /&gt;
&lt;br /&gt;
The event system is fully multi-threaded. If you want to handle the event in the same thread that is emitting the event rather than the thread that created the event handler then one simply uses the ''thread snake'', &amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;, which has the nice side effect of making it obvious that the lambda is being executed in a thread that may be different to that which is running the surrounding code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
~~~~machine.started([](){ /* ... code ... */ });&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For defining events and triggering them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    define_event(OurEvent, our_event, int)&lt;br /&gt;
public:&lt;br /&gt;
    void something()&lt;br /&gt;
    {&lt;br /&gt;
        // Using event object directly&lt;br /&gt;
        OurEvent.trigger(42); // by default a synchronous trigger&lt;br /&gt;
        OurEvent.sync_trigger(42); // synchronous trigger&lt;br /&gt;
        OurEvent.async_trigger(42); // asynchronous trigger&lt;br /&gt;
        // Using event (virtual) function&lt;br /&gt;
        our_event().trigger(42); // by default a synchronous trigger&lt;br /&gt;
        our_event().sync_trigger(42); // synchronous trigger&lt;br /&gt;
        our_event().async_trigger(42); // asynchronous trigger&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class i_xyzzy // an interface (abstract base) class&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    declare_event(our_event, int)&lt;br /&gt;
public:&lt;br /&gt;
    virtual ~i_frumple() = default;&lt;br /&gt;
public:&lt;br /&gt;
    /* ... code ... */&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class xyzzy : public i_xyzzy // a concrete class implementing the interface i_frumple&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    define_declared_event(OurEvent, our_event, int)&lt;br /&gt;
public:&lt;br /&gt;
    /* ... code ... */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=16</id>
		<title>Event System</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=16"/>
		<updated>2024-05-04T18:44:12Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The ''neoGFX'' event system is a modern, simple improvement over traditional signals and slots.&lt;br /&gt;
&lt;br /&gt;
To create an event handler simply use a lambda expression thus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If automatic event handler de-registration (traditional role of a &amp;quot;slot&amp;quot;) is wanted:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
neoGFX::sink s;&lt;br /&gt;
s += button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When 's' is destroyed any associated event registrations are de-registered automatically. Sink objects can be on the stack, member variables or the more traditional slot-like base class sub-object.&lt;br /&gt;
&lt;br /&gt;
The event system is fully multi-threaded. If you want to handle the event in the same thread that is emitting the event rather than the thread that created the event handler then one simply uses the ''thread snake'', &amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;, which has the nice side effect of making it obvious that the lambda is being executed in a thread that may be different to that which is running the surrounding code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
~~~~machine.started([](){ /* ... code ... */ });&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For defining events and triggering them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    neoGFX::event&amp;lt;int&amp;gt; wibble;&lt;br /&gt;
public:&lt;br /&gt;
    void something()&lt;br /&gt;
    {&lt;br /&gt;
        wibble.trigger(42); // by default a synchronous trigger&lt;br /&gt;
        wibble.sync_trigger(42); // synchronous trigger&lt;br /&gt;
        wibble.async_trigger(42); // asynchronous trigger&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Main_Page&amp;diff=15</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Main_Page&amp;diff=15"/>
		<updated>2024-05-04T18:43:51Z</updated>

		<summary type="html">&lt;p&gt;Leigh: /* Featured Pages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;neoGFX C++ Application/Game Engine and Development Platform -- Coming Soon&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
neoGFX is a C++ app/game engine and development platform targeted at app and game developers that wish to leverage modern GPUs for performant application user interfaces and game graphics.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* clean modern C++20 design including full exception safety supporting various widget allocation patterns (stack, member variable or free store);&lt;br /&gt;
* use of standard non-proprietary C++ data types including using standard string classes (UTF-8 encoding) and containers from the C++ standard library and Boost where possible;&lt;br /&gt;
* simple, easy to use multi-threaded event system (an improvement over traditional signals and slots);&lt;br /&gt;
* no baggage: neoGFX primarily contains only the GUI and graphics related functionality needed for creating apps and games;&lt;br /&gt;
* full library of widgets and layout managers specifiable in RJSON (Relaxed JSON) using the included GUI designer tool;&lt;br /&gt;
* CSS3 style sheet support with support for custom skins;&lt;br /&gt;
* scripting engine, neos, that will be able to support a wide range of scripting languages (on release: neoscript, JavaScript and Lua);&lt;br /&gt;
* sub-pixel text rendering;&lt;br /&gt;
* simple window style for specifying that a window is &amp;quot;nested&amp;quot; rather than being a separate native desktop window;&lt;br /&gt;
* &amp;quot;text_edit&amp;quot; widget supports multiple fonts, text colours (with optional gradient effects), colour emojis and rendering text in columns;&lt;br /&gt;
* &amp;quot;Green&amp;quot; and &amp;quot;Turbo&amp;quot; modes to optimize CPU power consumption, fight #ClimateChange!&lt;br /&gt;
* GPU shader rendered CSS3 compliant gradients with optional gaussian smoothing;&lt;br /&gt;
* MVC (model-view-controller) related classes supporting robust and fast app design;&lt;br /&gt;
* optional MDI support utilizing &amp;quot;nested&amp;quot; windows;&lt;br /&gt;
* 2D, 2.5D and 3D game support: sprites, objects and physics;&lt;br /&gt;
* Pure ECS (Entity-component-system) usable by both games and apps;&lt;br /&gt;
* flexible asset management: texture images (e.g PNGs) can be stored in .zip archives which can be optionally embedded inside the program binary accessible using simple URLs;&lt;br /&gt;
* support for OpenGL, DirectX and Vulkan.&lt;br /&gt;
&lt;br /&gt;
== Featured Pages ==&lt;br /&gt;
* '''[[Event System]]'''&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Main_Page&amp;diff=14</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Main_Page&amp;diff=14"/>
		<updated>2024-05-04T18:43:18Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;neoGFX C++ Application/Game Engine and Development Platform -- Coming Soon&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
neoGFX is a C++ app/game engine and development platform targeted at app and game developers that wish to leverage modern GPUs for performant application user interfaces and game graphics.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* clean modern C++20 design including full exception safety supporting various widget allocation patterns (stack, member variable or free store);&lt;br /&gt;
* use of standard non-proprietary C++ data types including using standard string classes (UTF-8 encoding) and containers from the C++ standard library and Boost where possible;&lt;br /&gt;
* simple, easy to use multi-threaded event system (an improvement over traditional signals and slots);&lt;br /&gt;
* no baggage: neoGFX primarily contains only the GUI and graphics related functionality needed for creating apps and games;&lt;br /&gt;
* full library of widgets and layout managers specifiable in RJSON (Relaxed JSON) using the included GUI designer tool;&lt;br /&gt;
* CSS3 style sheet support with support for custom skins;&lt;br /&gt;
* scripting engine, neos, that will be able to support a wide range of scripting languages (on release: neoscript, JavaScript and Lua);&lt;br /&gt;
* sub-pixel text rendering;&lt;br /&gt;
* simple window style for specifying that a window is &amp;quot;nested&amp;quot; rather than being a separate native desktop window;&lt;br /&gt;
* &amp;quot;text_edit&amp;quot; widget supports multiple fonts, text colours (with optional gradient effects), colour emojis and rendering text in columns;&lt;br /&gt;
* &amp;quot;Green&amp;quot; and &amp;quot;Turbo&amp;quot; modes to optimize CPU power consumption, fight #ClimateChange!&lt;br /&gt;
* GPU shader rendered CSS3 compliant gradients with optional gaussian smoothing;&lt;br /&gt;
* MVC (model-view-controller) related classes supporting robust and fast app design;&lt;br /&gt;
* optional MDI support utilizing &amp;quot;nested&amp;quot; windows;&lt;br /&gt;
* 2D, 2.5D and 3D game support: sprites, objects and physics;&lt;br /&gt;
* Pure ECS (Entity-component-system) usable by both games and apps;&lt;br /&gt;
* flexible asset management: texture images (e.g PNGs) can be stored in .zip archives which can be optionally embedded inside the program binary accessible using simple URLs;&lt;br /&gt;
* support for OpenGL, DirectX and Vulkan.&lt;br /&gt;
&lt;br /&gt;
== Featured Pages ==&lt;br /&gt;
* [[Event System]]&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Main_Page&amp;diff=13</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Main_Page&amp;diff=13"/>
		<updated>2024-05-04T18:42:52Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;neoGFX C++ Application/Game Engine and Development Platform -- Coming Soon&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
neoGFX is a C++ app/game engine and development platform targeted at app and game developers that wish to leverage modern GPUs for performant application user interfaces and game graphics.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* clean modern C++20 design including full exception safety supporting various widget allocation patterns (stack, member variable or free store);&lt;br /&gt;
* use of standard non-proprietary C++ data types including using standard string classes (UTF-8 encoding) and containers from the C++ standard library and Boost where possible;&lt;br /&gt;
* simple, easy to use multi-threaded event system (an improvement over traditional signals and slots);&lt;br /&gt;
* no baggage: neoGFX primarily contains only the GUI and graphics related functionality needed for creating apps and games;&lt;br /&gt;
* full library of widgets and layout managers specifiable in RJSON (Relaxed JSON) using the included GUI designer tool;&lt;br /&gt;
* CSS3 style sheet support with support for custom skins;&lt;br /&gt;
* scripting engine, neos, that will be able to support a wide range of scripting languages (on release: neoscript, JavaScript and Lua);&lt;br /&gt;
* sub-pixel text rendering;&lt;br /&gt;
* simple window style for specifying that a window is &amp;quot;nested&amp;quot; rather than being a separate native desktop window;&lt;br /&gt;
* &amp;quot;text_edit&amp;quot; widget supports multiple fonts, text colours (with optional gradient effects), colour emojis and rendering text in columns;&lt;br /&gt;
* &amp;quot;Green&amp;quot; and &amp;quot;Turbo&amp;quot; modes to optimize CPU power consumption, fight #ClimateChange!&lt;br /&gt;
* GPU shader rendered CSS3 compliant gradients with optional gaussian smoothing;&lt;br /&gt;
* MVC (model-view-controller) related classes supporting robust and fast app design;&lt;br /&gt;
* optional MDI support utilizing &amp;quot;nested&amp;quot; windows;&lt;br /&gt;
* 2D, 2.5D and 3D game support: sprites, objects and physics;&lt;br /&gt;
* Pure ECS (Entity-component-system) usable by both games and apps;&lt;br /&gt;
* flexible asset management: texture images (e.g PNGs) can be stored in .zip archives which can be optionally embedded inside the program binary accessible using simple URLs;&lt;br /&gt;
* support for OpenGL, DirectX and Vulkan.&lt;br /&gt;
&lt;br /&gt;
== Featured Pages ==&lt;br /&gt;
[[Event System]]&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=12</id>
		<title>Event System</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=12"/>
		<updated>2024-05-04T18:38:55Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The ''neoGFX'' event system is a modern, simple, improvement over traditional signals and slots.&lt;br /&gt;
&lt;br /&gt;
To create an event handler simply use a lambda expression thus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If automatic event handler de-registration (traditional role of a &amp;quot;slot&amp;quot;) is wanted:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
neoGFX::sink s;&lt;br /&gt;
s += button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When 's' is destroyed any associated event registrations are de-registered automatically. Sink objects can be on the stack, member variables or the more traditional slot-like base class sub-object.&lt;br /&gt;
&lt;br /&gt;
The event system is fully multi-threaded. If you want to handle the event in the same thread that is emitting the event rather than the thread that created the event handler then one simply uses the ''thread snake'', &amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;, which has the nice side effect of making it obvious that the lambda is being executed in a thread that may be different to that which is running the surrounding code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
~~~~machine.started([](){ /* ... code ... */ });&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For defining events and triggering them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    neoGFX::event&amp;lt;int&amp;gt; wibble;&lt;br /&gt;
public:&lt;br /&gt;
    void something()&lt;br /&gt;
    {&lt;br /&gt;
        wibble.trigger(42); // by default a synchronous trigger&lt;br /&gt;
        wibble.sync_trigger(42); // synchronous trigger&lt;br /&gt;
        wibble.async_trigger(42); // asynchronous trigger&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=11</id>
		<title>Event System</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=11"/>
		<updated>2024-05-04T18:38:36Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The ''neoGFX'' event system is a modern, simple improvement over traditional signals and slots.&lt;br /&gt;
&lt;br /&gt;
To create an event handler simply use a lambda expression thus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If automatic event handler de-registration (traditional role of a &amp;quot;slot&amp;quot;) is wanted:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
neoGFX::sink s;&lt;br /&gt;
s += button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When 's' is destroyed any associated event registrations are de-registered automatically. Sink objects can be on the stack, member variables or the more traditional slot-like base class sub-object.&lt;br /&gt;
&lt;br /&gt;
The event system is fully multi-threaded. If you want to handle the event in the same thread that is emitting the event rather than the thread that created the event handler then one simply uses the ''thread snake'', &amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;, which has the nice side effect of making it obvious that the lambda is being executed in a thread that may be different to that which is running the surrounding code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
~~~~machine.started([](){ /* ... code ... */ });&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For defining events and triggering them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    neoGFX::event&amp;lt;int&amp;gt; wibble;&lt;br /&gt;
public:&lt;br /&gt;
    void something()&lt;br /&gt;
    {&lt;br /&gt;
        wibble.trigger(42); // by default a synchronous trigger&lt;br /&gt;
        wibble.sync_trigger(42); // synchronous trigger&lt;br /&gt;
        wibble.async_trigger(42); // asynchronous trigger&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=10</id>
		<title>Event System</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=10"/>
		<updated>2024-05-04T18:37:55Z</updated>

		<summary type="html">&lt;p&gt;Leigh: Leigh moved page NeoGFX Event System to Event System without leaving a redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The ''neoGFX'' event system is both modern and simple and is an improvement over traditional signals and slots.&lt;br /&gt;
&lt;br /&gt;
To create an event handler simply use a lambda expression thus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If automatic event handler de-registration (traditional role of a &amp;quot;slot&amp;quot;) is wanted:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
neoGFX::sink s;&lt;br /&gt;
s += button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When 's' is destroyed any associated event registrations are de-registered automatically. Sink objects can be on the stack, member variables or the more traditional slot-like base class sub-object.&lt;br /&gt;
&lt;br /&gt;
The event system is fully multi-threaded. If you want to handle the event in the same thread that is emitting the event rather than the thread that created the event handler then one simply uses the ''thread snake'', &amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;, which has the nice side effect of making it obvious that the lambda is being executed in a thread that may be different to that which is running the surrounding code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
~~~~machine.started([](){ /* ... code ... */ });&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For defining events and triggering them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    neoGFX::event&amp;lt;int&amp;gt; wibble;&lt;br /&gt;
public:&lt;br /&gt;
    void something()&lt;br /&gt;
    {&lt;br /&gt;
        wibble.trigger(42); // by default a synchronous trigger&lt;br /&gt;
        wibble.sync_trigger(42); // synchronous trigger&lt;br /&gt;
        wibble.async_trigger(42); // asynchronous trigger&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=9</id>
		<title>Event System</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=9"/>
		<updated>2024-05-04T18:37:37Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The ''neoGFX'' event system is both modern and simple and is an improvement over traditional signals and slots.&lt;br /&gt;
&lt;br /&gt;
To create an event handler simply use a lambda expression thus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If automatic event handler de-registration (traditional role of a &amp;quot;slot&amp;quot;) is wanted:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
neoGFX::sink s;&lt;br /&gt;
s += button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When 's' is destroyed any associated event registrations are de-registered automatically. Sink objects can be on the stack, member variables or the more traditional slot-like base class sub-object.&lt;br /&gt;
&lt;br /&gt;
The event system is fully multi-threaded. If you want to handle the event in the same thread that is emitting the event rather than the thread that created the event handler then one simply uses the ''thread snake'', &amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;, which has the nice side effect of making it obvious that the lambda is being executed in a thread that may be different to that which is running the surrounding code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
~~~~machine.started([](){ /* ... code ... */ });&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For defining events and triggering them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    neoGFX::event&amp;lt;int&amp;gt; wibble;&lt;br /&gt;
public:&lt;br /&gt;
    void something()&lt;br /&gt;
    {&lt;br /&gt;
        wibble.trigger(42); // by default a synchronous trigger&lt;br /&gt;
        wibble.sync_trigger(42); // synchronous trigger&lt;br /&gt;
        wibble.async_trigger(42); // asynchronous trigger&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=8</id>
		<title>Event System</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=8"/>
		<updated>2024-05-04T18:37:03Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The neoGFX event system is both modern and simple and is an improvement over traditional signals and slots.&lt;br /&gt;
&lt;br /&gt;
To create an event handler simply use a lambda expression thus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If automatic event handler de-registration (traditional role of a &amp;quot;slot&amp;quot;) is wanted:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
neoGFX::sink s;&lt;br /&gt;
s += button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When 's' is destroyed any associated event registrations are de-registered automatically. Sink objects can be on the stack, member variables or the more traditional slot-like base class sub-object.&lt;br /&gt;
&lt;br /&gt;
The event system is fully multi-threaded. If you want to handle the event in the same thread that is emitting the event rather than the thread that created the event handler then one simply uses the ''thread snake'', &amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;, which has the nice side effect of making it obvious that the lambda is being executed in a thread that may be different to that which is running the surrounding code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
~~~~machine.started([](){ /* ... code ... */ });&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For defining events and triggering them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    neoGFX::event&amp;lt;int&amp;gt; wibble;&lt;br /&gt;
public:&lt;br /&gt;
    void something()&lt;br /&gt;
    {&lt;br /&gt;
        wibble.trigger(42); // by default a synchronous trigger&lt;br /&gt;
        wibble.sync_trigger(42); // synchronous trigger&lt;br /&gt;
        wibble.async_trigger(42); // asynchronous trigger&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=7</id>
		<title>Event System</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=7"/>
		<updated>2024-05-04T18:35:25Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase title}}&lt;br /&gt;
&lt;br /&gt;
The neoGFX event system is both modern and simple and is an improvement over traditional signals and slots.&lt;br /&gt;
&lt;br /&gt;
To create an event handler simply use a lambda expression thus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If automatic event handler de-registration (traditional role of a &amp;quot;slot&amp;quot;) is wanted:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
neoGFX::sink s;&lt;br /&gt;
s += button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When 's' is destroyed any associated event registrations are de-registered automatically. Sink objects can be on the stack, member variables or the more traditional slot-like base class sub-object.&lt;br /&gt;
&lt;br /&gt;
The event system is fully multi-threaded. If you want to handle the event in the same thread that is emitting the event rather than the thread that created the event handler then one simply uses the ''thread snake'', &amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;, which has the nice side effect of making it obvious that the lambda is being executed in a thread that may be different to that which is running the surrounding code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
~~~~machine.started([](){ /* ... code ... */ });&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For defining events and triggering them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    neoGFX::event&amp;lt;int&amp;gt; wibble;&lt;br /&gt;
public:&lt;br /&gt;
    void something()&lt;br /&gt;
    {&lt;br /&gt;
        wibble.trigger(42); // by default a synchronous trigger&lt;br /&gt;
        wibble.sync_trigger(42); // synchronous trigger&lt;br /&gt;
        wibble.async_trigger(42); // asynchronous trigger&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=6</id>
		<title>Event System</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=6"/>
		<updated>2024-05-04T18:34:10Z</updated>

		<summary type="html">&lt;p&gt;Leigh: /* neoGFX Event System */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The neoGFX event system is both modern and simple and is an improvement over traditional signals and slots.&lt;br /&gt;
&lt;br /&gt;
To create an event handler simply use a lambda expression thus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If automatic event handler de-registration (traditional role of a &amp;quot;slot&amp;quot;) is wanted:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
neoGFX::sink s;&lt;br /&gt;
s += button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When 's' is destroyed any associated event registrations are de-registered automatically. Sink objects can be on the stack, member variables or the more traditional slot-like base class sub-object.&lt;br /&gt;
&lt;br /&gt;
The event system is fully multi-threaded. If you want to handle the event in the same thread that is emitting the event rather than the thread that created the event handler then one simply uses the ''thread snake'', &amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;, which has the nice side effect of making it obvious that the lambda is being executed in a thread that may be different to that which is running the surrounding code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
~~~~machine.started([](){ /* ... code ... */ });&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For defining events and triggering them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    neoGFX::event&amp;lt;int&amp;gt; wibble;&lt;br /&gt;
public:&lt;br /&gt;
    void something()&lt;br /&gt;
    {&lt;br /&gt;
        wibble.trigger(42); // by default a synchronous trigger&lt;br /&gt;
        wibble.sync_trigger(42); // synchronous trigger&lt;br /&gt;
        wibble.async_trigger(42); // asynchronous trigger&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=5</id>
		<title>Event System</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=5"/>
		<updated>2024-05-04T18:33:43Z</updated>

		<summary type="html">&lt;p&gt;Leigh: Leigh moved page EventSystem to NeoGFX Event System without leaving a redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== neoGFX Event System ==&lt;br /&gt;
&lt;br /&gt;
The neoGFX event system is both modern and simple and is an improvement over traditional signals and slots.&lt;br /&gt;
&lt;br /&gt;
To create an event handler simply use a lambda expression thus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If automatic event handler de-registration (traditional role of a &amp;quot;slot&amp;quot;) is wanted:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
neoGFX::sink s;&lt;br /&gt;
s += button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When 's' is destroyed any associated event registrations are de-registered automatically. Sink objects can be on the stack, member variables or the more traditional slot-like base class sub-object.&lt;br /&gt;
&lt;br /&gt;
The event system is fully multi-threaded. If you want to handle the event in the same thread that is emitting the event rather than the thread that created the event handler then one simply uses the ''thread snake'', &amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;, which has the nice side effect of making it obvious that the lambda is being executed in a thread that may be different to that which is running the surrounding code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
~~~~machine.started([](){ /* ... code ... */ });&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For defining events and triggering them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    neoGFX::event&amp;lt;int&amp;gt; wibble;&lt;br /&gt;
public:&lt;br /&gt;
    void something()&lt;br /&gt;
    {&lt;br /&gt;
        wibble.trigger(42); // by default a synchronous trigger&lt;br /&gt;
        wibble.sync_trigger(42); // synchronous trigger&lt;br /&gt;
        wibble.async_trigger(42); // asynchronous trigger&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=4</id>
		<title>Event System</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Event_System&amp;diff=4"/>
		<updated>2024-05-04T18:32:43Z</updated>

		<summary type="html">&lt;p&gt;Leigh: Created page with &amp;quot;== neoGFX Event System ==  The neoGFX event system is both modern and simple and is an improvement over traditional signals and slots.  To create an event handler simply use a lambda expression thus:  &amp;lt;code&amp;gt; button1.clicked([](){ /* ... code ... */ }); &amp;lt;/code&amp;gt;  If automatic event handler de-registration (traditional role of a &amp;quot;slot&amp;quot;) is wanted:  &amp;lt;code&amp;gt; neoGFX::sink s; s += button1.clicked([](){ /* ... code ... */ }); &amp;lt;/code&amp;gt;  When 's' is destroyed any associated event re...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== neoGFX Event System ==&lt;br /&gt;
&lt;br /&gt;
The neoGFX event system is both modern and simple and is an improvement over traditional signals and slots.&lt;br /&gt;
&lt;br /&gt;
To create an event handler simply use a lambda expression thus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If automatic event handler de-registration (traditional role of a &amp;quot;slot&amp;quot;) is wanted:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
neoGFX::sink s;&lt;br /&gt;
s += button1.clicked([](){ /* ... code ... */ });&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When 's' is destroyed any associated event registrations are de-registered automatically. Sink objects can be on the stack, member variables or the more traditional slot-like base class sub-object.&lt;br /&gt;
&lt;br /&gt;
The event system is fully multi-threaded. If you want to handle the event in the same thread that is emitting the event rather than the thread that created the event handler then one simply uses the ''thread snake'', &amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;, which has the nice side effect of making it obvious that the lambda is being executed in a thread that may be different to that which is running the surrounding code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
~~~~machine.started([](){ /* ... code ... */ });&lt;br /&gt;
/* ... code ... */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For defining events and triggering them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class foo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    neoGFX::event&amp;lt;int&amp;gt; wibble;&lt;br /&gt;
public:&lt;br /&gt;
    void something()&lt;br /&gt;
    {&lt;br /&gt;
        wibble.trigger(42); // by default a synchronous trigger&lt;br /&gt;
        wibble.sync_trigger(42); // synchronous trigger&lt;br /&gt;
        wibble.async_trigger(42); // asynchronous trigger&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Main_Page&amp;diff=3</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Main_Page&amp;diff=3"/>
		<updated>2023-10-29T11:08:56Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;neoGFX C++ Application/Game Engine and Development Platform -- Coming Soon&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
neoGFX is a C++ app/game engine and development platform targeted at app and game developers that wish to leverage modern GPUs for performant application user interfaces and game graphics.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* clean modern C++20 design including full exception safety supporting various widget allocation patterns (stack, member variable or free store);&lt;br /&gt;
* use of standard non-proprietary C++ data types including using standard string classes (UTF-8 encoding) and containers from the C++ standard library and Boost where possible;&lt;br /&gt;
* simple, easy to use multi-threaded event system (an improvement over traditional signals and slots);&lt;br /&gt;
* no baggage: neoGFX primarily contains only the GUI and graphics related functionality needed for creating apps and games;&lt;br /&gt;
* full library of widgets and layout managers specifiable in RJSON (Relaxed JSON) using the included GUI designer tool;&lt;br /&gt;
* CSS3 style sheet support with support for custom skins;&lt;br /&gt;
* scripting engine, neos, that will be able to support a wide range of scripting languages (on release: neoscript, JavaScript and Lua);&lt;br /&gt;
* sub-pixel text rendering;&lt;br /&gt;
* simple window style for specifying that a window is &amp;quot;nested&amp;quot; rather than being a separate native desktop window;&lt;br /&gt;
* &amp;quot;text_edit&amp;quot; widget supports multiple fonts, text colours (with optional gradient effects), colour emojis and rendering text in columns;&lt;br /&gt;
* &amp;quot;Green&amp;quot; and &amp;quot;Turbo&amp;quot; modes to optimize CPU power consumption, fight #ClimateChange!&lt;br /&gt;
* GPU shader rendered CSS3 compliant gradients with optional gaussian smoothing;&lt;br /&gt;
* MVC (model-view-controller) related classes supporting robust and fast app design;&lt;br /&gt;
* optional MDI support utilizing &amp;quot;nested&amp;quot; windows;&lt;br /&gt;
* 2D, 2.5D and 3D game support: sprites, objects and physics;&lt;br /&gt;
* Pure ECS (Entity-component-system) usable by both games and apps;&lt;br /&gt;
* flexible asset management: texture images (e.g PNGs) can be stored in .zip archives which can be optionally embedded inside the program binary accessible using simple URLs;&lt;br /&gt;
* support for OpenGL, DirectX and Vulkan.&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
	<entry>
		<id>https://neogfx.io/wiki/index.php?title=Main_Page&amp;diff=2</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://neogfx.io/wiki/index.php?title=Main_Page&amp;diff=2"/>
		<updated>2023-10-29T11:08:15Z</updated>

		<summary type="html">&lt;p&gt;Leigh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;neoGFX C++ Application/Game Engine and Development Platform -- Coming Soon&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
neoGFX is a C++ app/game engine and development platform targeted at app and game developers that wish to leverage modern GPUs for performant application user interfaces and game graphics.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* clean modern C++20 design including full exception safety supporting various widget allocation patterns (stack, member variable or free store);&lt;br /&gt;
* use of standard non-proprietary C++ data types including using standard string classes (UTF-8 encoding) and containers from the C++ standard library and Boost where possible;&lt;br /&gt;
* simple, easy to use multi-threaded event system (an improvement over traditional signals and slots);&lt;br /&gt;
* no baggage: neoGFX primarily contains only the GUI and graphics related functionality needed for creating apps and games;&lt;br /&gt;
* full library of widgets and layout managers specifiable in RJSON (Relaxed JSON) using the included GUI designer tool;&lt;br /&gt;
* CSS3 style sheet support with support for custom skins;&lt;br /&gt;
* scripting engine, neos, that will be able to support a wide range of scripting languages (on release: neoscript, JavaScript and Lua);&lt;br /&gt;
* sub-pixel text rendering;&lt;br /&gt;
* simple window style for specifying that a window is &amp;quot;nested&amp;quot; rather than being a separate native desktop window;&lt;br /&gt;
* &amp;quot;text_edit&amp;quot; widget supports multiple fonts, text colours (with optional gradient effects), colour emojis and rendering text in columns;&lt;br /&gt;
* &amp;quot;Green&amp;quot; and &amp;quot;Turbo&amp;quot; modes to optimize CPU power consumption, fight #ClimateChange!&lt;br /&gt;
* GPU shader rendered CSS3 compliant gradients with optional gaussian smoothing;&lt;br /&gt;
* MVC (model-view-controller) related classes supporting robust and fast app design;&lt;br /&gt;
* optional MDI support utilizing &amp;quot;nested&amp;quot; windows;&lt;br /&gt;
* 2D, 2.5D and 3D game support: sprites, objects and physics;&lt;br /&gt;
* Pure ECS (Entity-component-system) usable by both games and apps;&lt;br /&gt;
* flexible asset management: texture images (e.g PNGs) can be stored in .zip archives which can be optionally embedded inside the program binary accessible using simple URLs;&lt;br /&gt;
* support for OpenGL and Vulkan.&lt;/div&gt;</summary>
		<author><name>Leigh</name></author>
	</entry>
</feed>