<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Keyboard input handling changed from 4.1.18 to 4.2.0 ??</title>
		<link>http://www.allegro.cc/forums/view/587629</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 22 Sep 2006 00:03:34 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve not posted for some time, but now I have started to put my Allegro game &#39;The Next Train&#39; from 4.1.18 to 4.2.0, but now there&#39;s one little change of behavior I have observed: Keypresses are no longer immediately recognized and cannot be handled properly. This leads to missing key strokes or multiple keypresses if the key is held for a little while. It might be that there&#39;s something changed with the thread priorities internally? The application code is unchanged and it&#39;s the main loop of my &#39;Game Framework&#39; project in the depot. Here it is: </p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>  <span class="k1">while</span><span class="k2">(</span><span class="k1">true</span><span class="k2">)</span></td></tr><tr><td class="number">2</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">3</td><td>    <span class="k1">bool</span> needsRefresh <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td>    cur_skip <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">5</td><td>    <span class="k1">while</span><span class="k2">(</span> timer_counter <span class="k3">&gt;</span> <span class="n">0</span> <span class="k3">|</span><span class="k3">|</span> normal_fps<span class="k3">=</span><span class="k3">=</span><span class="n">0</span> <span class="k2">)</span></td></tr><tr><td class="number">6</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">7</td><td>      cur.advance_cputime <span class="k3">-</span><span class="k3">=</span> perf_counter<span class="k2">;</span></td></tr><tr><td class="number">8</td><td>      <span class="c">// handle user input</span></td></tr><tr><td class="number">9</td><td>      <span class="k1">bool</span> have_scrolled <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>      <span class="k1">if</span><span class="k2">(</span> v_scroll_hndls.size<span class="k2">(</span><span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">0</span> <span class="k2">)</span></td></tr><tr><td class="number">11</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">12</td><td>        <span class="k1">for</span><span class="k2">(</span> std::vector<span class="k3">&lt;</span>ScrollingIfc<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>iterator it <span class="k3">=</span> v_scroll_hndls.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> it <span class="k3">!</span><span class="k3">=</span> v_scroll_hndls.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>it <span class="k2">)</span></td></tr><tr><td class="number">13</td><td>        <span class="k2">{</span></td></tr><tr><td class="number">14</td><td>          have_scrolled <span class="k3">=</span> <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>handle_scroll<span class="k2">(</span><span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> have_scrolled<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">16</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">17</td><td>      <span class="k1">if</span><span class="k2">(</span> <span class="k2">(</span> <span class="k3">!</span>have_scrolled <span class="k3">&amp;</span><span class="k3">&amp;</span> <a href="http://www.allegro.cc/manual/keypressed" target="_blank"><span class="a">keypressed</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k2">)</span> <span class="k2">)</span></td></tr><tr><td class="number">18</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">19</td><td>        <span class="k1">const</span> <span class="k1">int</span> scan_code <span class="k3">=</span> <a href="http://www.allegro.cc/manual/readkey" target="_blank"><span class="a">readkey</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">8</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>        <span class="k1">if</span><span class="k2">(</span> <a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_ESC<span class="k2">]</span> <span class="k2">)</span></td></tr><tr><td class="number">21</td><td>        <span class="k2">{</span></td></tr><tr><td class="number">22</td><td>          sys_dialog.quit<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">24</td><td>        <span class="k1">if</span><span class="k2">(</span> scan_code <span class="k3">=</span><span class="k3">=</span> KEY_F10 <span class="k2">)</span></td></tr><tr><td class="number">25</td><td>          sys_dialog.ingame_dialog<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>        <span class="k1">const</span> <span class="k1">int</span> shift_flags <span class="k3">=</span> <a href="http://www.allegro.cc/manual/key_shifts" target="_blank"><span class="a">key_shifts</span></a> <span class="k3">&amp;</span> <span class="k2">(</span> KB_SHIFT_FLAG <span class="k3">|</span> KB_CTRL_FLAG <span class="k3">|</span> KB_ALT_FLAG <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>        <span class="k1">for</span><span class="k2">(</span> std::vector<span class="k3">&lt;</span>KbdHndlIfc<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>iterator it <span class="k3">=</span> v_kbd_hndls.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> it <span class="k3">!</span><span class="k3">=</span> v_kbd_hndls.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>it <span class="k2">)</span></td></tr><tr><td class="number">28</td><td>        <span class="k2">{</span></td></tr><tr><td class="number">29</td><td>          <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>handle_kbd<span class="k2">(</span> scan_code, shift_flags <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">31</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">32</td><td>&#160;</td></tr><tr><td class="number">33</td><td>      <span class="c">// Book keeping</span></td></tr><tr><td class="number">34</td><td>      <span class="k3">+</span><span class="k3">+</span>cur.logic<span class="k2">;</span></td></tr><tr><td class="number">35</td><td>      <span class="k1">if</span><span class="k2">(</span> normal_fps <span class="k3">&gt;</span> <span class="n">0</span> <span class="k2">)</span></td></tr><tr><td class="number">36</td><td>        <span class="k3">-</span><span class="k3">-</span>timer_counter<span class="k2">;</span></td></tr><tr><td class="number">37</td><td>      <span class="k3">+</span><span class="k3">+</span>cur_skip<span class="k2">;</span></td></tr><tr><td class="number">38</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">39</td><td>        <span class="k1">for</span><span class="k2">(</span> std::vector<span class="k3">&lt;</span>GameClockIfc<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>iterator it <span class="k3">=</span> v_game_clock_hndls.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> it <span class="k3">!</span><span class="k3">=</span> v_game_clock_hndls.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>it <span class="k2">)</span></td></tr><tr><td class="number">40</td><td>        <span class="k2">{</span></td></tr><tr><td class="number">41</td><td>          <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>advance_game_time<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">43</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">44</td><td>      cur.advance_cputime <span class="k3">+</span><span class="k3">=</span> perf_counter<span class="k2">;</span></td></tr><tr><td class="number">45</td><td>      <span class="k1">if</span><span class="k2">(</span> cur_skip <span class="k3">&gt;</span><span class="k3">=</span> max_skip <span class="k2">)</span></td></tr><tr><td class="number">46</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">47</td><td>        timer_counter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td>        <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">49</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">50</td><td>      needsRefresh <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">51</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">52</td><td>    <span class="k1">if</span><span class="k2">(</span> needsRefresh <span class="k2">)</span></td></tr><tr><td class="number">53</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">54</td><td>      cur.display_cputime <span class="k3">-</span><span class="k3">=</span> perf_counter<span class="k2">;</span></td></tr><tr><td class="number">55</td><td>      <span class="c">// draw backbuffer</span></td></tr><tr><td class="number">56</td><td>      <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span><span class="k1">const</span> draw_buffer <span class="k3">=</span> display_engine.draw_buffer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">57</td><td>      display_engine.prepare_draw_buffer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">58</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">59</td><td>        <span class="k1">for</span><span class="k2">(</span> std::vector<span class="k3">&lt;</span>ViewPortIfc<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>iterator it <span class="k3">=</span> v_viewports.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> it <span class="k3">!</span><span class="k3">=</span> v_viewports.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>it <span class="k2">)</span></td></tr><tr><td class="number">60</td><td>        <span class="k2">{</span></td></tr><tr><td class="number">61</td><td>          <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>display<span class="k2">(</span> draw_buffer <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">62</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">63</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">64</td><td>      cur.display_cputime <span class="k3">+</span><span class="k3">=</span> perf_counter<span class="k2">;</span></td></tr><tr><td class="number">65</td><td>&#160;</td></tr><tr><td class="number">66</td><td>      <span class="c">// display backbuffer</span></td></tr><tr><td class="number">67</td><td>      needsRefresh <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">68</td><td>      cur.show_cputime <span class="k3">-</span><span class="k3">=</span> perf_counter<span class="k2">;</span></td></tr><tr><td class="number">69</td><td>      display_engine.display_draw_buffer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">70</td><td>      cur.show_cputime <span class="k3">+</span><span class="k3">=</span> perf_counter<span class="k2">;</span></td></tr><tr><td class="number">71</td><td>      cur.displayed<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">72</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">73</td><td>    <span class="k1">else</span></td></tr><tr><td class="number">74</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">75</td><td>      <span class="k1">if</span><span class="k2">(</span> rest_dur_ms <span class="k3">&gt;</span> <span class="n">0</span> <span class="k2">)</span></td></tr><tr><td class="number">76</td><td>        <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span> rest_dur_ms <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">77</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">78</td><td>    cur.iteration<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">79</td><td>    <span class="k1">if</span><span class="k2">(</span> fps_counter <span class="k3">&gt;</span> <span class="n">0</span> <span class="k2">)</span></td></tr><tr><td class="number">80</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">81</td><td>      displayed  <span class="k3">=</span> cur<span class="k2">;</span></td></tr><tr><td class="number">82</td><td>      displayed.perf_counter_ <span class="k3">=</span> perf_counter<span class="k2">;</span></td></tr><tr><td class="number">83</td><td>      cur.logic  <span class="k3">=</span> cur.iteration <span class="k3">=</span> cur.displayed <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">84</td><td>      cur.advance_cputime <span class="k3">=</span> cur.display_cputime <span class="k3">=</span> cur.show_cputime <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">85</td><td>      fps_counter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">86</td><td>      perf_counter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">87</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">88</td><td>  <span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (tobing)</author>
		<pubDate>Tue, 19 Sep 2006 21:13:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What platform?</p><p>As an aside, mixing key[] and keypressed()/readkey() like that is a bit ugly, and not really how they&#39;re meant to be used...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Tue, 19 Sep 2006 21:40:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Windows XP Home SP2, and I&#39;m using the MSVC 2003.NET compiler. </p><p>Edit: I have changed that to </p><div class="source-code snippet"><div class="inner"><pre>        <span class="k1">if</span><span class="k2">(</span> scan_code <span class="k3">=</span><span class="k3">=</span> KEY_ESC <span class="k2">)</span>
