<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Buggy shift key behavior with numpad </title>
		<link>http://www.allegro.cc/forums/view/616179</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 17 Apr 2016 09:40:43 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello mi compadres!</p><p>I have discovered somewhat buggy behavior in the keyboard handling in Allegro 5.1.13. I don&#39;t know if it persists in 5.2.0 or not, so I would appreciate someone who already has 5.2.0 installed to test the following code :</p><p>Edit - I am on Windows 10 using MinGW 4.8.1</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><span class="p">#include "allegro5/allegro.h"</span>
<span class="number">   2</span>
<span class="number">   3</span><span class="p">#include &lt;cstdio&gt;</span>
<span class="number">   4</span>
<span class="number">   5</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc , <span class="k1">char</span><span class="k3">*</span><span class="k3">*</span> argv<span class="k2">)</span> <span class="k2">{</span>
<span class="number">   6</span>   
<span class="number">   7</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">   8</span>      <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>
<span class="number">   9</span>   <span class="k2">}</span>
<span class="number">  10</span>
<span class="number">  11</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_install_keyboard"><span class="a">al_install_keyboard</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  12</span>      <span class="k1">return</span> <span class="n">2</span><span class="k2">;</span>
<span class="number">  13</span>   <span class="k2">}</span>
<span class="number">  14</span>   
<span class="number">  15</span>   
<span class="number">  16</span>   <a href="http://www.allegro.cc/manual/al_set_new_display_flags"><span class="a">al_set_new_display_flags</span></a><span class="k2">(</span>ALLEGRO_OPENGL <span class="k3">|</span> ALLEGRO_WINDOWED<span class="k2">)</span><span class="k2">;</span>
<span class="number">  17</span>   
<span class="number">  18</span>   <span class="k1">int</span> width <span class="k3">=</span> <span class="n">800</span><span class="k2">;</span>
<span class="number">  19</span>   <span class="k1">int</span> height <span class="k3">=</span> <span class="n">600</span><span class="k2">;</span>
<span class="number">  20</span>   
<span class="number">  21</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a><span class="k3">*</span> display <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span>width , height<span class="k2">)</span><span class="k2">;</span>
<span class="number">  22</span>   
<span class="number">  23</span>   <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>,<span class="n">0</span>,<span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  24</span>   <a href="http://www.allegro.cc/manual/al_flip_display"><span class="a">al_flip_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  25</span>   
<span class="number">  26</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a><span class="k3">*</span> queue <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_event_queue"><span class="a">al_create_event_queue</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  27</span>   
<span class="number">  28</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a><span class="k3">*</span> timer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span><span class="n">1</span>.<span class="n">0</span><span class="k3">/</span><span class="n">10</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  29</span>   
<span class="number">  30</span>   <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>queue , <a href="http://www.allegro.cc/manual/al_get_keyboard_event_source"><span class="a">al_get_keyboard_event_source</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  31</span>   <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>queue , <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  32</span>   <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>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>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  33</span>
<span class="number">  34</span>   
<span class="number">  35</span>   <span class="k1">bool</span> keys_down<span class="k2">[</span>ALLEGRO_KEY_MAX<span class="k2">]</span><span class="k2">;</span>
<span class="number">  36</span>   <a href="http://www.delorie.com/djgpp/doc/libc/libc_569.html" target="_blank">memset</a><span class="k2">(</span><span class="k3">&amp;</span>keys_down , <span class="n">0</span> , <span class="k1">sizeof</span><span class="k2">(</span>keys_down<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  37</span>   
<span class="number">  38</span>   
<span class="number">  39</span>   <span class="k1">int</span> npkeycode<span class="k2">[</span><span class="n">10</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span>
<span class="number">  40</span>      ALLEGRO_KEY_PAD_0,
<span class="number">  41</span>      ALLEGRO_KEY_PAD_1,
<span class="number">  42</span>      ALLEGRO_KEY_PAD_2,
<span class="number">  43</span>      ALLEGRO_KEY_PAD_3,
<span class="number">  44</span>      ALLEGRO_KEY_PAD_4,
<span class="number">  45</span>      ALLEGRO_KEY_PAD_5,
<span class="number">  46</span>      ALLEGRO_KEY_PAD_6,
<span class="number">  47</span>      ALLEGRO_KEY_PAD_7,
<span class="number">  48</span>      ALLEGRO_KEY_PAD_8,
<span class="number">  49</span>      ALLEGRO_KEY_PAD_9
<span class="number">  50</span>   <span class="k2">}</span><span class="k2">;</span>
<span class="number">  51</span>   
<span class="number">  52</span>   <span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> npkeycodestr<span class="k2">[</span><span class="n">10</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span>
<span class="number">  53</span>      <span class="s">"ALLEGRO_KEY_PAD_0"</span>,
<span class="number">  54</span>      <span class="s">"ALLEGRO_KEY_PAD_1"</span>,
<span class="number">  55</span>      <span class="s">"ALLEGRO_KEY_PAD_2"</span>,
<span class="number">  56</span>      <span class="s">"ALLEGRO_KEY_PAD_3"</span>,
<span class="number">  57</span>      <span class="s">"ALLEGRO_KEY_PAD_4"</span>,
<span class="number">  58</span>      <span class="s">"ALLEGRO_KEY_PAD_5"</span>,
<span class="number">  59</span>      <span class="s">"ALLEGRO_KEY_PAD_6"</span>,
<span class="number">  60</span>      <span class="s">"ALLEGRO_KEY_PAD_7"</span>,
<span class="number">  61</span>      <span class="s">"ALLEGRO_KEY_PAD_8"</span>,
<span class="number">  62</span>      <span class="s">"ALLEGRO_KEY_PAD_9"</span>
<span class="number">  63</span>   <span class="k2">}</span><span class="k2">;</span>
<span class="number">  64</span>   
<span class="number">  65</span>   <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  66</span>
<span class="number">  67</span>   <span class="k1">bool</span> quit <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  68</span>   <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>quit<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  69</span>   
<span class="number">  70</span>   
<span class="number">  71</span>   
<span class="number">  72</span>      <span class="k1">do</span> <span class="k2">{</span>
<span class="number">  73</span>         <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">;</span>
<span class="number">  74</span>         <a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>queue , <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number">  75</span>
<span class="number">  76</span>         <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_DISPLAY_CLOSE<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  77</span>            quit <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  78</span>         <span class="k2">}</span>
<span class="number">  79</span>         <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_DOWN<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  80</span>            keys_down<span class="k2">[</span>ev.keyboard.keycode<span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  81</span>            <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s key pressed\n"</span> , <a href="http://www.allegro.cc/manual/al_keycode_to_name"><span class="a">al_keycode_to_name</span></a><span class="k2">(</span>ev.keyboard.keycode<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  82</span>            <span class="k1">if</span> <span class="k2">(</span>ev.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_ESCAPE<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  83</span>               quit <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  84</span>            <span class="k2">}</span>
<span class="number">  85</span>         <span class="k2">}</span>
<span class="number">  86</span>         <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_UP<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  87</span>            <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s key released\n"</span> , <a href="http://www.allegro.cc/manual/al_keycode_to_name"><span class="a">al_keycode_to_name</span></a><span class="k2">(</span>ev.keyboard.keycode<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  88</span>            keys_down<span class="k2">[</span>ev.keyboard.keycode<span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  89</span>         <span class="k2">}</span>
<span class="number">  90</span>
<span class="number">  91</span>         <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  92</span>   
<span class="number">  93</span>            <span class="k1">if</span> <span class="k2">(</span>keys_down<span class="k2">[</span>ALLEGRO_KEY_LSHIFT<span class="k2">]</span> <span class="k3">|</span><span class="k3">|</span> keys_down<span class="k2">[</span>ALLEGRO_KEY_RSHIFT<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  94</span>               <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Key SHIFT down "</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  95</span>               
<span class="number">  96</span>               <span class="k1">bool</span> npkeydown <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  97</span>               <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span> <span class="k2">;</span> i <span class="k3">&lt;</span> <span class="n">10</span> <span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  98</span>                  <span class="k1">if</span> <span class="k2">(</span>keys_down<span class="k2">[</span>npkeycode<span class="k2">[</span>i<span class="k2">]</span><span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  99</span>                     npkeydown <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 100</span>                  <span class="k2">}</span>
<span class="number"> 101</span>               <span class="k2">}</span>
<span class="number"> 102</span>               <span class="k1">if</span> <span class="k2">(</span>npkeydown<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 103</span>                  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Numpad key down : "</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 104</span>                  <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span> <span class="k2">;</span> i <span class="k3">&lt;</span> <span class="n">10</span> <span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 105</span>                     <span class="k1">if</span> <span class="k2">(</span>keys_down<span class="k2">[</span>npkeycode<span class="k2">[</span>i<span class="k2">]</span><span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 106</span>                        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s down "</span> , npkeycodestr<span class="k2">[</span>i<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 107</span>                     <span class="k2">}</span>
<span class="number"> 108</span>                  <span class="k2">}</span>
<span class="number"> 109</span>               <span class="k2">}</span>
<span class="number"> 110</span>               <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 111</span>                  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Numpad keys all up "</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 112</span>               <span class="k2">}</span>
<span class="number"> 113</span>            <span class="k2">}</span>
<span class="number"> 114</span>            <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 115</span>               <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Key SHIFT up "</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 116</span>               <span class="k1">bool</span> npkeydown <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 117</span>               <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span> <span class="k2">;</span> i <span class="k3">&lt;</span> <span class="n">10</span> <span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 118</span>                  <span class="k1">if</span> <span class="k2">(</span>keys_down<span class="k2">[</span>npkeycode<span class="k2">[</span>i<span class="k2">]</span><span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 119</span>                     npkeydown <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 120</span>                  <span class="k2">}</span>
<span class="number"> 121</span>               <span class="k2">}</span>
<span class="number"> 122</span>               <span class="k1">if</span> <span class="k2">(</span>npkeydown<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 123</span>                  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Numpad key down : "</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 124</span>                  <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span> <span class="k2">;</span> i <span class="k3">&lt;</span> <span class="n">10</span> <span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 125</span>                     <span class="k1">if</span> <span class="k2">(</span>keys_down<span class="k2">[</span>npkeycode<span class="k2">[</span>i<span class="k2">]</span><span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 126</span>                        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s down "</span> , npkeycodestr<span class="k2">[</span>i<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 127</span>                     <span class="k2">}</span>
<span class="number"> 128</span>                  <span class="k2">}</span>
<span class="number"> 129</span>               <span class="k2">}</span>
<span class="number"> 130</span>               <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 131</span>                  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Numpad keys all up "</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 132</span>               <span class="k2">}</span>
<span class="number"> 133</span>            <span class="k2">}</span>
<span class="number"> 134</span>            <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 135</span>         <span class="k2">}</span>
<span class="number"> 136</span>      <span class="k2">}</span> <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_is_event_queue_empty"><span class="a">al_is_event_queue_empty</span></a><span class="k2">(</span>queue<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 137</span>   
<span class="number"> 138</span>   <span class="k2">}</span>
<span class="number"> 139</span>   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 140</span><span class="k2">}</span>
</div></div><p>

