<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Mysterious missing event code</title>
		<link>http://www.allegro.cc/forums/view/617076</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 10 Oct 2017 05:02:22 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hi,</p><p>I&#39;m currently debugging my multi monitor code for Eagle and every time I shut down Eagle after creating a EagleGraphicsContext( a window ) it hangs in Allegro5WindowManager::Destroy here :<br /><a href="https://github.com/EdgarReynaldo/EagleGUI/blob/master/src/backends/Allegro5/Allegro5WindowManager.cpp#L304-L314">https://github.com/EdgarReynaldo/EagleGUI/blob/master/src/backends/Allegro5/Allegro5WindowManager.cpp#L304-L314</a></p><p>The Allegro5WindowManager process is alive and waiting on an event (in this case, EAGLE_EVENT_WM_DESTROY :<br /><a href="https://github.com/EdgarReynaldo/EagleGUI/blob/master/src/backends/Allegro5/Allegro5WindowManager.cpp#L37">https://github.com/EdgarReynaldo/EagleGUI/blob/master/src/backends/Allegro5/Allegro5WindowManager.cpp#L37</a></p><p>which should have been sent by the above code, but that message never arrives. Can anyone help me debug this and figure out why my event is missing?</p><p>Edgar
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Tue, 03 Oct 2017 21:31:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This probably doesn&#39;t really help, but the first thing I thought of was if the Allegro event system is somehow tied to the window/display, and you destroy that, perhaps the event pipeline would get lost. Just a guess, and it&#39;s probably not true if the event queues don&#39;t require a display to function.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Wed, 04 Oct 2017 10:53:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>ALLEGRO_EVENT_QUEUE and ALLEGRO_EVENT_SOURCE are both completely separate from an ALLEGRO_DISPLAY.</p><p>I don&#39;t know what&#39;s wrong. If I set a breakpoint in WM::Destroy I <b>see</b> the event get emitted! It is just never received by the A5WindowManagerProcess. I <b>only</b> unregister the event source <b>once</b>, on destruction later on in WM::Destroy here :<br /><a href="https://github.com/EdgarReynaldo/EagleGUI/blob/master/src/backends/Allegro5/Allegro5WindowManager.cpp#L316-L321">https://github.com/EdgarReynaldo/EagleGUI/blob/master/src/backends/Allegro5/Allegro5WindowManager.cpp#L316-L321</a></p><p>I create and initialize and register them here :<br /><a href="https://github.com/EdgarReynaldo/EagleGUI/blob/master/src/backends/Allegro5/Allegro5WindowManager.cpp#L264-L277">https://github.com/EdgarReynaldo/EagleGUI/blob/master/src/backends/Allegro5/Allegro5WindowManager.cpp#L264-L277</a></p><p>Those are the only places I create or destroy or register or unregister the window_event_source. This is everything grep returns that has anything to do with the window event source :
</p><pre>
c:\ctwoplus\progcode\Eagle5GUI_GIT_BitBucket\src&gt;grep -r -E -I -n &quot;window_event_source&quot; .*.*
.\backends/Allegro5/Allegro5WindowManager.cpp:42:      if (ev.any.source == &amp;(a5man-&gt;window_event_source)) {
.\backends/Allegro5/Allegro5WindowManager.cpp:130:   ev.any.source = &amp;window_event_source;
.\backends/Allegro5/Allegro5WindowManager.cpp:133:   al_emit_user_event(&amp;window_event_source , &amp;ev , 0);
.\backends/Allegro5/Allegro5WindowManager.cpp:150:   if (ev.any.source == &amp;window_event_source) {
.\backends/Allegro5/Allegro5WindowManager.cpp:245:      window_event_source(),
.\backends/Allegro5/Allegro5WindowManager.cpp:264:   al_init_user_event_source(&amp;window_event_source);
.\backends/Allegro5/Allegro5WindowManager.cpp:277:   al_register_event_source(window_queue , &amp;window_event_source);
.\backends/Allegro5/Allegro5WindowManager.cpp:307:      ev.any.source = &amp;window_event_source;
.\backends/Allegro5/Allegro5WindowManager.cpp:311:      al_emit_user_event(&amp;window_event_source , &amp;ev , 0);
.\backends/Allegro5/Allegro5WindowManager.cpp:317:      al_unregister_event_source(window_queue , &amp;window_event_source);
.\backends/Allegro5/Allegro5WindowManager.cpp:318:      al_destroy_user_event_source(&amp;window_event_source);

c:\ctwoplus\progcode\Eagle5GUI_GIT_BitBucket\src&gt;
</pre><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 06 Oct 2017 01:41:42 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This is maybe a bit of a hack, but if you comment out the unregister/destroy event source business does the event arrive? I&#39;m just curious if that would help to track down the cause.. I&#39;m just guessing mind you. If I can find any ambition I could try to get it installed and test it myself later on this weekend or something. Have you tried on other machines? Sometimes that can change things too. I&#39;d be testing in Linux, assuming Eagle supports that.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Fri, 06 Oct 2017 05:58:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Tested on Windows and Linux, that&#39;s all I have access to. Does the exact same thing, whether in Windows 10, or OpenSUSE 44.</p><p>It currently builds with C::B and MinGW/GCC and needs allegro installed either in the root directory in a folder called allegro or in usr/local/lib, or in your compiler directory (eww).</p><p>This is probably paranoid, but I suspect it&#39;s a heisenbug or memory corruption or something. I tried to rule out race conditions by creating a EagleLogGuard, which seems to be working fine to serialize log output.</p><p><b>EDIT</b><br />There is some hanky panky going on in my code somewhere....</p><p>If I add in this line :</p><p><a href="https://github.com/EdgarReynaldo/EagleGUI/blob/master/src/backends/Allegro5/Allegro5WindowManager.cpp#L38">https://github.com/EdgarReynaldo/EagleGUI/blob/master/src/backends/Allegro5/Allegro5WindowManager.cpp#L38</a></p><div class="source-code snippet"><div class="inner"><pre>   EAGLE_ASSERT<span class="k2">(</span>al_is_event_source_registered<span class="k2">(</span>window_queue , <span class="k3">&amp;</span><span class="k2">(</span>a5man-&gt;window_event_source<span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
It passes the assert when closing the window, but then immediately fails the assert. Something is &quot;un-registering&quot; my window_event_source from the window queue.</p><p>There&#39;s also something fishy here in my log :</p><pre>
EAGLE INFO     : Allegro5WindowManager::AddDisplay - adding ALLEGRO_DISPLAY* 0420c2e0 .
...
EAGLE INFO     : A5WindowManagerProcess : Closing display 0420a0b0
</pre><p>
I only ever created <b>one</b> display! Why is their address different?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 06 Oct 2017 16:37:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This is getting interesting!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Fri, 06 Oct 2017 21:35:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I found the issue. <img src="http://www.allegro.cc/forums/smileys/rolleyes.gif" alt="::)" /></p><p>Super facepalm here.</p><p>Look at the highlighted lines :<br /><a href="https://github.com/EdgarReynaldo/EagleGUI/blob/master/src/backends/Allegro5/Allegro5WindowManager.cpp#L56-L66">https://github.com/EdgarReynaldo/EagleGUI/blob/master/src/backends/Allegro5/Allegro5WindowManager.cpp#L56-L66</a></p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span>diff <span class="k3">-</span><span class="k3">-</span>git a<span class="k3">/</span>src<span class="k3">/</span>backends<span class="k3">/</span>Allegro5<span class="k3">/</span>Allegro5WindowManager.cpp b<span class="k3">/</span>src<span class="k3">/</span>backends<span class="k3">/</span>Allegro5<span class="k3">/</span>Allegro5WindowManager.cpp
<span class="number">  2</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> c502bc6..ff83399 <span class="n">100644</span>
<span class="number">  3</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span> a<span class="k3">/</span>src<span class="k3">/</span>backends<span class="k3">/</span>Allegro5<span class="k3">/</span>Allegro5WindowManager.cpp
<span class="number">  4</span><span class="k3">+</span><span class="k3">+</span><span class="k3">+</span> b<span class="k3">/</span>src<span class="k3">/</span>backends<span class="k3">/</span>Allegro5<span class="k3">/</span>Allegro5WindowManager.cpp
<span class="number">  5</span>@@ <span class="k3">-</span><span class="n">52</span>,<span class="n">10</span> <span class="k3">+</span><span class="n">52</span>,<span class="n">18</span> @@ <span class="k1">void</span><span class="k3">*</span> A5WindowManagerProcess<span class="k2">(</span>EagleThread<span class="k3">*</span> thread , <span class="k1">void</span><span class="k3">*</span> manager<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  6</span>             <span class="k1">break</span><span class="k2">;</span>
<span class="number">  7</span>          <span class="k2">}</span>
<span class="number">  8</span>          <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> EAGLE_EVENT_WM_CLOSE_WINDOW<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  9</span><span class="k3">+</span>            
<span class="number"> 10</span><span class="k3">+</span>            Allegro5GraphicsContext<span class="k3">*</span> win <span class="k3">=</span> <span class="k2">(</span>Allegro5GraphicsContext<span class="k3">*</span><span class="k2">)</span>ev.user.data1<span class="k2">;</span>
<span class="number"> 11</span><span class="k3">+</span>            EAGLE_ASSERT<span class="k2">(</span>win<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span><span class="k3">+</span>            <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a><span class="k3">*</span> d <span class="k3">=</span> win-&gt;AllegroDisplay<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span><span class="k3">+</span>            EAGLE_ASSERT<span class="k2">(</span>d<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span><span class="k3">+</span>            
<span class="number"> 15</span>             EagleInfo<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"EAGLE_EVENT_WM_CLOSE_WINDOW received by A5WindowManagerProcess"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 16</span><span class="k3">-</span>            EagleInfo<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> StringPrintF<span class="k2">(</span><span class="s">"A5WindowManagerProcess : Closing display %p"</span> , ev.display.source<span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 17</span><span class="k3">+</span><span class="c">///            EagleInfo() &lt;&lt; StringPrintF("A5WindowManagerProcess : Closing display %p" , ev.display.source) &lt;&lt; std::endl;</span>
<span class="number"> 18</span><span class="k3">+</span>            EagleInfo<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> StringPrintF<span class="k2">(</span><span class="s">"A5WindowManagerProcess : Closing display %p"</span> , d<span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 19</span> 
<span class="number"> 20</span><span class="k3">-</span>            <a href="http://www.allegro.cc/manual/al_unregister_event_source"><span class="a">al_unregister_event_source</span></a><span class="k2">(</span>window_queue , <a href="http://www.allegro.cc/manual/al_get_display_event_source"><span class="a">al_get_display_event_source</span></a><span class="k2">(</span>ev.display.source<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span><span class="k3">+</span><span class="c">///            al_unregister_event_source(window_queue , al_get_display_event_source(ev.display.source));</span>
<span class="number"> 22</span><span class="k3">+</span>            <a href="http://www.allegro.cc/manual/al_unregister_event_source"><span class="a">al_unregister_event_source</span></a><span class="k2">(</span>window_queue , <a href="http://www.allegro.cc/manual/al_get_display_event_source"><span class="a">al_get_display_event_source</span></a><span class="k2">(</span>d<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span> 
<span class="number"> 24</span>             Allegro5GraphicsContext<span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_865.html" target="_blank">window</a> <span class="k3">=</span> <span class="k2">(</span>Allegro5GraphicsContext<span class="k3">*</span><span class="k2">)</span>ev.user.data1<span class="k2">;</span>
<span class="number"> 25</span>             EAGLE_ASSERT<span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_865.html" target="_blank">window</a><span class="k2">)</span><span class="k2">;</span>
</div></div><p>

The event I was sending for EAGLE_EVENT_WM_CLOSE_WINDOW was a <b>user</b> event not a <b>display</b> event, but I was accessing ev.display.source, which was garbage (or in this case happened to be the same as &amp;window_event_source, which un-registered it from the queue and prevented the EAGLE_EVENT_WM_DESTROY message to be received. This has taken me weeks to find. <img src="http://www.allegro.cc/forums/smileys/cry.gif" alt=":&#39;(" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 06 Oct 2017 22:57:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks for updating us on that! Just one of those bugs...</p><p>Maybe we should add a function:</p><div class="source-code snippet"><div class="inner"><pre>ALLEGRO_DISPLAY_EVENT <span class="k3">*</span>al_get_display_event<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> <span class="k3">*</span>event<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

And it would return NULL if the event is not a display event, and otherwise the display event. And the same for all the other event types. And we could deprecate direct access to the ALLEGRO_EVENT structur and you would instead use:</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/al_get_display_event_source"><span class="a">al_get_display_event_source</span></a><span class="k2">(</span>al_get_display_event<span class="k2">(</span>ev<span class="k2">)</span><span class="k2">)</span>
</pre></div></div><p>

Which would crash if the event is the wrong type, and so you would have immediately found this bug. Direct struct access of a union in C++ is bad <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Fri, 06 Oct 2017 23:07:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Glad you got it figured out!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Sat, 07 Oct 2017 07:53:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>EDIT</p><p>I <b>think</b> all the problems are solved (with window destruction at least). Test program now successfully creates and destroys windows on command.</p><p>Drawing is another matter.</p><p>Build is stable and fixed if you want to try things out bammccaig.</p><p>git clone <a href="https://github.com/EdgarReynaldo/EagleGUI.git">https://github.com/EdgarReynaldo/EagleGUI.git</a></p><p>EDIT2</p><p>Drawing text is still messed up. Only the most recently loaded font shows up when drawing to multiple windows.</p><p>EDIT3</p><p>A clean example of multiple windows works fine when using strictly allegro. Text gets drawn normally.</p><p><a href="https://github.com/EdgarReynaldo/EagleGUI/blob/master/src/tests/AllegroMultiWin.hpp">https://github.com/EdgarReynaldo/EagleGUI/blob/master/src/tests/AllegroMultiWin.hpp</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Tue, 10 Oct 2017 05:02:22 +0000</pubDate>
	</item>
</rss>