</pre></div></div><p>

but there&#39;s no change of behavior. </p><p>Also, I had added alfont 1.9.1, masking 0.80 and lua 5.1.1 to the new version, but didn&#39;t use them yet. So I removed the linkage dependencies, again without change of behavior. </p><p>Edit: Now I have only linked my object files with allegro 4.1.18 import libraries versus allegro 4.2.0 import libraries. Behavior is OK for 4.1.18, but sluggy as described above with 4.2.0. Debugging didn&#39;t show me any differences so far... </p><p>Third and last Edit: Got it. My fault... </p><p>Some time ago I had requested a change to one structure inside allegro, which was rejected because it can be done using allegro as it is. The problem then was, I couldn&#39;t do it that way, so I implemented that change into my 4.1.18. Fine, now as I put the same change into 4.2.0 I didn&#39;t make it complete, so that was the reason. Sorry. </p><p>Ah, Evert, at this place I could avoid using the key[]-array, but not at another place: Scrolling. I want the program to scroll in 8 directions, using the cursor keys, so pressing two of them at the same time and hold them pressed should move the viewport in the desired direction. This will not work with readkey(), or will it?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (tobing)</author>
		<pubDate>Tue, 19 Sep 2006 22:13:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>readkey() gets the benefits of &quot;key repetition&quot;, but only for one key. That&#39;s what the low-level stuff provides directly.</p><p>If you want a behavior of :<br />- delay before key repeat: 500 ms<br />- interval of repetition: 100 ms<br />for several keys at once, you need to use the key[] array, and for each important key: keep track of how long it has been kept pressed to trigger the &quot;repeat&quot; event appropriately.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Audric)</author>
		<pubDate>Fri, 22 Sep 2006 00:03:34 +0000</pubDate>
	</item>
</rss>