What it does is track key up and down events, and the state of the left and right shift keys and the numpad keys. I first noticed problems when I was trying to get my program to work and I couldn&#39;t figure out why it wasn&#39;t.</p><p>Here are the problems I have discovered so far. Please test them on your machines with 5.2.0. I will get around to compiling 5.2.0 here in the next few days when I can.</p><p>Problems :<br />1. If you press one SHIFT key and then the other you get both key down events, but then you no longer receive release or press events for either SHIFT key until you release both of them. This happens regardless of the state of the num lock key. This bug does not affect the CTRL or ALT keys.</p><p>2. This only happens with num lock on for me, but if you press shift and then a num pad key and are still holding shift, you get an erroneous key up event on the SHIFT key you were holding. If you then release the num pad key while still holding SHIFT, then you get a key down event on the SHIFT key.</p><p>I don&#39;t know if there are reasons for this behavior, but it seems incorrect to me, as the state of the shift keys are not correctly reported and the key up and key down events are incorrect as well.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Tue, 05 Apr 2016 17:54:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well, the first issue is because Allegro uses the regular Windows API for keyboard input. I made a patch to switch to Raw Input a few years ago, but by using that you would bypass keyboard remappings. IIRC, you can get the best of both worlds by using the DirectInput keyboard API, but that&#39;s ridiculously complicated...</p><p>Try the executables in the Release folder of the attachement to see the differences between the regular WM_KEYDOWN and WM_KEYUP system, and WM_INPUT.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (torhu)</author>
		<pubDate>Sat, 09 Apr 2016 08:52:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Bump to give me time to try out Torhu&#39;s examples.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sun, 17 Apr 2016 09:40:43 +0000</pubDate>
	</item>
</rss>
