<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Real-Time Text Input</title>
		<link>http://www.allegro.cc/forums/view/606417</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 20 Feb 2011 04:02:16 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Since I&#39;ve been having trouble with it and there doesn&#39;t seem to be any examples using the Allegro 5 API, I thought I would ask here: is there a tidy way to implement a function that alters a character string in real-time?</p><p>Allegro timing is a pain, and I&#39;m trying to display a character string on the screen in real-time as it&#39;s being edited through keyboard input. Any help would be appreciated.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gatleos)</author>
		<pubDate>Wed, 16 Feb 2011 15:49:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>How about ex_font_justify?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Wang)</author>
		<pubDate>Wed, 16 Feb 2011 15:55:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What exactly does ex_font_justify do? It couldn&#39;t possibly do all of what I&#39;m asking by itself.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gatleos)</author>
		<pubDate>Wed, 16 Feb 2011 16:04:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>See TextEntry class in nihgui.cpp
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Wang)</author>
		<pubDate>Wed, 16 Feb 2011 16:15:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You can either use one of the GUI libraries on the Depot (I&#39;m not sure if any of them supports A5 yet though), or you can whip up your own text entry function. A simple one would, in pseudocode, look something like this:
</p><pre>
string read_user_input(string initial = &quot;&quot;) {
	// Set the current string buffer to the initial value
	string str = initial;

	// Loop until the user presses Esc or Enter
	do {
		int k = readkey();
		switch (k) {
			// a few special keys:
			// Esc cancels
			case Escape: return initial;
			
			// Return commits
			case Return: return str;

			// Backspace deletes last character
			case Backspace:
				if (str.length &gt; 0)
					str.remove_last_char();
				break;

			// Any other key gets appended to the buffer...
			default:
				// but only if it&#39;s a regular key
				if (!is_special_key(k))
					str += key_to_ascii(k);
				break;
		}
		// After each keypress, update the display
		display_the_string(str);
	} while (1);
}
</pre><p>
This is a very simple example, you&#39;ll need to flesh it out a lot more to get the functionality of a typical textbox, but you get the idea. One of the first steps after getting this one working, you might want to add a cursor position, and instead of manipulating the end of the string only, you&#39;d insert and delete at the cursor position, and display a cursor in the textbox.<br /><img src="http://www.allegro.cc/forums/smileys/angry.gif" alt="&gt;:(" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tobias Dammers)</author>
		<pubDate>Thu, 17 Feb 2011 01:50:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Tobis: That would not really be real-time text input though. It would halt execution and wait for the function to return.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Jonatan Hedborg)</author>
		<pubDate>Thu, 17 Feb 2011 03:43:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Is there a version of keycode_to_ascii in Allegro 5? If not, this will get messy fast. Anyway, I can&#39;t seem to shorten the string with backspace. The closest I can get is inserting a space in the string, but then I get a bunch of spaces tacked onto the end. Is there a simpler way to implement a backspace feature?</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="k1">else</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="number">  2</span><span class="k2">{</span>
<span class="number">  3</span><span class="k1">switch</span><span class="k2">(</span>ev.keyboard.keycode<span class="k2">)</span>
<span class="number">  4</span><span class="k2">{</span>
<span class="number">  5</span>  <span class="k1">case</span> <span class="k2">(</span>ALLEGRO_KEY_BACKSPACE<span class="k2">)</span><span class="k2">:</span>
<span class="number">  6</span>  <span class="k2">{</span>
<span class="number">  7</span>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>gamename<span class="k2">)</span><span class="k3">&gt;</span><span class="n">0</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> menu<span class="k3">=</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span>
<span class="number">  8</span>    <span class="k2">{</span>
<span class="number">  9</span>      <span class="k3">-</span><span class="k3">-</span>num<span class="k2">;</span>
<span class="number"> 10</span>      gamename<span class="k2">[</span>num<span class="k2">]</span><span class="k3">=</span><span class="s">' '</span><span class="k2">;</span>
<span class="number"> 11</span>    <span class="k2">}</span>
<span class="number"> 12</span>    <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 13</span>  <span class="k2">}</span>
<span class="number"> 14</span>  <span class="k1">case</span> <span class="k2">(</span>ALLEGRO_KEY_DOWN<span class="k2">)</span><span class="k2">:</span>
<span class="number"> 15</span>  <span class="k2">{</span>
<span class="number"> 16</span>    <span class="k1">if</span><span class="k2">(</span>menu<span class="k3">&lt;</span><span class="n">6</span><span class="k2">)</span>
<span class="number"> 17</span>      menu<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 18</span>    <span class="k1">else</span>
<span class="number"> 19</span>      menu<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 20</span>    <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 21</span>  <span class="k2">}</span>
<span class="number"> 22</span>  <span class="k1">case</span> <span class="k2">(</span>ALLEGRO_KEY_UP<span class="k2">)</span><span class="k2">:</span>
<span class="number"> 23</span>  <span class="k2">{</span>
<span class="number"> 24</span>    <span class="k1">if</span><span class="k2">(</span>menu&gt;0<span class="k2">)</span>
<span class="number"> 25</span>      menu--<span class="k2">;</span>
<span class="number"> 26</span>    <span class="k1">else</span>
<span class="number"> 27</span>      menu<span class="k3">=</span><span class="n">6</span><span class="k2">;</span>
<span class="number"> 28</span>    <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 29</span>  <span class="k2">}</span>
<span class="number"> 30</span>  <span class="k1">case</span> <span class="k2">(</span>ALLEGRO_KEY_ENTER<span class="k2">)</span><span class="k2">:</span>
<span class="number"> 31</span>  <span class="k2">{</span>
<span class="number"> 32</span>    <span class="k1">if</span><span class="k2">(</span>menu<span class="k3">=</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span>
<span class="number"> 33</span>    <span class="k2">{</span>
<span class="number"> 34</span>      
<span class="number"> 35</span>    <span class="k2">}</span>
<span class="number"> 36</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>menu<span class="k3">=</span><span class="k3">=</span><span class="n">1</span><span class="k2">)</span>
<span class="number"> 37</span>    <span class="k2">{</span>
<span class="number"> 38</span>      
<span class="number"> 39</span>    <span class="k2">}</span>
<span class="number"> 40</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>menu<span class="k3">=</span><span class="k3">=</span><span class="n">2</span><span class="k2">)</span>
<span class="number"> 41</span>    <span class="k2">{</span>
<span class="number"> 42</span>      
<span class="number"> 43</span>    <span class="k2">}</span>
<span class="number"> 44</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>menu<span class="k3">=</span><span class="k3">=</span><span class="n">3</span><span class="k2">)</span>
<span class="number"> 45</span>    <span class="k2">{</span>
<span class="number"> 46</span>      
<span class="number"> 47</span>    <span class="k2">}</span>
<span class="number"> 48</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>menu<span class="k3">=</span><span class="k3">=</span><span class="n">4</span><span class="k2">)</span>
<span class="number"> 49</span>    <span class="k2">{</span>
<span class="number"> 50</span>      
<span class="number"> 51</span>    <span class="k2">}</span>
<span class="number"> 52</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>menu<span class="k3">=</span><span class="k3">=</span><span class="n">5</span><span class="k2">)</span>
<span class="number"> 53</span>    <span class="k2">{</span>
<span class="number"> 54</span>      
<span class="number"> 55</span>    <span class="k2">}</span>
<span class="number"> 56</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>menu<span class="k3">=</span><span class="k3">=</span><span class="n">6</span><span class="k2">)</span>
<span class="number"> 57</span>    <span class="k2">{</span>
<span class="number"> 58</span>      start_game<span class="k3">=</span><span class="k1">true</span><span class="k2">;</span>
<span class="number"> 59</span>      settings<span class="k3">=</span><span class="k1">false</span><span class="k2">;</span>
<span class="number"> 60</span>    <span class="k2">}</span>
<span class="number"> 61</span>  <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 62</span>  <span class="k2">}</span>
<span class="number"> 63</span>  <span class="k1">case</span> <span class="k2">(</span>ALLEGRO_KEY_ESCAPE<span class="k2">)</span><span class="k2">:</span>
<span class="number"> 64</span>  <span class="k2">{</span>
<span class="number"> 65</span>    settings<span class="k3">=</span><span class="k1">false</span><span class="k2">;</span>
<span class="number"> 66</span>    <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 67</span>  <span class="k2">}</span>
<span class="number"> 68</span>  default:
<span class="number"> 69</span>  <span class="k2">{</span>
<span class="number"> 70</span>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>gamename<span class="k2">)</span> <span class="k3">&lt;</span> <span class="n">25</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> menu<span class="k3">=</span><span class="k3">=</span><span class="n">0</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> ev.keyboard.keycode<span class="k3">&lt;</span><span class="n">27</span><span class="k2">)</span>
<span class="number"> 71</span>    <span class="k2">{</span>
<span class="number"> 72</span>      gamename<span class="k2">[</span>num<span class="k2">]</span><span class="k3">=</span>ev.keyboard.keycode<span class="k3">+</span><span class="n">96</span><span class="k2">;</span>
<span class="number"> 73</span>      num<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 74</span>    <span class="k2">}</span>
<span class="number"> 75</span>    <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 76</span>  <span class="k2">}</span>
<span class="number"> 77</span><span class="k2">}</span>
<span class="number"> 78</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gatleos)</author>
		<pubDate>Thu, 17 Feb 2011 03:59:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Did you not look at TextEntry in nihgui.cpp? It shows how to do it all quite clearly.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Thu, 17 Feb 2011 04:02:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Oh, I forgot to mention: I have no idea what nihgui.cpp is and can&#39;t find it anywhere. So yeah.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gatleos)</author>
		<pubDate>Thu, 17 Feb 2011 04:13:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The examples and that file are in the source code package.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Thu, 17 Feb 2011 04:17:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><a href="http://svn.tomasu.org/index.cgi/allegro/view/allegro/branches/5.0/examples/nihgui.cpp">examples/nihgui.cpp</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Thu, 17 Feb 2011 04:18:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I was working on a comprehensive typeable textarea some time ago.  I&#39;ve attached the program.</p><p><span class="remote-thumbnail"><span class="json">{"name":"603392","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/7\/1\/71eff6d499bf8da1ea16356015e10ae1.png","w":1053,"h":627,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/7\/1\/71eff6d499bf8da1ea16356015e10ae1"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/7/1/71eff6d499bf8da1ea16356015e10ae1-240.jpg" alt="603392" width="240" height="142" /></span></p><p>I put this on hold because I&#39;m waiting on the <a href="http://www.allegro.cc/forums/thread/606034">clipboard stuff</a> ( <img src="http://www.allegro.cc/forums/smileys/cool.gif" alt="8-)" /> ) to come in.  But as of now it does one line of text and you can hilight, delete hilighted text, ctrl-jump across words, ctrl-shift-jump across words, etc.  Ideally, it should support multiple lines and copy/paste/undo operations.</p><p>Though it&#39;s not finished, perhaps you can get some help by looking at it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mark Oates)</author>
		<pubDate>Thu, 17 Feb 2011 04:52:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The thing is, I need to draw the text to the screen in a very specific way. I just need a function that returns a string, nothing more.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gatleos)</author>
		<pubDate>Thu, 17 Feb 2011 05:24:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/606417/903801#target">Gatleos</a> said:</div><div class="quote"><p>The thing is, I need to draw the text to the screen in a very specific way. I just need a function that returns a string, nothing more.</p></div></div><p>How would that work? all you get from The OS or Allegro is a sequence of events from the keyboard. Not any kind of string. So handling the actual input is far more complex than I think you think it is.</p><p>Now you can always just make a function that returns a string of the <i>current</i> contents of the text entry, but the code that actually handles the keyboard events is going to be a bit more complex.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Thu, 17 Feb 2011 05:38:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://">Gatleos</a> said:</div><div class="quote"><p>The thing is, I need to draw the text to the screen in a very specific way. I just need a function that returns a string, nothing more.</p></div></div><p>

You can also do something like this:</p><p>I&#39;m using Unicode but you can change that.</p><p>It&#39;s very simple.</p><p>BTW can you download the example .exe (attached) and check if the beeps sounds on your machine?</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="number">   2</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number">   3</span>
<span class="number">   4</span><span class="p">#define ALLEGRO_STATICLINK</span>
<span class="number">   5</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">   6</span><span class="p">#include "allegro5/allegro_font.h"</span>
<span class="number">   7</span><span class="p">#include "allegro5/allegro_ttf.h"</span>
<span class="number">   8</span>
<span class="number">   9</span><span class="k1">const</span> <span class="k1">float</span> FPS <span class="k3">=</span> <span class="n">60</span><span class="k2">;</span>
<span class="number">  10</span><a href="http://www.allegro.cc/manual/ALLEGRO_USTR"><span class="a">ALLEGRO_USTR</span></a> <span class="k3">*</span>string<span class="k2">;</span>
<span class="number">  11</span><a href="http://www.allegro.cc/manual/ALLEGRO_FONT"><span class="a">ALLEGRO_FONT</span></a> <span class="k3">*</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a><span class="k2">;</span>
<span class="number">  12</span><a href="http://www.allegro.cc/manual/ALLEGRO_FONT"><span class="a">ALLEGRO_FONT</span></a> <span class="k3">*</span>font2<span class="k2">;</span>
<span class="number">  13</span>
<span class="number">  14</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="number">  15</span><span class="k2">{</span>
<span class="number">  16</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> NULL<span class="k2">;</span>
<span class="number">  17</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a> <span class="k3">*</span>event_queue <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  18</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> NULL<span class="k2">;</span>
<span class="number">  19</span>   <span class="k1">bool</span> redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  20</span>
<span class="number">  21</span>
<span class="number">  22</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="number">  23</span>   <a href="http://www.allegro.cc/manual/al_init_font_addon"><span class="a">al_init_font_addon</span></a><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_init_ttf_addon"><span class="a">al_init_ttf_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  25</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> FPS<span class="k2">)</span><span class="k2">;</span>
<span class="number">  26</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="number">  27</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><span class="n">800</span>, <span class="n">600</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  28</span>
<span class="number">  29</span>   string <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_ustr_new"><span class="a">al_ustr_new</span></a><span class="k2">(</span><span class="s">""</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  30</span>
<span class="number">  31</span>
<span class="number">  32</span>   event_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">  33</span>
<span class="number">  34</span>   <a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a> <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_ttf_font"><span class="a">al_load_ttf_font</span></a><span class="k2">(</span><span class="s">"consola.ttf"</span>, <span class="n">60</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  35</span>   font2 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_ttf_font"><span class="a">al_load_ttf_font</span></a><span class="k2">(</span><span class="s">"consola.ttf"</span>, <span class="n">30</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  36</span>
<span class="number">  37</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>event_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">  38</span>
<span class="number">  39</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>event_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">  40</span>
<span class="number">  41</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>event_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">  42</span>
<span class="number">  43</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">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  44</span>
<span class="number">  45</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">  46</span>
<span class="number">  47</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">  48</span>
<span class="number">  49</span>   <span class="k1">while</span><span class="k2">(</span><span class="n">1</span><span class="k2">)</span>
<span class="number">  50</span>   <span class="k2">{</span>
<span class="number">  51</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">  52</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>event_queue, <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number">  53</span>
<span class="number">  54</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">  55</span>         redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  56</span>      <span class="k2">}</span>
<span class="number">  57</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> ALLEGRO_EVENT_DISPLAY_CLOSE<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  58</span>         <span class="k1">break</span><span class="k2">;</span>
<span class="number">  59</span>      <span class="k2">}</span>
<span class="number">  60</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> ALLEGRO_EVENT_KEY_CHAR<span class="k2">)</span>
<span class="number">  61</span>      <span class="k1">switch</span><span class="k2">(</span>ev.keyboard.unichar<span class="k2">)</span> <span class="k2">{</span> <span class="c">//you can change that by ev.keyboard.keycode</span>
<span class="number">  62</span>            <span class="k1">case</span> <span class="n">0</span>X0071:
<span class="number">  63</span>               <a href="http://www.allegro.cc/manual/al_ustr_append_cstr"><span class="a">al_ustr_append_cstr</span></a><span class="k2">(</span>string, <span class="s">"q"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  64</span>               Beep<span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<span class="n">200</span><span class="k3">+</span><span class="n">500</span>,<span class="n">20</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  65</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number">  66</span>
<span class="number">  67</span>            <span class="k1">case</span> <span class="n">0</span>X0077: <span class="c">// and change also this by its corresponding key codes (ALLERGO_KEY_Q etc...)</span>
<span class="number">  68</span>               <a href="http://www.allegro.cc/manual/al_ustr_append_cstr"><span class="a">al_ustr_append_cstr</span></a><span class="k2">(</span>string, <span class="s">"w"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  69</span>               Beep<span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<span class="n">200</span><span class="k3">+</span><span class="n">500</span>,<span class="n">20</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  70</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number">  71</span>
<span class="number">  72</span>            <span class="k1">case</span> <span class="n">0</span>X0065:
<span class="number">  73</span>               <a href="http://www.allegro.cc/manual/al_ustr_append_cstr"><span class="a">al_ustr_append_cstr</span></a><span class="k2">(</span>string, <span class="s">"e"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  74</span>               Beep<span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<span class="n">200</span><span class="k3">+</span><span class="n">500</span>,<span class="n">20</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  75</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number">  76</span>
<span class="number">  77</span>            <span class="k1">case</span> <span class="n">0</span>X072:
<span class="number">  78</span>               <a href="http://www.allegro.cc/manual/al_ustr_append_cstr"><span class="a">al_ustr_append_cstr</span></a><span class="k2">(</span>string, <span class="s">"r"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  79</span>               Beep<span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<span class="n">200</span><span class="k3">+</span><span class="n">500</span>,<span class="n">20</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  80</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number">  81</span>
<span class="number">  82</span>            <span class="k1">case</span> <span class="n">0</span>X0074:
<span class="number">  83</span>               <a href="http://www.allegro.cc/manual/al_ustr_append_cstr"><span class="a">al_ustr_append_cstr</span></a><span class="k2">(</span>string, <span class="s">"t"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  84</span>               Beep<span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<span class="n">200</span><span class="k3">+</span><span class="n">500</span>,<span class="n">20</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  85</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number">  86</span>
<span class="number">  87</span>            <span class="k1">case</span> <span class="n">0</span>X0079:
<span class="number">  88</span>               <a href="http://www.allegro.cc/manual/al_ustr_append_cstr"><span class="a">al_ustr_append_cstr</span></a><span class="k2">(</span>string, <span class="s">"y"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  89</span>               Beep<span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<span class="n">200</span><span class="k3">+</span><span class="n">500</span>,<span class="n">20</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  90</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number">  91</span>
<span class="number">  92</span>            <span class="k1">case</span> <span class="n">0</span>X0075:
<span class="number">  93</span>               <a href="http://www.allegro.cc/manual/al_ustr_append_cstr"><span class="a">al_ustr_append_cstr</span></a><span class="k2">(</span>string, <span class="s">"u"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  94</span>               Beep<span class="k2">(</span><span class="n">500</span>,<span class="n">20</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  95</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number">  96</span>
<span class="number">  97</span>            <span class="k1">case</span> <span class="n">0</span>X00f1:
<span class="number">  98</span>               <a href="http://www.allegro.cc/manual/al_ustr_append_cstr"><span class="a">al_ustr_append_cstr</span></a><span class="k2">(</span>string, <span class="s">"ñ"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  99</span>               Beep<span class="k2">(</span><span class="n">500</span>,<span class="n">20</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 100</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 101</span>
<span class="number"> 102</span>            <span class="k1">case</span> <span class="n">0</span>X0008:
<span class="number"> 103</span>               <a href="http://www.allegro.cc/manual/al_ustr_remove_chr"><span class="a">al_ustr_remove_chr</span></a><span class="k2">(</span>string, <a href="http://www.allegro.cc/manual/al_ustr_offset"><span class="a">al_ustr_offset</span></a><span class="k2">(</span>string, <span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 104</span>               Beep<span class="k2">(</span><span class="n">500</span>,<span class="n">20</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 105</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 106</span>
<span class="number"> 107</span>            <span class="c">//Etc...</span>
<span class="number"> 108</span>         <span class="k2">}</span>
<span class="number"> 109</span>
<span class="number"> 110</span>
<span class="number"> 111</span>
<span class="number"> 112</span>
<span class="number"> 113</span>
<span class="number"> 114</span>      <span class="k1">if</span><span class="k2">(</span>redraw <span class="k3">&amp;</span><span class="k3">&amp;</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>event_queue<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 115</span>         redraw <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 116</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">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 117</span>
<span class="number"> 118</span>         <a href="http://www.allegro.cc/manual/al_draw_ustr"><span class="a">al_draw_ustr</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a>,<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">250</span>, <span class="n">250</span>, <span class="n">250</span><span class="k2">)</span>, <span class="n">0</span>, <span class="n">100</span>, <span class="n">0</span>,string<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 119</span>
<span class="number"> 120</span>         <a href="http://www.allegro.cc/manual/al_draw_text"><span class="a">al_draw_text</span></a><span class="k2">(</span>font2,<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">250</span>, <span class="n">250</span>, <span class="n">250</span><span class="k2">)</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>,<span class="s">"Only works the letters: q,w,e,r,t,y,u,ñ."</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 121</span>         <a href="http://www.allegro.cc/manual/al_draw_text"><span class="a">al_draw_text</span></a><span class="k2">(</span>font2,<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">250</span>, <span class="n">250</span>, <span class="n">250</span><span class="k2">)</span>, <span class="n">0</span>, <span class="n">50</span>, <span class="n">0</span>,<span class="s">"And don't press CAPS LOCK"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 122</span>
<span class="number"> 123</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"> 124</span>      <span class="k2">}</span>
<span class="number"> 125</span>   <span class="k2">}</span>
<span class="number"> 126</span>
<span class="number"> 127</span>   <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 128</span>   <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 129</span>   <a href="http://www.allegro.cc/manual/al_destroy_event_queue"><span class="a">al_destroy_event_queue</span></a><span class="k2">(</span>event_queue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 130</span>
<span class="number"> 131</span>   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 132</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AMCerasoli)</author>
		<pubDate>Thu, 17 Feb 2011 06:23:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That would be perfect if not for the fact that I&#39;m using cstrings and <i>not</i> using fonts. ALLEGRO_USTR won&#39;t convert to cstrings, and I&#39;m using my own functions to draw strings, not the font plugin. No beeps either.</p><p>I think the only thing I really need now is a reliable way to... er... un-append the string. Shorten it by one character.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gatleos)</author>
		<pubDate>Thu, 17 Feb 2011 06:52:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/606417/903805#target">Gatleos</a> said:</div><div class="quote"><p> I think the only thing I really need now is a reliable way to... er... un-append the string. Shorten it by one character.</p></div></div><p>Set the currently last character to &#39;\0&#39;
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (LennyLen)</author>
		<pubDate>Thu, 17 Feb 2011 06:54:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/606417/903805#target">Gatleos</a> said:</div><div class="quote"><p> ALLEGRO_USTR won&#39;t convert to cstrings</p></div></div><p>Yes it will. What makes you think it didn&#39;t?</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>I think the only thing I really need now is a reliable way to... er... un-append the string. Shorten it by one character.</p></div></div><p>With C strings, just write a 0 at the last character. No need to reallocate or anything, just write a 0. Might want to keep track of the length though. Thats where the USTR stuff would help out, it does dynamic allocation for you, and can handle UTF8 so you don&#39;t have to think about it. But you&#39;re free to use c strings if you wish. Its just harder.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Thu, 17 Feb 2011 06:55:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/606417/903805#target">Gatleos</a> said:</div><div class="quote"><p>That would be perfect if not for the fact that I&#39;m using cstrings and not using fonts. ALLEGRO_USTR won&#39;t convert to cstrings, and I&#39;m using my own functions to draw strings, not the font plugin. No beeps either.</p></div></div><p><img src="http://www.allegro.cc/forums/smileys/rolleyes.gif" alt="::)" /></p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>un-append the string</p></div></div><p>You can always write a 0 at the end.  There&#39;s a bunch of good stuff here:<br /><a href="http://www.cplusplus.com/reference/clibrary/cstring/">http://www.cplusplus.com/reference/clibrary/cstring/</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mark Oates)</author>
		<pubDate>Thu, 17 Feb 2011 06:58:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/606417/903807#target">Thomas Fjellstrom</a> said:</div><div class="quote"><p>Yes it will. What makes you think it didn&#39;t?</p></div></div><p>
My compiler telling me that there is no conversion to char * from ALLEGRO_USTR.
</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/606417/903808#target">Mark Oates</a> said:</div><div class="quote"><p>You can always write a 0 at the end.  There&#39;s a bunch of good stuff here:<br /><a href="http://www.cplusplus.com/reference/clibrary/cstring/">http://www.cplusplus.com/reference/clibrary/cstring/</a>
</p></div></div><p>
Tried it.
</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/606417/903806#target">LennyLen</a> said:</div><div class="quote"><p>Set the currently last character to &#39;\0&#39;</p></div></div><p>
Tried it. Look, if I had a question about basic c++ operations, I wouldn&#39;t be asking here. I just assumed it might have something to do with Allegro. If you can alter the code I posted above to work with any of those suggestions, I&#39;d be grateful and happily use it. But it won&#39;t work for me.
</p><div class="quote_container"><div class="title">Mark Oates said:</div><div class="quote"><p><img src="http://www.allegro.cc/forums/smileys/rolleyes.gif" alt="::)" /></p></div></div><p>
Too late to go back now. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gatleos)</author>
		<pubDate>Thu, 17 Feb 2011 07:08:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/606417/903809#target">Gatleos</a> said:</div><div class="quote"><p> My compiler telling me that there is no conversion to char * from ALLEGRO_USTR.</p></div></div><p>Of course there&#39;s no implicit conversion.  It&#39;s the same as trying to use a C++ string when a C string is expected.  That doesn&#39;t mean there isn&#39;t a way to convert from one form to the other.  Use <a href="http://www.allegro.cc/manual/5/al_cstr">this</a>.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p> Tried it. Look, if I had a question about basic c++ operations, I wouldn&#39;t be asking here. I just assumed it might have something to do with Allegro. </p></div></div><p>It has nothing to do with Allegro.  The only way to reduce the length of C strings is to move the position of the terminator.  Perhaps you should ask questions about the basics since it appears you don&#39;t know them.</p><p>edit:  Here&#39;s a working example</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#include &lt;stdio.h&gt;</span>
<span class="p">#include &lt;string.h&gt;</span>

<span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>

    <span class="k1">char</span> example<span class="k2">[</span><span class="k2">]</span> <span class="k3">=</span> <span class="s">"Hello World!"</span><span class="k2">;</span>
    example<span class="k2">[</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>example<span class="k2">)</span> <span class="k3">-</span> <span class="n">1</span><span class="k2">]</span> <span class="k3">=</span> <span class="s">'\0'</span><span class="k2">;</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\n"</span>, example<span class="k2">)</span><span class="k2">;</span>

    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

It prints &quot;Hello World&quot;.  Note the removal of the !.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (LennyLen)</author>
		<pubDate>Thu, 17 Feb 2011 07:15:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/606417/903809#target">Gatleos</a> said:</div><div class="quote"><p>Tried it.</p></div></div><p>
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>Tried it.</p></div></div><p>
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>If you can alter the code I posted above to work with any of those suggestions, I&#39;d be grateful and happily use it. But it won&#39;t work for me.
</p></div></div><p>
You gotta be responsible for your own code, man.  We can&#39;t do it for you.<br /><div class="media-player youtube"><div style="margin: 1em 2em; background: url(/images/movie.png); width: 180px; height: 100px; text-align: center;"><a href="http://www.allegro.cc//www.youtube.com/watch?v=0EVeWllgt_I" target="_blank"><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/object/8/e/8e059d968c9a0f18b839baa41299c9c3.jpg" border="0" alt="video" title="Click to play video" /></a></div></div>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mark Oates)</author>
		<pubDate>Thu, 17 Feb 2011 07:19:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/606417/903811#target">Mark Oates</a> said:</div><div class="quote"><p>You gotta be responsible for your own code, man.  We can&#39;t do it for you.</p></div></div><p>
No, I wasn&#39;t asking you to write my code for me. You gave suggestions, they didn&#39;t work. I accept that I may have misunderstood what you were suggesting, so I wanted to see your implementation in case you meant something different than I thought you did.</p><p>Never assume someone&#39;s just asking you to write their code for them. Most people want help with their code, not a codesitter.</p><p>My original question was whether there was an efficient way to do this with Allegro timing, but I guess there isn&#39;t. I can figure it out on my own from here, I think. Unless someone has another suggestion.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gatleos)</author>
		<pubDate>Thu, 17 Feb 2011 07:54:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/606417/903813#target">Gatleos</a> said:</div><div class="quote"><p>Most people want help with their code, not a codesitter.</p></div></div><p>You&#39;d be surprised.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>My original question was whether there was an efficient way to do this with Allegro timing, but I guess there isn&#39;t.</p></div></div><p>The question itself doesn&#39;t make much sense to me. Timing has nothing to do with keyboard input for the most part. Or an editable text entry.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Thu, 17 Feb 2011 08:21:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think the same... I can&#39;t understand you. &quot;an efficient way to do this with Allegro timing&quot; <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" /> .</p><p>You&#39;re talking about separating the Keyboard inputs from the drawing?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AMCerasoli)</author>
		<pubDate>Thu, 17 Feb 2011 08:29:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/606417/903821#target">Thomas Fjellstrom</a> said:</div><div class="quote"><p> You&#39;d be surprised.</p></div></div><p>Yep, right now I&#39;d give <s>my right arm</s> a Pepsi Cola for some cut&#39;n&#39;paste code to disable resizable X windows.  It&#39;s just a matter of the correct incantations.<br />(I did look at the A5 and SDL code, and my version doesn&#39;t work)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Thu, 17 Feb 2011 08:29:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><s>I&#39;m already building a class for this that I&#39;ll gladly post when I&#39;m done. Should be later tonight, possibly tomorrow.</s></p><p>[EDIT]</p><p>Here is the first version of the class. I&#39;ve not had a chance to test (or even compile it), so use at your own risk.</p><p>I&#39;m assuming you know how to set up an event queue and capture events.</p><p>So assuming your variables are declared as follows:</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">;</span>
<a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_SOURCE"><span class="a">ALLEGRO_EVENT_SOURCE</span></a><span class="k3">*</span> keyboard_source <span class="k3">=</span> <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>
TextField text<span class="k2">;</span>
<span class="k1">bool</span> success<span class="k2">;</span>
</pre></div></div><p>

You should be able to capture and process keyboard actions with the following. It returns true if it succeeds, false if it fails (static field is full, can&#39;t delete due to cursor position, ect). </p><p>It should properly handle SHIFT key, and returns null if you hold CTRL/ALT or press a command key (function keys, pause, break, prtsc, sysrq, esc, ect). That way you can handle those cases separately if you want.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">if</span><span class="k2">(</span>ev.source <span class="k3">=</span><span class="k3">=</span> keyboard_source<span class="k2">)</span>
  success <span class="k3">=</span> text.ProcessKey<span class="k2">(</span>ev<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

The following will return the current string in the input field. It returns a character array, which should be easy to render with al_draw_text or similar.</p><div class="source-code snippet"><div class="inner"><pre>str <span class="k3">=</span> text.CurrentString<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

The class has lots of different helper functions. It support both dynamic and static string lengths. Obviously static is faster in some regards. Dynamic strings will grow automatically, but you can also use text.SetConserve(true) which will shrink the array if there is lots of dead space at the end (20+). By default the array doesn&#39;t shrink once its been expanded.</p><p>So without further ado, the TextField class:</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="k1">class</span> TextField
<span class="number">   2</span><span class="k2">{</span>
<span class="number">   3</span>  <span class="k1">char</span> <span class="k3">*</span> tf_string<span class="k2">;</span>      <span class="c">//current string</span>
<span class="number">   4</span>  <span class="k1">int</span> tf_position<span class="k2">;</span>      <span class="c">//cursor position</span>
<span class="number">   5</span>  <span class="k1">int</span> tf_size<span class="k2">;</span>        <span class="c">//size allocated for array</span>
<span class="number">   6</span>  <span class="k1">bool</span> tf_isStatic<span class="k2">;</span>      <span class="c">//defaults to false (dynamic allocation)</span>
<span class="number">   7</span>  <span class="k1">bool</span> tf_conserveMemory<span class="k2">;</span>    <span class="c">//if set dynamic arrays are shortened to conserve memory</span>
<span class="number">   8</span>
<span class="number">   9</span>  <span class="k1">bool</span> AddCharacter<span class="k2">(</span><span class="k1">char</span> c<span class="k2">)</span><span class="k2">;</span>            <span class="c">//add character at current cursor position. (return true if success)</span>
<span class="number">  10</span>  <span class="k1">bool</span> DeleteCharacter<span class="k2">(</span><span class="k1">bool</span> reverse <span class="k3">=</span>  <span class="k1">false</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">//delete character at current position. (return true if success)</span>
<span class="number">  11</span>
<span class="number">  12</span>public:
<span class="number">  13</span>  TextField<span class="k2">(</span><span class="k1">int</span> maxLength<span class="k3">=</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span>                      <span class="c">//initialize empty field</span>
<span class="number">  14</span>  TextField<span class="k2">(</span><span class="k1">char</span> <span class="k3">*</span> StartString, <span class="k1">int</span> StartPosition, <span class="k1">int</span> maxLength<span class="k3">=</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">//initialize field with starting string and cursor position</span>
<span class="number">  15</span>  
<span class="number">  16</span>  <span class="k1">char</span> <span class="k3">*</span> GetString<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>      <span class="c">//returns current string</span>
<span class="number">  17</span>  <span class="k1">int</span> GetPosition<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>      <span class="c">//returns current cursor position</span>
<span class="number">  18</span>  <span class="k1">int</span> GetSize<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>        <span class="c">//returns current size of array</span>
<span class="number">  19</span>  <span class="k1">bool</span> IsConserve<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>      <span class="c">//returns if dynamic arrays are resized to conserve memory</span>
<span class="number">  20</span>  <span class="k1">bool</span> IsStatic<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>      <span class="c">//returns if field has static length</span>
<span class="number">  21</span>
<span class="number">  22</span>  <span class="k1">bool</span> SetPosition<span class="k2">(</span><span class="k1">int</span> p<span class="k2">)</span><span class="k2">;</span>      <span class="c">//set cursor position</span>
<span class="number">  23</span>  <span class="k1">void</span> SetConserve<span class="k2">(</span><span class="k1">bool</span> conserve<span class="k2">)</span><span class="k2">;</span>  <span class="c">//set dynamic string memory conservation</span>
<span class="number">  24</span>
<span class="number">  25</span>  <span class="k1">bool</span> ProcessKey<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">)</span><span class="k2">;</span>  <span class="c">//processes a key press (returns true if success, false if failure, null if ignored)</span>
<span class="number">  26</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  27</span>
<span class="number">  28</span>TextField::TextField<span class="k2">(</span><span class="k1">int</span> maxLength<span class="k3">=</span><span class="n">0</span><span class="k2">)</span>
<span class="number">  29</span><span class="k2">{</span>
<span class="number">  30</span>  <span class="k1">if</span><span class="k2">(</span>maxLength <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> <span class="c">//if MaxLength was set greater than zero, array is Static length</span>
<span class="number">  31</span>  <span class="k2">{</span>
<span class="number">  32</span>    tf_size <span class="k3">=</span> maxLength<span class="k2">;</span>
<span class="number">  33</span>    tf_isStatic <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  34</span>  <span class="k2">}</span>
<span class="number">  35</span>  <span class="k1">else</span> <span class="c">//set as dynamic with a starting 10 character storage</span>
<span class="number">  36</span>  <span class="k2">{</span>
<span class="number">  37</span>    tf_size <span class="k3">=</span> <span class="n">10</span><span class="k2">;</span>
<span class="number">  38</span>    tf_isStatic <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  39</span>  <span class="k2">}</span>
<span class="number">  40</span>  tf_string <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span><span class="k2">[</span>tf_size<span class="k2">]</span><span class="k2">;</span>
<span class="number">  41</span>  tf_position <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  42</span>  tf_conserveMemory <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  43</span><span class="k2">}</span>
<span class="number">  44</span>
<span class="number">  45</span>TextField::TextField<span class="k2">(</span><span class="k1">char</span> <span class="k3">*</span> StartString, <span class="k1">int</span> StartPosition, <span class="k1">int</span> MaxLength<span class="k3">=</span><span class="n">0</span><span class="k2">)</span>
<span class="number">  46</span><span class="k2">{</span>
<span class="number">  47</span>  <span class="k1">if</span><span class="k2">(</span>MaxLength <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> <span class="c">//if MaxLength was set greater than zero, array is Static length</span>
<span class="number">  48</span>  <span class="k2">{</span>
<span class="number">  49</span>    tf_size <span class="k3">=</span> MaxLength<span class="k2">;</span>
<span class="number">  50</span>    tf_string <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span><span class="k2">[</span>tf_size<span class="k2">]</span><span class="k2">;</span>
<span class="number">  51</span>    tf_isStatic <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  52</span>  <span class="k2">}</span>
<span class="number">  53</span>  <span class="k1">else</span> <span class="c">//set as Dynamic length larger than starting string</span>
<span class="number">  54</span>  <span class="k2">{</span>
<span class="number">  55</span>    tf_size <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>StartString<span class="k2">)</span> <span class="k3">+</span> <span class="n">10</span><span class="k2">;</span>
<span class="number">  56</span>    tf_string <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span><span class="k2">[</span>tf_size<span class="k2">]</span><span class="k2">;</span>
<span class="number">  57</span>    tf_isStatic <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  58</span>  <span class="k2">}</span>
<span class="number">  59</span>
<span class="number">  60</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_756.html" target="_blank">strcpy</a><span class="k2">(</span>tf_string,StartString<span class="k2">)</span><span class="k2">;</span>
<span class="number">  61</span>  tf_string<span class="k2">[</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>tf_string<span class="k2">)</span><span class="k2">]</span> <span class="k3">=</span> <span class="s">'\0'</span><span class="k2">;</span>
<span class="number">  62</span>
<span class="number">  63</span>  tf_position <span class="k3">=</span> StartPosition<span class="k2">;</span>
<span class="number">  64</span>  tf_conserveMemory <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  65</span><span class="k2">}</span>
<span class="number">  66</span>
<span class="number">  67</span><span class="k1">char</span> <span class="k3">*</span> TextField::GetString<span class="k2">(</span><span class="k2">)</span>
<span class="number">  68</span><span class="k2">{</span>
<span class="number">  69</span>  <span class="k1">return</span> tf_string<span class="k2">;</span>
<span class="number">  70</span><span class="k2">}</span>
<span class="number">  71</span>
<span class="number">  72</span><span class="k1">int</span> TextField::GetPosition<span class="k2">(</span><span class="k2">)</span>
<span class="number">  73</span><span class="k2">{</span>
<span class="number">  74</span>  <span class="k1">return</span> tf_position<span class="k2">;</span>
<span class="number">  75</span><span class="k2">}</span>
<span class="number">  76</span>
<span class="number">  77</span><span class="k1">int</span> TextField::GetSize<span class="k2">(</span><span class="k2">)</span>
<span class="number">  78</span><span class="k2">{</span>
<span class="number">  79</span>  <span class="k1">return</span> tf_size<span class="k2">;</span>
<span class="number">  80</span><span class="k2">}</span>
<span class="number">  81</span>
<span class="number">  82</span><span class="k1">bool</span> TextField::IsConserve<span class="k2">(</span><span class="k2">)</span>
<span class="number">  83</span><span class="k2">{</span>
<span class="number">  84</span>  <span class="k1">return</span> tf_conserveMemory<span class="k2">;</span>
<span class="number">  85</span><span class="k2">}</span>
<span class="number">  86</span>
<span class="number">  87</span><span class="k1">bool</span> TextField::IsStatic<span class="k2">(</span><span class="k2">)</span>
<span class="number">  88</span><span class="k2">{</span>
<span class="number">  89</span>  <span class="k1">return</span> tf_isStatic<span class="k2">;</span>
<span class="number">  90</span><span class="k2">}</span>
<span class="number">  91</span>
<span class="number">  92</span><span class="k1">bool</span> TextField::SetPosition<span class="k2">(</span><span class="k1">int</span> p<span class="k2">)</span>
<span class="number">  93</span><span class="k2">{</span>
<span class="number">  94</span>  <span class="k1">if</span><span class="k2">(</span>p<span class="k3">&lt;</span><span class="n">0</span><span class="k2">)</span>
<span class="number">  95</span>    <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  96</span>  <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>p <span class="k3">&gt;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>tf_string<span class="k2">)</span><span class="k2">)</span>
<span class="number">  97</span>    <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  98</span>  <span class="k1">else</span>
<span class="number">  99</span>    tf_position <span class="k3">=</span> p<span class="k2">;</span>
<span class="number"> 100</span>  
<span class="number"> 101</span>  <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 102</span><span class="k2">}</span>
<span class="number"> 103</span>
<span class="number"> 104</span><span class="k1">void</span> TextField::SetConserve<span class="k2">(</span><span class="k1">bool</span> conserve<span class="k2">)</span>
<span class="number"> 105</span><span class="k2">{</span>
<span class="number"> 106</span>  tf_conserveMemory <span class="k3">=</span> conserve<span class="k2">;</span>
<span class="number"> 107</span><span class="k2">}</span>
<span class="number"> 108</span>
<span class="number"> 109</span><span class="k1">bool</span> TextField::AddCharacter<span class="k2">(</span><span class="k1">char</span> c<span class="k2">)</span>
<span class="number"> 110</span><span class="k2">{</span>
<span class="number"> 111</span>  <span class="k1">int</span> currentLength <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>tf_string<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 112</span>
<span class="number"> 113</span>  <span class="k1">if</span><span class="k2">(</span>tf_position&gt;currentLength<span class="k2">)</span>    <span class="c">//catches error if position out of bounds</span>
<span class="number"> 114</span>    tf_position<span class="k3">=</span>currentLength<span class="k2">;</span>
<span class="number"> 115</span>
<span class="number"> 116</span>  <span class="k1">if</span><span class="k2">(</span>tf_position<span class="k3">&lt;</span><span class="n">0</span><span class="k2">)</span>          <span class="c">//catches error if position out of bounds</span>
<span class="number"> 117</span>    tf_position<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 118</span>
<span class="number"> 119</span>  <span class="k1">if</span><span class="k2">(</span>tf_position<span class="k3">=</span><span class="k3">=</span>tf_size<span class="k2">)</span>    <span class="c">//if field is full</span>
<span class="number"> 120</span>  <span class="k2">{</span>
<span class="number"> 121</span>    <span class="k1">if</span><span class="k2">(</span>tf_isStatic<span class="k2">)</span>    <span class="c">//cannot add any characters</span>
<span class="number"> 122</span>      <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 123</span>    <span class="k1">else</span>        <span class="c">//resize dynamic array (adds 10)</span>
<span class="number"> 124</span>    <span class="k2">{</span>
<span class="number"> 125</span>      tf_size<span class="k3">+</span><span class="k3">=</span><span class="n">10</span><span class="k2">;</span>
<span class="number"> 126</span>      <span class="k1">char</span><span class="k3">*</span> temp <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span> <span class="k2">[</span>tf_size<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 127</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_756.html" target="_blank">strcpy</a><span class="k2">(</span>temp, tf_string<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 128</span>      <span class="k1">delete</span> <span class="k2">[</span><span class="k2">]</span> tf_string<span class="k2">;</span>
<span class="number"> 129</span>      tf_string<span class="k3">=</span>temp<span class="k2">;</span>
<span class="number"> 130</span>    <span class="k2">}</span>
<span class="number"> 131</span>  <span class="k2">}</span>
<span class="number"> 132</span>
<span class="number"> 133</span>  <span class="k1">if</span><span class="k2">(</span>tf_position <span class="k3">=</span><span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>tf_string<span class="k2">)</span><span class="k2">)</span> <span class="c">//if position is at end of string</span>
<span class="number"> 134</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_752.html" target="_blank">strcat</a><span class="k2">(</span>tf_string, c<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 135</span>  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>tf_position <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>      <span class="c">//if position is beginning of string</span>
<span class="number"> 136</span>  <span class="k2">{</span>
<span class="number"> 137</span>    <span class="k1">char</span> <span class="k3">*</span> temp <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span> <span class="k2">[</span>tf_size<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 138</span>    temp<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> c<span class="k2">;</span>
<span class="number"> 139</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_756.html" target="_blank">strcpy</a><span class="k2">(</span>tf_string,<a href="http://www.delorie.com/djgpp/doc/libc/libc_752.html" target="_blank">strcat</a><span class="k2">(</span>temp, tf_string<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 140</span>    <span class="k1">delete</span> <span class="k2">[</span><span class="k2">]</span> temp<span class="k2">;</span>
<span class="number"> 141</span>  <span class="k2">}</span>
<span class="number"> 142</span>  <span class="k1">else</span>
<span class="number"> 143</span>  <span class="k2">{</span>
<span class="number"> 144</span>    <span class="k1">char</span> <span class="k3">*</span> temp <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span> <span class="k2">[</span>tf_size<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 145</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_769.html" target="_blank">strncpy</a><span class="k2">(</span>temp,tf_string,tf_position<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 146</span>    temp<span class="k2">[</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>temp<span class="k2">)</span><span class="k2">]</span> <span class="k3">=</span> c<span class="k2">;</span>
<span class="number"> 147</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> i<span class="k3">=</span>tf_position<span class="k2">;</span> i<span class="k3">&lt;</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>tf_string<span class="k2">)</span><span class="k2">;</span>i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 148</span>      temp<span class="k2">[</span>i<span class="k3">+</span><span class="n">1</span><span class="k2">]</span><span class="k3">=</span>tf_string<span class="k2">[</span>i<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 149</span>    <span class="k1">delete</span> <span class="k2">[</span><span class="k2">]</span> temp<span class="k2">;</span>
<span class="number"> 150</span>  <span class="k2">}</span>
<span class="number"> 151</span>
<span class="number"> 152</span>  tf_position<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 153</span>  <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 154</span><span class="k2">}</span>
<span class="number"> 155</span>
<span class="number"> 156</span><span class="k1">bool</span> TextField::DeleteCharacter<span class="k2">(</span><span class="k1">bool</span> reverse<span class="k3">=</span><span class="k1">false</span><span class="k2">)</span>
<span class="number"> 157</span><span class="k2">{</span>
<span class="number"> 158</span>  <span class="k1">int</span> currentLength <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>tf_string<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 159</span>
<span class="number"> 160</span>  <span class="k1">if</span><span class="k2">(</span>tf_position <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span>        <span class="c">//catches out of range error</span>
<span class="number"> 161</span>    tf_position<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 162</span>  <span class="k1">if</span><span class="k2">(</span>tf_position <span class="k3">&gt;</span> currentLength<span class="k2">)</span>  <span class="c">//catches out of range error</span>
<span class="number"> 163</span>    tf_position <span class="k3">=</span> currentLength<span class="k2">;</span>
<span class="number"> 164</span>
<span class="number"> 165</span>  <span class="k1">if</span><span class="k2">(</span>tf_position <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 166</span>  <span class="k2">{</span>
<span class="number"> 167</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>reverse<span class="k2">)</span>  <span class="c">//cursor at start of field and backspace pressed</span>
<span class="number"> 168</span>      <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 169</span>    <span class="k1">else</span>      <span class="c">//delete character at start of field</span>
<span class="number"> 170</span>    <span class="k2">{</span>
<span class="number"> 171</span>      <span class="k1">char</span> <span class="k3">*</span> temp <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span> <span class="k2">[</span>tf_size<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 172</span>      <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> i<span class="k3">=</span><span class="n">1</span><span class="k2">;</span> i<span class="k3">&lt;</span>currentLength<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 173</span>        temp<span class="k2">[</span>i-1<span class="k2">]</span><span class="k3">=</span>tf_string<span class="k2">[</span>i<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 174</span>      <span class="k1">delete</span> <span class="k2">[</span><span class="k2">]</span> tf_string<span class="k2">;</span>
<span class="number"> 175</span>      tf_string <span class="k3">=</span> temp<span class="k2">;</span>
<span class="number"> 176</span>    <span class="k2">}</span>
<span class="number"> 177</span>  <span class="k2">}</span>
<span class="number"> 178</span>  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>tf_position <span class="k3">=</span><span class="k3">=</span> currentLength<span class="k2">)</span>
<span class="number"> 179</span>  <span class="k2">{</span>
<span class="number"> 180</span>    <span class="k1">if</span><span class="k2">(</span>reverse<span class="k2">)</span>    <span class="c">//cursor at end of field and delete key pressed</span>
<span class="number"> 181</span>      <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 182</span>    <span class="k1">else</span>      <span class="c">//delete character at end of field</span>
<span class="number"> 183</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_769.html" target="_blank">strncpy</a><span class="k2">(</span>tf_string,tf_string,currentLength-1<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 184</span>  <span class="k2">}</span>
<span class="number"> 185</span>  <span class="k1">else</span>
<span class="number"> 186</span>  <span class="k2">{</span>
<span class="number"> 187</span>    <span class="k1">char</span> <span class="k3">*</span> temp <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span> <span class="k2">[</span>tf_size<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 188</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>reverse<span class="k2">)</span>  <span class="c">//delete character before cursor (BACKSPACE)</span>
<span class="number"> 189</span>    <span class="k2">{</span>
<span class="number"> 190</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_769.html" target="_blank">strncpy</a><span class="k2">(</span>temp,tf_string,tf_position-1<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 191</span>      <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> i<span class="k3">=</span>tf_position<span class="k2">;</span>i<span class="k3">&lt;</span>currentLength<span class="k2">;</span>i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 192</span>        temp<span class="k2">[</span>i-1<span class="k2">]</span><span class="k3">=</span>tf_string<span class="k2">[</span>i<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 193</span>      tf_position--<span class="k2">;</span>
<span class="number"> 194</span>    <span class="k2">}</span>
<span class="number"> 195</span>    <span class="k1">else</span>      <span class="c">//delete character after cursor (DELETE)</span>
<span class="number"> 196</span>    <span class="k2">{</span>
<span class="number"> 197</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_769.html" target="_blank">strncpy</a><span class="k2">(</span>temp,tf_string,tf_position<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 198</span>      <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> i<span class="k3">=</span>tf_position<span class="k3">+</span><span class="n">1</span><span class="k2">;</span>i<span class="k3">&lt;</span>currentLength<span class="k2">;</span>i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 199</span>        temp<span class="k2">[</span>i-1<span class="k2">]</span><span class="k3">=</span>tf_string<span class="k2">[</span>i<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 200</span>    <span class="k2">}</span>
<span class="number"> 201</span>    <span class="k1">delete</span> <span class="k2">[</span><span class="k2">]</span> tf_string<span class="k2">;</span>
<span class="number"> 202</span>    tf_string<span class="k3">=</span>temp<span class="k2">;</span>
<span class="number"> 203</span>  <span class="k2">}</span>
<span class="number"> 204</span>
<span class="number"> 205</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>tf_isStatic <span class="k3">&amp;</span><span class="k3">&amp;</span> tf_conserveMemory <span class="k3">&amp;</span><span class="k3">&amp;</span> tf_size&gt;20 <span class="k3">&amp;</span><span class="k3">&amp;</span> currentLength<span class="k3">+</span><span class="n">19</span><span class="k3">&lt;</span><span class="k3">=</span>tf_size<span class="k2">)</span> <span class="c">//resizes array to conserve memory (removes 10)</span>
<span class="number"> 206</span>  <span class="k2">{</span>
<span class="number"> 207</span>    tf_size-<span class="k3">=</span><span class="n">10</span><span class="k2">;</span>
<span class="number"> 208</span>    <span class="k1">char</span><span class="k3">*</span> temp <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span> <span class="k2">[</span>tf_size<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 209</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_756.html" target="_blank">strcpy</a><span class="k2">(</span>temp, tf_string<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 210</span>    <span class="k1">delete</span> <span class="k2">[</span><span class="k2">]</span> tf_string<span class="k2">;</span>
<span class="number"> 211</span>    tf_string<span class="k3">=</span>temp<span class="k2">;</span>
<span class="number"> 212</span>  <span class="k2">}</span>
<span class="number"> 213</span>
<span class="number"> 214</span>  <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 215</span><span class="k2">}</span>
<span class="number"> 216</span>
<span class="number"> 217</span><span class="k1">bool</span> TextField::ProcessKey<span class="k2">(</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"> 218</span><span class="k2">{</span>
<span class="number"> 219</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_KEYBOARD_STATE"><span class="a">ALLEGRO_KEYBOARD_STATE</span></a> <span class="k3">*</span>state<span class="k2">;</span>
<span class="number"> 220</span>  <a href="http://www.allegro.cc/manual/al_get_keyboard_state"><span class="a">al_get_keyboard_state</span></a><span class="k2">(</span>state<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 221</span>
<span class="number"> 222</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="k3">&amp;</span><span class="k3">&amp;</span> <span class="k3">!</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_ALT<span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k3">!</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_ALTGR<span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k3">!</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_RCTRL<span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k3">!</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_LCTRL<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 223</span>  <span class="k2">{</span>
<span class="number"> 224</span>    <span class="k1">if</span><span class="k2">(</span>ev.keyboard.keycode <span class="k3">&gt;</span><span class="k3">=</span> ALLEGRO_KEY_A <span class="k3">&amp;</span><span class="k3">&amp;</span> ev.keyboard.keycode <span class="k3">&lt;</span><span class="k3">=</span> ALLEGRO_KEY_Z<span class="k2">)</span>
<span class="number"> 225</span>    <span class="k2">{</span>
<span class="number"> 226</span>      <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_LSHIFT<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_RSHIFT<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 227</span>        <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'A'</span><span class="k3">+</span>ev.keyboard.keycode-ALLEGRO_KEY_A<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 228</span>      <span class="k1">else</span>
<span class="number"> 229</span>        <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'a'</span><span class="k3">+</span>ev.keyboard.keycode-ALLEGRO_KEY_A<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 230</span>    <span class="k2">}</span>
<span class="number"> 231</span>    <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>ev.keyboard.keycode <span class="k3">&gt;</span><span class="k3">=</span> ALLEGRO_KEY_0 <span class="k3">&amp;</span><span class="k3">&amp;</span> ev.keyboard.keycode <span class="k3">&lt;</span><span class="k3">=</span> ALLEGRO_KEY_9<span class="k2">)</span>
<span class="number"> 232</span>    <span class="k2">{</span>
<span class="number"> 233</span>      <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_LSHIFT<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_RSHIFT<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 234</span>        <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'A'</span><span class="k3">+</span>ev.keyboard.keycode-ALLEGRO_KEY_A<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 235</span>      <span class="k1">else</span>
<span class="number"> 236</span>        <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'a'</span><span class="k3">+</span>ev.keyboard.keycode-ALLEGRO_KEY_A<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 237</span>    <span class="k2">}</span>
<span class="number"> 238</span>    <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>ev.keyboard.keycode <span class="k3">&gt;</span><span class="k3">=</span> ALLEGRO_KEY_PAD_0 <span class="k3">&amp;</span><span class="k3">&amp;</span> ev.keyboard.keycode <span class="k3">&lt;</span><span class="k3">=</span> ALLEGRO_KEY_PAD_9<span class="k2">)</span>
<span class="number"> 239</span>    <span class="k2">{</span>
<span class="number"> 240</span>      <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'0'</span><span class="k3">+</span>ev.keyboard.keycode-ALLEGRO_KEY_PAD_0<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 241</span>    <span class="k2">}</span>
<span class="number"> 242</span>    <span class="k1">else</span>
<span class="number"> 243</span>    <span class="k2">{</span>
<span class="number"> 244</span>      <span class="k1">switch</span><span class="k2">(</span>ev.keyboard.keycode<span class="k2">)</span>
<span class="number"> 245</span>      <span class="k2">{</span>
<span class="number"> 246</span>        <span class="k1">case</span> ALLEGRO_KEY_TILDE <span class="k2">:</span>
<span class="number"> 247</span>          <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_LSHIFT<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_RSHIFT<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 248</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'~'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 249</span>          <span class="k1">else</span>
<span class="number"> 250</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'`'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 251</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 252</span>        <span class="k1">case</span> ALLEGRO_KEY_MINUS <span class="k2">:</span>
<span class="number"> 253</span>          <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_LSHIFT<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_RSHIFT<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 254</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'_'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 255</span>          <span class="k1">else</span>
<span class="number"> 256</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'-'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 257</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 258</span>        <span class="k1">case</span> ALLEGRO_KEY_EQUALS <span class="k2">:</span>
<span class="number"> 259</span>          <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_LSHIFT<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_RSHIFT<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 260</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'+'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 261</span>          <span class="k1">else</span>
<span class="number"> 262</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'='</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 263</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 264</span>        <span class="k1">case</span> ALLEGRO_KEY_BACKSPACE <span class="k2">:</span>
<span class="number"> 265</span>          <span class="k1">return</span> DeleteCharacter<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 266</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 267</span>        <span class="k1">case</span> ALLEGRO_KEY_OPENBRACE <span class="k2">:</span>
<span class="number"> 268</span>          <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_LSHIFT<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_RSHIFT<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 269</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'{'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 270</span>          <span class="k1">else</span>
<span class="number"> 271</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'['</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 272</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 273</span>        <span class="k1">case</span> ALLEGRO_KEY_CLOSEBRACE <span class="k2">:</span>
<span class="number"> 274</span>          <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_LSHIFT<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_RSHIFT<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 275</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'}'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 276</span>          <span class="k1">else</span>
<span class="number"> 277</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">']'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 278</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 279</span>        <span class="k1">case</span> ALLEGRO_KEY_SEMICOLON <span class="k2">:</span>
<span class="number"> 280</span>          <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_LSHIFT<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_RSHIFT<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 281</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">':'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 282</span>          <span class="k1">else</span>
<span class="number"> 283</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">';'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 284</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 285</span>        <span class="k1">case</span> ALLEGRO_KEY_QUOTE <span class="k2">:</span>
<span class="number"> 286</span>          <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_LSHIFT<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_RSHIFT<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 287</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'\"'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 288</span>          <span class="k1">else</span>
<span class="number"> 289</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'\''</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 290</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 291</span>        <span class="k1">case</span> ALLEGRO_KEY_BACKSLASH <span class="k2">:</span>
<span class="number"> 292</span>          <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_LSHIFT<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_RSHIFT<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 293</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'|'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 294</span>          <span class="k1">else</span>
<span class="number"> 295</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'\\'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 296</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 297</span>        <span class="k1">case</span> ALLEGRO_KEY_BACKSLASH2 <span class="k2">:</span> <span class="c">/* DirectInput calls this DIK_OEM_102: "&lt; &gt; | on UK/Germany keyboards" */</span>
<span class="number"> 298</span>          <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_LSHIFT<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_RSHIFT<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 299</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'|'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 300</span>          <span class="k1">else</span>
<span class="number"> 301</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'\\'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 302</span>        <span class="k1">break</span><span class="k2">;</span> 
<span class="number"> 303</span>        <span class="k1">case</span> ALLEGRO_KEY_COMMA <span class="k2">:</span>
<span class="number"> 304</span>          <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_LSHIFT<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_RSHIFT<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 305</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'&lt;'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 306</span>          <span class="k1">else</span>
<span class="number"> 307</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">','</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 308</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 309</span>        <span class="k1">case</span> ALLEGRO_KEY_FULLSTOP <span class="k2">:</span>
<span class="number"> 310</span>          <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_LSHIFT<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_RSHIFT<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 311</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'&gt;'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 312</span>          <span class="k1">else</span>
<span class="number"> 313</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'.'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 314</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 315</span>        <span class="k1">case</span> ALLEGRO_KEY_SLASH <span class="k2">:</span>
<span class="number"> 316</span>          <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_LSHIFT<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_RSHIFT<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 317</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'?'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 318</span>          <span class="k1">else</span>
<span class="number"> 319</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'/'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 320</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 321</span>        <span class="k1">case</span> ALLEGRO_KEY_SPACE <span class="k2">:</span>
<span class="number"> 322</span>          <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">' '</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 323</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 324</span>
<span class="number"> 325</span>        <span class="k1">case</span> ALLEGRO_KEY_LEFT <span class="k2">:</span>
<span class="number"> 326</span>          <span class="k1">if</span><span class="k2">(</span>tf_position <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 327</span>            tf_position--<span class="k2">;</span>
<span class="number"> 328</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 329</span>        <span class="k1">case</span> ALLEGRO_KEY_RIGHT <span class="k2">:</span>
<span class="number"> 330</span>          <span class="k1">if</span><span class="k2">(</span>tf_position <span class="k3">&lt;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>tf_string<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 331</span>            tf_position<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 332</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 333</span>        <span class="k1">case</span> ALLEGRO_KEY_UP <span class="k2">:</span>
<span class="number"> 334</span>          <span class="c">//if you want to add a keyboard buffer of previous tf_strings</span>
<span class="number"> 335</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 336</span>        <span class="k1">case</span> ALLEGRO_KEY_DOWN <span class="k2">:</span>
<span class="number"> 337</span>          <span class="c">//same as key up</span>
<span class="number"> 338</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 339</span>
<span class="number"> 340</span>        <span class="k1">case</span> ALLEGRO_KEY_PAD_SLASH <span class="k2">:</span>
<span class="number"> 341</span>          <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'/'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 342</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 343</span>        <span class="k1">case</span> ALLEGRO_KEY_PAD_ASTERISK <span class="k2">:</span>
<span class="number"> 344</span>          <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'*'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 345</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 346</span>        <span class="k1">case</span> ALLEGRO_KEY_PAD_MINUS <span class="k2">:</span>
<span class="number"> 347</span>          <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'-'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 348</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 349</span>        <span class="k1">case</span> ALLEGRO_KEY_PAD_PLUS <span class="k2">:</span>
<span class="number"> 350</span>          <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'+'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 351</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 352</span>        <span class="k1">case</span> ALLEGRO_KEY_PAD_DELETE <span class="k2">:</span>
<span class="number"> 353</span>          <span class="k1">return</span> DeleteCharacter<span class="k2">(</span><span class="k1">true</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 354</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 355</span>
<span class="number"> 356</span>        <span class="k1">case</span> ALLEGRO_KEY_COLON2 <span class="k2">:</span>
<span class="number"> 357</span>          <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">':'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 358</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 359</span>
<span class="number"> 360</span>        <span class="k1">case</span> ALLEGRO_KEY_PAD_EQUALS <span class="k2">:</span>
<span class="number"> 361</span>          <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'='</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 362</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 363</span>        <span class="k1">case</span> ALLEGRO_KEY_BACKQUOTE <span class="k2">:</span>
<span class="number"> 364</span>          <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'\''</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 365</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 366</span>        <span class="k1">case</span> ALLEGRO_KEY_SEMICOLON2 <span class="k2">:</span>
<span class="number"> 367</span>          <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_LSHIFT<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span>state, ALLEGRO_KEY_RSHIFT<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 368</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">':'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 369</span>          <span class="k1">else</span>
<span class="number"> 370</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">';'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 371</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 372</span>      <span class="k2">}</span>
<span class="number"> 373</span>    <span class="k2">}</span>
<span class="number"> 374</span>  <span class="k2">}</span>
<span class="number"> 375</span>
<span class="number"> 376</span>  <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 377</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Nazerith)</author>
		<pubDate>Thu, 17 Feb 2011 15:16:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/606417/903838#target">Nazerith</a> said:</div><div class="quote"><p>
</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>TextField::TextField<span class="k2">(</span><span class="k1">char</span> <span class="k3">*</span> StartString, <span class="k1">int</span> StartPosition, <span class="k1">int</span> MaxLength<span class="k3">=</span><span class="n">0</span><span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>  <span class="k1">if</span><span class="k2">(</span>MaxLength <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> <span class="c">//if MaxLength was set greater than zero, array is Static length</span>
<span class="number">  4</span>  <span class="k2">{</span>
<div class="highlight"><span class="number">  5</span>    tf_size <span class="k3">=</span> MaxLength<span class="k2">;</span></div><span class="number">  6</span>    tf_string <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span><span class="k2">[</span>tf_size<span class="k2">]</span><span class="k2">;</span>
<span class="number">  7</span>    tf_isStatic <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  8</span>  <span class="k2">}</span>
<span class="number">  9</span>  <span class="k1">else</span> <span class="c">//set as Dynamic length larger than starting string</span>
<span class="number"> 10</span>  <span class="k2">{</span>
<span class="number"> 11</span>    tf_size <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>StartString<span class="k2">)</span> <span class="k3">+</span> <span class="n">10</span><span class="k2">;</span>
<span class="number"> 12</span>    tf_string <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span><span class="k2">[</span>tf_size<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 13</span>    tf_isStatic <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 14</span>  <span class="k2">}</span>
<span class="number"> 15</span>
<div class="highlight"><span class="number"> 16</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_756.html" target="_blank">strcpy</a><span class="k2">(</span>tf_string,StartString<span class="k2">)</span><span class="k2">;</span></div><div class="highlight"><span class="number"> 17</span>  tf_string<span class="k2">[</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>tf_string<span class="k2">)</span><span class="k2">]</span> <span class="k3">=</span> <span class="s">'\0'</span><span class="k2">;</span></div><span class="number"> 18</span>
<span class="number"> 19</span>  tf_position <span class="k3">=</span> StartPosition<span class="k2">;</span>
<span class="number"> 20</span>  tf_conserveMemory <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 21</span><span class="k2">}</span>
</div></div><p>
</p></div></div><p>
If MaxLength is less than or equal to the number of characters in StartString, then your strcpy call will overrun tf_string. Also, you overwrite the last character of the string with NULL when you use <span class="source-code">tf_string<span class="k2">[</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>tf_string<span class="k2">)</span><span class="k2">]</span> <span class="k3">=</span> <span class="s">'\0'</span><span class="k2">;</span></span> Something else, strcpy writes a null character at the end of the string, so you don&#39;t need to do it manually.</p><div class="quote_container"><div class="title">Nazerith said:</div><div class="quote"><p>
</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="k1">bool</span> TextField::AddCharacter<span class="k2">(</span><span class="k1">char</span> c<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>  <span class="k1">int</span> currentLength <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>tf_string<span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</span>
<span class="number">  5</span>  <span class="k1">if</span><span class="k2">(</span>tf_position&gt;currentLength<span class="k2">)</span>    <span class="c">//catches error if position out of bounds</span>
<span class="number">  6</span>    tf_position<span class="k3">=</span>currentLength<span class="k2">;</span>
<span class="number">  7</span>
<span class="number">  8</span>  <span class="k1">if</span><span class="k2">(</span>tf_position<span class="k3">&lt;</span><span class="n">0</span><span class="k2">)</span>          <span class="c">//catches error if position out of bounds</span>
<span class="number">  9</span>    tf_position<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 10</span>
<span class="number"> 11</span><span class="c">/// Problem here, this checks the position, not the size</span>
<div class="highlight"><span class="number"> 12</span></div><span class="number"> 13</span>  <span class="k1">if</span><span class="k2">(</span>tf_position<span class="k3">=</span><span class="k3">=</span>tf_size<span class="k2">)</span>    <span class="c">//if field is full</span>
<span class="number"> 14</span>  <span class="k2">{</span>
<span class="number"> 15</span>    <span class="k1">if</span><span class="k2">(</span>tf_isStatic<span class="k2">)</span>    <span class="c">//cannot add any characters</span>
<span class="number"> 16</span>      <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 17</span>    <span class="k1">else</span>        <span class="c">//resize dynamic array (adds 10)</span>
<span class="number"> 18</span>    <span class="k2">{</span>
<span class="number"> 19</span>      tf_size<span class="k3">+</span><span class="k3">=</span><span class="n">10</span><span class="k2">;</span>
<span class="number"> 20</span>      <span class="k1">char</span><span class="k3">*</span> temp <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span> <span class="k2">[</span>tf_size<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 21</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_756.html" target="_blank">strcpy</a><span class="k2">(</span>temp, tf_string<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>      <span class="k1">delete</span> <span class="k2">[</span><span class="k2">]</span> tf_string<span class="k2">;</span>
<span class="number"> 23</span>      tf_string<span class="k3">=</span>temp<span class="k2">;</span>
<span class="number"> 24</span>    <span class="k2">}</span>
<span class="number"> 25</span>  <span class="k2">}</span>
<span class="number"> 26</span>
<span class="number"> 27</span>  <span class="k1">if</span><span class="k2">(</span>tf_position <span class="k3">=</span><span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>tf_string<span class="k2">)</span><span class="k2">)</span> <span class="c">//if position is at end of string</span>
<div class="highlight"><span class="number"> 28</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_752.html" target="_blank">strcat</a><span class="k2">(</span>tf_string, c<span class="k2">)</span><span class="k2">;</span></div><span class="number"> 29</span>  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>tf_position <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>      <span class="c">//if position is beginning of string</span>
<span class="number"> 30</span>  <span class="k2">{</span>
<span class="number"> 31</span>    <span class="k1">char</span> <span class="k3">*</span> temp <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span> <span class="k2">[</span>tf_size<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 32</span>    temp<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> c<span class="k2">;</span>
<span class="number"> 33</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_756.html" target="_blank">strcpy</a><span class="k2">(</span>tf_string,<a href="http://www.delorie.com/djgpp/doc/libc/libc_752.html" target="_blank">strcat</a><span class="k2">(</span>temp, tf_string<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 34</span>    <span class="k1">delete</span> <span class="k2">[</span><span class="k2">]</span> temp<span class="k2">;</span>
<span class="number"> 35</span>  <span class="k2">}</span>
<span class="number"> 36</span>  <span class="k1">else</span>
<span class="number"> 37</span>  <span class="k2">{</span>
<span class="number"> 38</span>    <span class="k1">char</span> <span class="k3">*</span> temp <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span> <span class="k2">[</span>tf_size<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 39</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_769.html" target="_blank">strncpy</a><span class="k2">(</span>temp,tf_string,tf_position<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 40</span>    temp<span class="k2">[</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>temp<span class="k2">)</span><span class="k2">]</span> <span class="k3">=</span> c<span class="k2">;</span>
<span class="number"> 41</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> i<span class="k3">=</span>tf_position<span class="k2">;</span> i<span class="k3">&lt;</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>tf_string<span class="k2">)</span><span class="k2">;</span>i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 42</span>      temp<span class="k2">[</span>i<span class="k3">+</span><span class="n">1</span><span class="k2">]</span><span class="k3">=</span>tf_string<span class="k2">[</span>i<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 43</span>    <span class="k1">delete</span> <span class="k2">[</span><span class="k2">]</span> temp<span class="k2">;</span>
<span class="number"> 44</span>  <span class="k2">}</span>
<span class="number"> 45</span>
<span class="number"> 46</span>  tf_position<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 47</span>  <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 48</span><span class="k2">}</span>
</div></div><p>
</p></div></div><p>
c is a character - the second argument of strcat should be a const char*. You&#39;re also not checking the size of the string when you add a character to it, so you could overwrite it.</p><div class="quote_container"><div class="title">Nazerith said:</div><div class="quote"><p>
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">bool</span> TextField::ProcessKey<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">)</span>
<span class="k2">{</span>
<div class="highlight">  <a href="http://www.allegro.cc/manual/ALLEGRO_KEYBOARD_STATE"><span class="a">ALLEGRO_KEYBOARD_STATE</span></a> <span class="k3">*</span>state<span class="k2">;</span></div>
<div class="highlight">  <a href="http://www.allegro.cc/manual/al_get_keyboard_state"><span class="a">al_get_keyboard_state</span></a><span class="k2">(</span>state<span class="k2">)</span><span class="k2">;</span></div>
</pre></div></div><p>
</p></div></div><p>
You&#39;re asking allegro to store the keyboard state in an uninitialized pointer. It should be :
</p><div class="source-code snippet"><div class="inner"><pre>   <a href="http://www.allegro.cc/manual/ALLEGRO_KEYBOARD_STATE"><span class="a">ALLEGRO_KEYBOARD_STATE</span></a> state<span class="k2">;</span>
   <a href="http://www.allegro.cc/manual/al_get_keyboard_state"><span class="a">al_get_keyboard_state</span></a><span class="k2">(</span><span class="k3">&amp;</span>state<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

You&#39;re using C++ - why don&#39;t you just use a <a href="http://www.cppreference.com/wiki/string/basic_string/start">std::string</a>? It would make manipulation of the string easier, and would manage the memory for you. See also <a href="http://www.cppreference.com/wiki/string/basic_string/erase">string::erase</a> and <a href="http://www.cppreference.com/wiki/string/basic_string/insert">string::insert</a>.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 17 Feb 2011 16:32:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/606417/903857#target">Edgar Reynaldo</a> said:</div><div class="quote"><p>If MaxLength is less than or equal to the number of characters in StartString, then your strcpy call will overrun tf_string. Also, you overwrite the last character of the string with NULL when you use tf_string[strlen(tf_string)] = &#39;\0&#39;; Something else, strcpy writes a null character at the end of the string, so you don&#39;t need to do it manually.</p></div></div><p>

True, I was half awake when I wrote much of this. But I&#39;m glad for the comments, makes it easier to find errors. I&#39;ve already noticed a half dozen myself since posting, <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=";D" border="0" />. (also, some helper functions to clear/set the string would be nice... <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />)</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/606417/903838#target">Edgar Reynaldo</a> said:</div><div class="quote"><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="k1">bool</span> TextField::AddCharacter<span class="k2">(</span><span class="k1">char</span> c<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>  <span class="k1">int</span> currentLength <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>tf_string<span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</span>
<span class="number">  5</span>  <span class="k1">if</span><span class="k2">(</span>tf_position&gt;currentLength<span class="k2">)</span>    <span class="c">//catches error if position out of bounds</span>
<span class="number">  6</span>    tf_position<span class="k3">=</span>currentLength<span class="k2">;</span>
<span class="number">  7</span>
<span class="number">  8</span>  <span class="k1">if</span><span class="k2">(</span>tf_position<span class="k3">&lt;</span><span class="n">0</span><span class="k2">)</span>          <span class="c">//catches error if position out of bounds</span>
<span class="number">  9</span>    tf_position<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 10</span>
<span class="number"> 11</span><span class="c">/// Problem here, this checks the position, not the size</span>
<span class="number"> 12</span>  <span class="k1">if</span><span class="k2">(</span>tf_position<span class="k3">=</span><span class="k3">=</span>tf_size<span class="k2">)</span>    <span class="c">//if field is full</span>
<span class="number"> 13</span>  <span class="k2">{</span>
<span class="number"> 14</span>    <span class="k1">if</span><span class="k2">(</span>tf_isStatic<span class="k2">)</span>    <span class="c">//cannot add any characters</span>
<span class="number"> 15</span>      <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 16</span>    <span class="k1">else</span>        <span class="c">//resize dynamic array (adds 10)</span>
<span class="number"> 17</span>    <span class="k2">{</span>
<span class="number"> 18</span>      tf_size<span class="k3">+</span><span class="k3">=</span><span class="n">10</span><span class="k2">;</span>
<span class="number"> 19</span>      <span class="k1">char</span><span class="k3">*</span> temp <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span> <span class="k2">[</span>tf_size<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 20</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_756.html" target="_blank">strcpy</a><span class="k2">(</span>temp, tf_string<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>      <span class="k1">delete</span> <span class="k2">[</span><span class="k2">]</span> tf_string<span class="k2">;</span>
<span class="number"> 22</span>      tf_string<span class="k3">=</span>temp<span class="k2">;</span>
<span class="number"> 23</span>    <span class="k2">}</span>
<span class="number"> 24</span>  <span class="k2">}</span>
<span class="number"> 25</span>
<span class="number"> 26</span>  <span class="k1">if</span><span class="k2">(</span>tf_position <span class="k3">=</span><span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>tf_string<span class="k2">)</span><span class="k2">)</span> <span class="c">//if position is at end of string</span>
<span class="number"> 27</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_752.html" target="_blank">strcat</a><span class="k2">(</span>tf_string, c<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>tf_position <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>      <span class="c">//if position is beginning of string</span>
<span class="number"> 29</span>  <span class="k2">{</span>
<span class="number"> 30</span>    <span class="k1">char</span> <span class="k3">*</span> temp <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span> <span class="k2">[</span>tf_size<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 31</span>    temp<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> c<span class="k2">;</span>
<span class="number"> 32</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_756.html" target="_blank">strcpy</a><span class="k2">(</span>tf_string,<a href="http://www.delorie.com/djgpp/doc/libc/libc_752.html" target="_blank">strcat</a><span class="k2">(</span>temp, tf_string<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 33</span>    <span class="k1">delete</span> <span class="k2">[</span><span class="k2">]</span> temp<span class="k2">;</span>
<span class="number"> 34</span>  <span class="k2">}</span>
<span class="number"> 35</span>  <span class="k1">else</span>
<span class="number"> 36</span>  <span class="k2">{</span>
<span class="number"> 37</span>    <span class="k1">char</span> <span class="k3">*</span> temp <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span> <span class="k2">[</span>tf_size<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 38</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_769.html" target="_blank">strncpy</a><span class="k2">(</span>temp,tf_string,tf_position<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 39</span>    temp<span class="k2">[</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>temp<span class="k2">)</span><span class="k2">]</span> <span class="k3">=</span> c<span class="k2">;</span>
<span class="number"> 40</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> i<span class="k3">=</span>tf_position<span class="k2">;</span> i<span class="k3">&lt;</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>tf_string<span class="k2">)</span><span class="k2">;</span>i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 41</span>      temp<span class="k2">[</span>i<span class="k3">+</span><span class="n">1</span><span class="k2">]</span><span class="k3">=</span>tf_string<span class="k2">[</span>i<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 42</span>    <span class="k1">delete</span> <span class="k2">[</span><span class="k2">]</span> temp<span class="k2">;</span>
<span class="number"> 43</span>  <span class="k2">}</span>
<span class="number"> 44</span>
<span class="number"> 45</span>  tf_position<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 46</span>  <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 47</span><span class="k2">}</span>
</div></div><p>
c is a character - the second argument of strcat should be a const char*.
</p></div></div><p>
oddly my compiler doesn&#39;t seem to mind this, easy enough to fix.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/606417/903857#target">Edgar Reynaldo</a> said:</div><div class="quote"><p>You&#39;re also not checking the size of the string when you add a character to it, so you could overwrite it.</p></div></div><p>

blarg. line 12 in the example should have been:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">if</span><span class="k2">(</span>tf_size<span class="k3">&lt;</span><span class="k3">=</span>currentLength<span class="k2">)</span>
</pre></div></div><p>

Less than should be impossible in theory, so I could get away with an == but nothing is really lost by making it &lt;=.</p><p>Tomorrow after some sleep I&#39;ll throw a wrapper around this thing to render it and do some basic testing, work out the kinks. Too sleepy now. Nights.</p><p><b>[EDIT]</b></p><p>So insomnia got me once again, no sleep. sigh...</p><p>On the bright side, I build a wrapper to test everything. So here is the next version. I&#39;ll call this Alpha (why not?)</p><p><u>Changes:</u></p><ul><li><p>Fixed compiler errors
</p></li><li><p>Implemented keyboard state correctly
</p></li><li><p>Made the number keys work (which didn&#39;t before due to a bad copy/paste)
</p></li><li><p>Recoded the AddCharacter and DeleteCharacter functions. They are now much more compact and faster. (speed is why I&#39;m not using std::String)
</p></li><li><p>Added END and HOME functionality.
</p></li><li><p>There are now SetString and Clear functions.
</p></li><li><p>Added a destructor to deallocate the string when finished.
</p></li><li><p>Removed nearly all of the strlen calls to tf_string. A new integer keeps tracks of the current string length (incremented/decremented as appropriate).</p></li></ul><p>So here is TextField Alpha:</p><p><u>TextField.h</u>
</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">#ifndef TEXTFIELD</span>
<span class="number">   2</span><span class="p">#define TEXTFIELD</span>
<span class="number">   3</span>
<span class="number">   4</span><span class="p">#include &lt;string.h&gt;</span>
<span class="number">   5</span>
<span class="number">   6</span><span class="p">#include &lt;allegro5\allegro.h&gt;</span>
<span class="number">   7</span>
<span class="number">   8</span><span class="k1">class</span> TextField
<span class="number">   9</span><span class="k2">{</span>
<span class="number">  10</span>  <span class="k1">char</span> <span class="k3">*</span> tf_string<span class="k2">;</span>      <span class="c">//current string</span>
<span class="number">  11</span>  <span class="k1">int</span> tf_position<span class="k2">;</span>      <span class="c">//cursor position</span>
<span class="number">  12</span>  <span class="k1">int</span> tf_array_size<span class="k2">;</span>      <span class="c">//size allocated for array</span>
<span class="number">  13</span>  <span class="k1">int</span> tf_string_size<span class="k2">;</span>      <span class="c">//size of current string</span>
<span class="number">  14</span>  <span class="k1">bool</span> tf_isStatic<span class="k2">;</span>      <span class="c">//defaults to false (dynamic allocation)</span>
<span class="number">  15</span>  <span class="k1">bool</span> tf_conserveMemory<span class="k2">;</span>    <span class="c">//if set dynamic arrays are shortened to conserve memory</span>
<span class="number">  16</span>
<span class="number">  17</span>  <span class="k1">bool</span> AddCharacter<span class="k2">(</span><span class="k1">char</span> c<span class="k2">)</span><span class="k2">;</span>            <span class="c">//add character at current cursor position. (return true if success)</span>
<span class="number">  18</span>  <span class="k1">bool</span> DeleteCharacter<span class="k2">(</span><span class="k1">bool</span> reverse <span class="k3">=</span>  <span class="k1">false</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">//delete character at current position. (return true if success)</span>
<span class="number">  19</span>
<span class="number">  20</span>public:
<span class="number">  21</span>  TextField<span class="k2">(</span><span class="k1">int</span> maxLength<span class="k3">=</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span>                      <span class="c">//initialize empty field</span>
<span class="number">  22</span>  TextField<span class="k2">(</span><span class="k1">char</span> <span class="k3">*</span> StartString, <span class="k1">int</span> StartPosition, <span class="k1">int</span> maxLength<span class="k3">=</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">//initialize field with starting string and cursor position</span>
<span class="number">  23</span>  
<span class="number">  24</span>  ~TextField<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>        <span class="c">//destructor, deallocates tf_string;</span>
<span class="number">  25</span>
<span class="number">  26</span>  <span class="k1">char</span> <span class="k3">*</span> GetString<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>      <span class="c">//returns current string</span>
<span class="number">  27</span>  <span class="k1">int</span> GetPosition<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>      <span class="c">//returns current cursor position</span>
<span class="number">  28</span>  <span class="k1">int</span> GetSize<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>        <span class="c">//returns current size of string</span>
<span class="number">  29</span>  <span class="k1">int</span> GetArraySize<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>      <span class="c">//returns current size of array</span>
<span class="number">  30</span>  <span class="k1">bool</span> IsConserve<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>      <span class="c">//returns if dynamic arrays are resized to conserve memory</span>
<span class="number">  31</span>  <span class="k1">bool</span> IsStatic<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>      <span class="c">//returns if field has static length</span>
<span class="number">  32</span>
<span class="number">  33</span>  <span class="k1">bool</span> SetPosition<span class="k2">(</span><span class="k1">int</span> p<span class="k2">)</span><span class="k2">;</span>      <span class="c">//set cursor position</span>
<span class="number">  34</span>  <span class="k1">void</span> SetConserve<span class="k2">(</span><span class="k1">bool</span> conserve<span class="k2">)</span><span class="k2">;</span>  <span class="c">//set dynamic string memory conservation</span>
<span class="number">  35</span>  <span class="k1">bool</span> SetString<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> s<span class="k2">)</span><span class="k2">;</span>
<span class="number">  36</span>
<span class="number">  37</span>  <span class="k1">bool</span> Clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  38</span>
<span class="number">  39</span>  <span class="k1">bool</span> ProcessKey<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">)</span><span class="k2">;</span>  <span class="c">//processes a key press (returns true if success, false if failure, null if ignored)</span>
<span class="number">  40</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  41</span>
<span class="number">  42</span>TextField::TextField<span class="k2">(</span><span class="k1">int</span> maxLength<span class="k2">)</span>
<span class="number">  43</span><span class="k2">{</span>
<span class="number">  44</span>  <span class="k1">if</span><span class="k2">(</span>maxLength <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> <span class="c">//if MaxLength was set greater than zero, array is Static length</span>
<span class="number">  45</span>  <span class="k2">{</span>
<span class="number">  46</span>    tf_array_size <span class="k3">=</span> maxLength<span class="k2">;</span>
<span class="number">  47</span>    tf_isStatic <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  48</span>  <span class="k2">}</span>
<span class="number">  49</span>  <span class="k1">else</span> <span class="c">//set as dynamic with a starting 10 character storage</span>
<span class="number">  50</span>  <span class="k2">{</span>
<span class="number">  51</span>    tf_array_size <span class="k3">=</span> <span class="n">10</span><span class="k2">;</span>
<span class="number">  52</span>    tf_isStatic <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  53</span>  <span class="k2">}</span>
<span class="number">  54</span>  tf_string <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span><span class="k2">[</span>tf_array_size<span class="k2">]</span><span class="k2">;</span>
<span class="number">  55</span>  tf_string<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> <span class="s">'\0'</span><span class="k2">;</span>
<span class="number">  56</span>  tf_string_size <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  57</span>  tf_position <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  58</span>  tf_conserveMemory <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  59</span><span class="k2">}</span>
<span class="number">  60</span>
<span class="number">  61</span>TextField::TextField<span class="k2">(</span><span class="k1">char</span> <span class="k3">*</span> StartString, <span class="k1">int</span> StartPosition, <span class="k1">int</span> MaxLength<span class="k2">)</span>
<span class="number">  62</span><span class="k2">{</span>
<span class="number">  63</span>  tf_string_size <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>StartString<span class="k2">)</span><span class="k2">;</span>
<span class="number">  64</span>
<span class="number">  65</span>  <span class="k1">if</span><span class="k2">(</span>MaxLength <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> <span class="c">//if MaxLength was set greater than zero, array is Static length</span>
<span class="number">  66</span>  <span class="k2">{</span>
<span class="number">  67</span>    tf_array_size <span class="k3">=</span> MaxLength<span class="k2">;</span>
<span class="number">  68</span>    tf_string <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span><span class="k2">[</span>tf_array_size<span class="k2">]</span><span class="k2">;</span>
<span class="number">  69</span>    tf_isStatic <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  70</span>    <span class="k1">if</span><span class="k2">(</span>tf_string_size <span class="k3">&gt;</span> tf_array_size<span class="k2">)</span>
<span class="number">  71</span>    <span class="k2">{</span>
<span class="number">  72</span>      tf_string_size <span class="k3">=</span> tf_array_size<span class="k2">;</span>
<span class="number">  73</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_769.html" target="_blank">strncpy</a><span class="k2">(</span>tf_string,StartString,tf_array_size<span class="k2">)</span><span class="k2">;</span>
<span class="number">  74</span>    <span class="k2">}</span>
<span class="number">  75</span>    <span class="k1">else</span>
<span class="number">  76</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_756.html" target="_blank">strcpy</a><span class="k2">(</span>tf_string,StartString<span class="k2">)</span><span class="k2">;</span>
<span class="number">  77</span>  <span class="k2">}</span>
<span class="number">  78</span>  <span class="k1">else</span> <span class="c">//set as Dynamic length larger than starting string</span>
<span class="number">  79</span>  <span class="k2">{</span>
<span class="number">  80</span>    tf_array_size <span class="k3">=</span> tf_string_size <span class="k3">+</span> <span class="n">10</span><span class="k2">;</span>
<span class="number">  81</span>    tf_string <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span><span class="k2">[</span>tf_array_size<span class="k2">]</span><span class="k2">;</span>
<span class="number">  82</span>    tf_isStatic <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  83</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_756.html" target="_blank">strcpy</a><span class="k2">(</span>tf_string,StartString<span class="k2">)</span><span class="k2">;</span>
<span class="number">  84</span>  <span class="k2">}</span>
<span class="number">  85</span>  
<span class="number">  86</span>  <span class="k1">if</span><span class="k2">(</span>StartPosition<span class="k3">&lt;</span><span class="n">0</span><span class="k2">)</span>
<span class="number">  87</span>    tf_position<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number">  88</span>  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>StartPosition&gt;tf_string_size<span class="k2">)</span>
<span class="number">  89</span>    tf_position<span class="k3">=</span>tf_string_size<span class="k2">;</span>
<span class="number">  90</span>  <span class="k1">else</span>
<span class="number">  91</span>    tf_position <span class="k3">=</span> StartPosition<span class="k2">;</span>
<span class="number">  92</span>  tf_conserveMemory <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  93</span><span class="k2">}</span>
<span class="number">  94</span>
<span class="number">  95</span>TextField::~TextField<span class="k2">(</span><span class="k2">)</span>
<span class="number">  96</span><span class="k2">{</span>
<span class="number">  97</span>  <span class="k1">delete</span> <span class="k2">[</span><span class="k2">]</span> tf_string<span class="k2">;</span>
<span class="number">  98</span><span class="k2">}</span>
<span class="number">  99</span>
<span class="number"> 100</span><span class="k1">char</span> <span class="k3">*</span> TextField::GetString<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 101</span><span class="k2">{</span>
<span class="number"> 102</span>  <span class="k1">return</span> tf_string<span class="k2">;</span>
<span class="number"> 103</span><span class="k2">}</span>
<span class="number"> 104</span>
<span class="number"> 105</span><span class="k1">int</span> TextField::GetPosition<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 106</span><span class="k2">{</span>
<span class="number"> 107</span>  <span class="k1">return</span> tf_position<span class="k2">;</span>
<span class="number"> 108</span><span class="k2">}</span>
<span class="number"> 109</span>
<span class="number"> 110</span><span class="k1">int</span> TextField::GetSize<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 111</span><span class="k2">{</span>
<span class="number"> 112</span>  <span class="k1">return</span> tf_string_size<span class="k2">;</span>
<span class="number"> 113</span><span class="k2">}</span>
<span class="number"> 114</span>
<span class="number"> 115</span><span class="k1">int</span> TextField::GetArraySize<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 116</span><span class="k2">{</span>
<span class="number"> 117</span>  <span class="k1">return</span> tf_array_size<span class="k2">;</span>
<span class="number"> 118</span><span class="k2">}</span>
<span class="number"> 119</span>
<span class="number"> 120</span><span class="k1">bool</span> TextField::IsConserve<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 121</span><span class="k2">{</span>
<span class="number"> 122</span>  <span class="k1">return</span> tf_conserveMemory<span class="k2">;</span>
<span class="number"> 123</span><span class="k2">}</span>
<span class="number"> 124</span>
<span class="number"> 125</span><span class="k1">bool</span> TextField::IsStatic<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 126</span><span class="k2">{</span>
<span class="number"> 127</span>  <span class="k1">return</span> tf_isStatic<span class="k2">;</span>
<span class="number"> 128</span><span class="k2">}</span>
<span class="number"> 129</span>
<span class="number"> 130</span><span class="k1">bool</span> TextField::SetPosition<span class="k2">(</span><span class="k1">int</span> p<span class="k2">)</span>
<span class="number"> 131</span><span class="k2">{</span>
<span class="number"> 132</span>  <span class="k1">if</span><span class="k2">(</span>p<span class="k3">&lt;</span><span class="n">0</span><span class="k2">)</span>
<span class="number"> 133</span>    <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 134</span>  <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>p <span class="k3">&gt;</span> tf_string_size<span class="k2">)</span>
<span class="number"> 135</span>    <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 136</span>  <span class="k1">else</span>
<span class="number"> 137</span>    tf_position <span class="k3">=</span> p<span class="k2">;</span>
<span class="number"> 138</span>  
<span class="number"> 139</span>  <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 140</span><span class="k2">}</span>
<span class="number"> 141</span>
<span class="number"> 142</span><span class="k1">void</span> TextField::SetConserve<span class="k2">(</span><span class="k1">bool</span> conserve<span class="k2">)</span>
<span class="number"> 143</span><span class="k2">{</span>
<span class="number"> 144</span>  tf_conserveMemory <span class="k3">=</span> conserve<span class="k2">;</span>
<span class="number"> 145</span><span class="k2">}</span>
<span class="number"> 146</span>
<span class="number"> 147</span><span class="k1">bool</span> TextField::SetString<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> NewString<span class="k2">)</span>
<span class="number"> 148</span><span class="k2">{</span>
<span class="number"> 149</span>  tf_string_size <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>NewString<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 150</span>
<span class="number"> 151</span>  <span class="k1">if</span><span class="k2">(</span>tf_isStatic<span class="k2">)</span>
<span class="number"> 152</span>  <span class="k2">{</span>
<span class="number"> 153</span>    <span class="k1">if</span><span class="k2">(</span>tf_string_size <span class="k3">&gt;</span> tf_array_size<span class="k2">)</span>
<span class="number"> 154</span>    <span class="k2">{</span>
<span class="number"> 155</span>      tf_string_size <span class="k3">=</span> tf_array_size<span class="k2">;</span>
<span class="number"> 156</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_769.html" target="_blank">strncpy</a><span class="k2">(</span>tf_string,NewString,tf_array_size<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 157</span>    <span class="k2">}</span>
<span class="number"> 158</span>    <span class="k1">else</span>
<span class="number"> 159</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_756.html" target="_blank">strcpy</a><span class="k2">(</span>tf_string,NewString<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 160</span>  <span class="k2">}</span>
<span class="number"> 161</span>  <span class="k1">else</span> <span class="c">//set as Dynamic length larger than starting string</span>
<span class="number"> 162</span>  <span class="k2">{</span>
<span class="number"> 163</span>    tf_array_size <span class="k3">=</span> tf_string_size <span class="k3">+</span> <span class="n">10</span><span class="k2">;</span>
<span class="number"> 164</span>    <span class="k1">delete</span> <span class="k2">[</span><span class="k2">]</span> tf_string<span class="k2">;</span>
<span class="number"> 165</span>    tf_string <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span><span class="k2">[</span>tf_array_size<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 166</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_756.html" target="_blank">strcpy</a><span class="k2">(</span>tf_string,NewString<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 167</span>  <span class="k2">}</span>
<span class="number"> 168</span>  
<span class="number"> 169</span>  <span class="k1">if</span><span class="k2">(</span>tf_position<span class="k3">&lt;</span><span class="n">0</span><span class="k2">)</span>
<span class="number"> 170</span>    tf_position<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 171</span>  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>tf_position&gt;tf_string_size<span class="k2">)</span>
<span class="number"> 172</span>    tf_position<span class="k3">=</span>tf_string_size<span class="k2">;</span>
<span class="number"> 173</span>
<span class="number"> 174</span>  <span class="k1">return</span><span class="k2">(</span><span class="k1">true</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 175</span><span class="k2">}</span>
<span class="number"> 176</span>
<span class="number"> 177</span><span class="k1">bool</span> TextField::Clear<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 178</span><span class="k2">{</span>
<span class="number"> 179</span>
<span class="number"> 180</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>tf_isStatic<span class="k2">)</span>
<span class="number"> 181</span>    tf_array_size <span class="k3">=</span> <span class="n">10</span><span class="k2">;</span>
<span class="number"> 182</span>  
<span class="number"> 183</span>  tf_string<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> <span class="s">'\0'</span><span class="k2">;</span>
<span class="number"> 184</span>  tf_string_size <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 185</span>  tf_position <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 186</span>
<span class="number"> 187</span>  <span class="k1">return</span><span class="k2">(</span><span class="k1">true</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 188</span><span class="k2">}</span>
<span class="number"> 189</span>
<span class="number"> 190</span><span class="k1">bool</span> TextField::AddCharacter<span class="k2">(</span><span class="k1">char</span> c<span class="k2">)</span>
<span class="number"> 191</span><span class="k2">{</span>
<span class="number"> 192</span>  <span class="k1">if</span><span class="k2">(</span>tf_position&gt;tf_string_size<span class="k2">)</span>    <span class="c">//catches error if position out of bounds</span>
<span class="number"> 193</span>    tf_position<span class="k3">=</span>tf_string_size<span class="k2">;</span>
<span class="number"> 194</span>
<span class="number"> 195</span>  <span class="k1">if</span><span class="k2">(</span>tf_position<span class="k3">&lt;</span><span class="n">0</span><span class="k2">)</span>          <span class="c">//catches error if position out of bounds</span>
<span class="number"> 196</span>    tf_position<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 197</span>
<span class="number"> 198</span>  <span class="k1">if</span><span class="k2">(</span>tf_array_size<span class="k3">&lt;</span><span class="k3">=</span>tf_string_size<span class="k3">+</span><span class="n">1</span><span class="k2">)</span>      <span class="c">//if field is full</span>
<span class="number"> 199</span>  <span class="k2">{</span>
<span class="number"> 200</span>    <span class="k1">if</span><span class="k2">(</span>tf_isStatic<span class="k2">)</span>    <span class="c">//cannot add any characters</span>
<span class="number"> 201</span>      <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 202</span>    <span class="k1">else</span>        <span class="c">//resize dynamic array (adds 10)</span>
<span class="number"> 203</span>    <span class="k2">{</span>
<span class="number"> 204</span>      tf_array_size<span class="k3">+</span><span class="k3">=</span><span class="n">10</span><span class="k2">;</span>
<span class="number"> 205</span>      <span class="k1">char</span><span class="k3">*</span> temp <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span> <span class="k2">[</span>tf_array_size<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 206</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_756.html" target="_blank">strcpy</a><span class="k2">(</span>temp, tf_string<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 207</span>      <span class="k1">delete</span> <span class="k2">[</span><span class="k2">]</span> tf_string<span class="k2">;</span>
<span class="number"> 208</span>      tf_string<span class="k3">=</span>temp<span class="k2">;</span>
<span class="number"> 209</span>    <span class="k2">}</span>
<span class="number"> 210</span>  <span class="k2">}</span>
<span class="number"> 211</span>  
<span class="number"> 212</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_568.html" target="_blank">memmove</a><span class="k2">(</span>tf_string<span class="k3">+</span>tf_position<span class="k3">+</span><span class="n">1</span>, tf_string<span class="k3">+</span>tf_position, tf_string_size-tf_position<span class="k3">+</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 213</span>  tf_string<span class="k2">[</span>tf_position<span class="k2">]</span> <span class="k3">=</span> c<span class="k2">;</span>
<span class="number"> 214</span>  tf_position<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 215</span>  tf_string_size<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 216</span>
<span class="number"> 217</span>  <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 218</span><span class="k2">}</span>
<span class="number"> 219</span>
<span class="number"> 220</span><span class="k1">bool</span> TextField::DeleteCharacter<span class="k2">(</span><span class="k1">bool</span> reverse<span class="k2">)</span>
<span class="number"> 221</span><span class="k2">{</span>
<span class="number"> 222</span>  <span class="k1">if</span><span class="k2">(</span>tf_position <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span>          <span class="c">//catches out of range error</span>
<span class="number"> 223</span>    tf_position<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 224</span>  <span class="k1">if</span><span class="k2">(</span>tf_position <span class="k3">&gt;</span> tf_string_size<span class="k2">)</span>  <span class="c">//catches out of range error</span>
<span class="number"> 225</span>    tf_position <span class="k3">=</span> tf_string_size<span class="k2">;</span>
<span class="number"> 226</span>
<span class="number"> 227</span>  <span class="k1">if</span><span class="k2">(</span>reverse<span class="k2">)</span>
<span class="number"> 228</span>  <span class="k2">{</span>
<span class="number"> 229</span>    <span class="k1">if</span><span class="k2">(</span>tf_position<span class="k3">=</span><span class="k3">=</span>tf_string_size<span class="k2">)</span>
<span class="number"> 230</span>      <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 231</span>    <span class="k1">else</span>
<span class="number"> 232</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_568.html" target="_blank">memmove</a><span class="k2">(</span>tf_string<span class="k3">+</span>tf_position, tf_string<span class="k3">+</span>tf_position<span class="k3">+</span><span class="n">1</span>, tf_string_size-tf_position<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 233</span>  <span class="k2">}</span>
<span class="number"> 234</span>  <span class="k1">else</span>
<span class="number"> 235</span>  <span class="k2">{</span>
<span class="number"> 236</span>    <span class="k1">if</span><span class="k2">(</span>tf_position<span class="k3">=</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span>
<span class="number"> 237</span>      <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 238</span>    <span class="k1">else</span>
<span class="number"> 239</span>    <span class="k2">{</span>
<span class="number"> 240</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_568.html" target="_blank">memmove</a><span class="k2">(</span>tf_string<span class="k3">+</span>tf_position-1, tf_string<span class="k3">+</span>tf_position, tf_string_size-tf_position<span class="k3">+</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 241</span>      tf_position--<span class="k2">;</span>
<span class="number"> 242</span>    <span class="k2">}</span>
<span class="number"> 243</span>  <span class="k2">}</span>
<span class="number"> 244</span>
<span class="number"> 245</span>  tf_string_size--<span class="k2">;</span>
<span class="number"> 246</span>
<span class="number"> 247</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>tf_isStatic <span class="k3">&amp;</span><span class="k3">&amp;</span> tf_conserveMemory <span class="k3">&amp;</span><span class="k3">&amp;</span> tf_array_size&gt;<span class="k3">=</span><span class="n">20</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> tf_string_size<span class="k3">+</span><span class="n">19</span><span class="k3">&lt;</span><span class="k3">=</span>tf_array_size<span class="k2">)</span> <span class="c">//resizes array to conserve memory (removes 10)</span>
<span class="number"> 248</span>  <span class="k2">{</span>
<span class="number"> 249</span>    tf_array_size-<span class="k3">=</span><span class="n">10</span><span class="k2">;</span>
<span class="number"> 250</span>    <span class="k1">char</span><span class="k3">*</span> temp <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span> <span class="k2">[</span>tf_array_size<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 251</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_756.html" target="_blank">strcpy</a><span class="k2">(</span>temp, tf_string<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 252</span>    <span class="k1">delete</span> <span class="k2">[</span><span class="k2">]</span> tf_string<span class="k2">;</span>
<span class="number"> 253</span>    tf_string<span class="k3">=</span>temp<span class="k2">;</span>
<span class="number"> 254</span>  <span class="k2">}</span>
<span class="number"> 255</span>
<span class="number"> 256</span>  <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 257</span><span class="k2">}</span>
<span class="number"> 258</span>
<span class="number"> 259</span><span class="k1">bool</span> TextField::ProcessKey<span class="k2">(</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"> 260</span><span class="k2">{</span>
<span class="number"> 261</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_KEYBOARD_STATE"><span class="a">ALLEGRO_KEYBOARD_STATE</span></a> state<span class="k2">;</span>
<span class="number"> 262</span>  <span class="k1">bool</span> shiftDown<span class="k3">=</span><span class="k1">false</span><span class="k2">;</span>
<span class="number"> 263</span>
<span class="number"> 264</span>  <a href="http://www.allegro.cc/manual/al_get_keyboard_state"><span class="a">al_get_keyboard_state</span></a><span class="k2">(</span><span class="k3">&amp;</span>state<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 265</span>
<span class="number"> 266</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="k3">|</span><span class="k3">|</span> 
<span class="number"> 267</span>    <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span><span class="k3">&amp;</span>state, ALLEGRO_KEY_ALT<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span><span class="k3">&amp;</span>state, ALLEGRO_KEY_ALTGR<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> 
<span class="number"> 268</span>    <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span><span class="k3">&amp;</span>state, ALLEGRO_KEY_RCTRL<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span><span class="k3">&amp;</span>state, ALLEGRO_KEY_LCTRL<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 269</span>      <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 270</span>  <span class="k1">else</span>
<span class="number"> 271</span>  <span class="k2">{</span>
<span class="number"> 272</span>    <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span><span class="k3">&amp;</span>state, ALLEGRO_KEY_LSHIFT<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span><span class="k3">&amp;</span>state, ALLEGRO_KEY_RSHIFT<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 273</span>      shiftDown<span class="k3">=</span><span class="k1">true</span><span class="k2">;</span>
<span class="number"> 274</span>
<span class="number"> 275</span>    <span class="k1">if</span><span class="k2">(</span>ev.keyboard.keycode <span class="k3">&gt;</span><span class="k3">=</span> ALLEGRO_KEY_A <span class="k3">&amp;</span><span class="k3">&amp;</span> ev.keyboard.keycode <span class="k3">&lt;</span><span class="k3">=</span> ALLEGRO_KEY_Z<span class="k2">)</span>
<span class="number"> 276</span>    <span class="k2">{</span>
<span class="number"> 277</span>      <span class="k1">if</span><span class="k2">(</span>shiftDown<span class="k2">)</span>
<span class="number"> 278</span>        <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'A'</span><span class="k3">+</span>ev.keyboard.keycode-ALLEGRO_KEY_A<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 279</span>      <span class="k1">else</span>
<span class="number"> 280</span>        <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'a'</span><span class="k3">+</span>ev.keyboard.keycode-ALLEGRO_KEY_A<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 281</span>    <span class="k2">}</span>
<span class="number"> 282</span>    <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>ev.keyboard.keycode <span class="k3">&gt;</span><span class="k3">=</span> ALLEGRO_KEY_0 <span class="k3">&amp;</span><span class="k3">&amp;</span> ev.keyboard.keycode <span class="k3">&lt;</span><span class="k3">=</span> ALLEGRO_KEY_9<span class="k2">)</span>
<span class="number"> 283</span>    <span class="k2">{</span>
<span class="number"> 284</span>      <span class="k1">if</span><span class="k2">(</span>shiftDown<span class="k2">)</span>
<span class="number"> 285</span>        <span class="k1">switch</span><span class="k2">(</span>ev.keyboard.keycode<span class="k2">)</span>
<span class="number"> 286</span>        <span class="k2">{</span>
<span class="number"> 287</span>          <span class="k1">case</span> ALLEGRO_KEY_0 <span class="k2">:</span>
<span class="number"> 288</span>            AddCharacter<span class="k2">(</span><span class="s">')'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 289</span>          <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 290</span>          <span class="k1">case</span> ALLEGRO_KEY_1 <span class="k2">:</span>
<span class="number"> 291</span>            AddCharacter<span class="k2">(</span><span class="s">'!'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 292</span>          <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 293</span>          <span class="k1">case</span> ALLEGRO_KEY_2 <span class="k2">:</span>
<span class="number"> 294</span>            AddCharacter<span class="k2">(</span><span class="s">'@'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 295</span>          <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 296</span>          <span class="k1">case</span> ALLEGRO_KEY_3 <span class="k2">:</span>
<span class="number"> 297</span>            AddCharacter<span class="k2">(</span><span class="s">'#'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 298</span>          <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 299</span>          <span class="k1">case</span> ALLEGRO_KEY_4 <span class="k2">:</span>
<span class="number"> 300</span>            AddCharacter<span class="k2">(</span><span class="s">'$'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 301</span>          <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 302</span>          <span class="k1">case</span> ALLEGRO_KEY_5 <span class="k2">:</span>
<span class="number"> 303</span>            AddCharacter<span class="k2">(</span><span class="s">'%'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 304</span>          <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 305</span>          <span class="k1">case</span> ALLEGRO_KEY_6 <span class="k2">:</span>
<span class="number"> 306</span>            AddCharacter<span class="k2">(</span><span class="s">'^'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 307</span>          <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 308</span>          <span class="k1">case</span> ALLEGRO_KEY_7 <span class="k2">:</span>
<span class="number"> 309</span>            AddCharacter<span class="k2">(</span><span class="s">'&amp;'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 310</span>          <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 311</span>          <span class="k1">case</span> ALLEGRO_KEY_8 <span class="k2">:</span>
<span class="number"> 312</span>            AddCharacter<span class="k2">(</span><span class="s">'*'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 313</span>          <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 314</span>          <span class="k1">case</span> ALLEGRO_KEY_9 <span class="k2">:</span>
<span class="number"> 315</span>            AddCharacter<span class="k2">(</span><span class="s">'('</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 316</span>          <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 317</span>        <span class="k2">}</span>
<span class="number"> 318</span>      <span class="k1">else</span>
<span class="number"> 319</span>        <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'0'</span><span class="k3">+</span>ev.keyboard.keycode-ALLEGRO_KEY_0<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 320</span>    <span class="k2">}</span>
<span class="number"> 321</span>    <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>ev.keyboard.keycode <span class="k3">&gt;</span><span class="k3">=</span> ALLEGRO_KEY_PAD_0 <span class="k3">&amp;</span><span class="k3">&amp;</span> ev.keyboard.keycode <span class="k3">&lt;</span><span class="k3">=</span> ALLEGRO_KEY_PAD_9<span class="k2">)</span>
<span class="number"> 322</span>    <span class="k2">{</span>
<span class="number"> 323</span>      <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'0'</span><span class="k3">+</span>ev.keyboard.keycode-ALLEGRO_KEY_PAD_0<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 324</span>    <span class="k2">}</span>
<span class="number"> 325</span>    <span class="k1">else</span>
<span class="number"> 326</span>    <span class="k2">{</span>
<span class="number"> 327</span>      <span class="k1">switch</span><span class="k2">(</span>ev.keyboard.keycode<span class="k2">)</span>
<span class="number"> 328</span>      <span class="k2">{</span>
<span class="number"> 329</span>        <span class="k1">case</span> ALLEGRO_KEY_TILDE <span class="k2">:</span>
<span class="number"> 330</span>          <span class="k1">if</span><span class="k2">(</span>shiftDown<span class="k2">)</span>
<span class="number"> 331</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'~'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 332</span>          <span class="k1">else</span>
<span class="number"> 333</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'`'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 334</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 335</span>        <span class="k1">case</span> ALLEGRO_KEY_MINUS <span class="k2">:</span>
<span class="number"> 336</span>          <span class="k1">if</span><span class="k2">(</span>shiftDown<span class="k2">)</span>
<span class="number"> 337</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'_'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 338</span>          <span class="k1">else</span>
<span class="number"> 339</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'-'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 340</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 341</span>        <span class="k1">case</span> ALLEGRO_KEY_EQUALS <span class="k2">:</span>
<span class="number"> 342</span>          <span class="k1">if</span><span class="k2">(</span>shiftDown<span class="k2">)</span>
<span class="number"> 343</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'+'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 344</span>          <span class="k1">else</span>
<span class="number"> 345</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'='</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 346</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 347</span>        <span class="k1">case</span> ALLEGRO_KEY_BACKSPACE <span class="k2">:</span>
<span class="number"> 348</span>          <span class="k1">return</span> DeleteCharacter<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 349</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 350</span>        <span class="k1">case</span> ALLEGRO_KEY_OPENBRACE <span class="k2">:</span>
<span class="number"> 351</span>          <span class="k1">if</span><span class="k2">(</span>shiftDown<span class="k2">)</span>
<span class="number"> 352</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'{'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 353</span>          <span class="k1">else</span>
<span class="number"> 354</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'['</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 355</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 356</span>        <span class="k1">case</span> ALLEGRO_KEY_CLOSEBRACE <span class="k2">:</span>
<span class="number"> 357</span>          <span class="k1">if</span><span class="k2">(</span>shiftDown<span class="k2">)</span>
<span class="number"> 358</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'}'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 359</span>          <span class="k1">else</span>
<span class="number"> 360</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">']'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 361</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 362</span>        <span class="k1">case</span> ALLEGRO_KEY_SEMICOLON <span class="k2">:</span>
<span class="number"> 363</span>          <span class="k1">if</span><span class="k2">(</span>shiftDown<span class="k2">)</span>
<span class="number"> 364</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">':'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 365</span>          <span class="k1">else</span>
<span class="number"> 366</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">';'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 367</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 368</span>        <span class="k1">case</span> ALLEGRO_KEY_QUOTE <span class="k2">:</span>
<span class="number"> 369</span>          <span class="k1">if</span><span class="k2">(</span>shiftDown<span class="k2">)</span>
<span class="number"> 370</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'\"'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 371</span>          <span class="k1">else</span>
<span class="number"> 372</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'\''</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 373</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 374</span>        <span class="k1">case</span> ALLEGRO_KEY_BACKSLASH <span class="k2">:</span>
<span class="number"> 375</span>          <span class="k1">if</span><span class="k2">(</span>shiftDown<span class="k2">)</span>
<span class="number"> 376</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'|'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 377</span>          <span class="k1">else</span>
<span class="number"> 378</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'\\'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 379</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 380</span>        <span class="k1">case</span> ALLEGRO_KEY_BACKSLASH2 <span class="k2">:</span> <span class="c">/* DirectInput calls this DIK_OEM_102: "&lt; &gt; | on UK/Germany keyboards" */</span>
<span class="number"> 381</span>          <span class="k1">if</span><span class="k2">(</span>shiftDown<span class="k2">)</span>
<span class="number"> 382</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'|'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 383</span>          <span class="k1">else</span>
<span class="number"> 384</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'\\'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 385</span>        <span class="k1">break</span><span class="k2">;</span> 
<span class="number"> 386</span>        <span class="k1">case</span> ALLEGRO_KEY_COMMA <span class="k2">:</span>
<span class="number"> 387</span>          <span class="k1">if</span><span class="k2">(</span>shiftDown<span class="k2">)</span>
<span class="number"> 388</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'&lt;'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 389</span>          <span class="k1">else</span>
<span class="number"> 390</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">','</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 391</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 392</span>        <span class="k1">case</span> ALLEGRO_KEY_FULLSTOP <span class="k2">:</span>
<span class="number"> 393</span>          <span class="k1">if</span><span class="k2">(</span>shiftDown<span class="k2">)</span>
<span class="number"> 394</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'&gt;'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 395</span>          <span class="k1">else</span>
<span class="number"> 396</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'.'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 397</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 398</span>        <span class="k1">case</span> ALLEGRO_KEY_SLASH <span class="k2">:</span>
<span class="number"> 399</span>          <span class="k1">if</span><span class="k2">(</span>shiftDown<span class="k2">)</span>
<span class="number"> 400</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'?'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 401</span>          <span class="k1">else</span>
<span class="number"> 402</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'/'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 403</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 404</span>        <span class="k1">case</span> ALLEGRO_KEY_SPACE <span class="k2">:</span>
<span class="number"> 405</span>          <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">' '</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 406</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 407</span>
<span class="number"> 408</span>        <span class="k1">case</span> ALLEGRO_KEY_DELETE <span class="k2">:</span>
<span class="number"> 409</span>          <span class="k1">return</span> DeleteCharacter<span class="k2">(</span><span class="k1">true</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 410</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 411</span>        <span class="k1">case</span> ALLEGRO_KEY_HOME <span class="k2">:</span>
<span class="number"> 412</span>          tf_position <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 413</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 414</span>        <span class="k1">case</span> ALLEGRO_KEY_END <span class="k2">:</span>
<span class="number"> 415</span>          tf_position <span class="k3">=</span> tf_string_size<span class="k2">;</span>
<span class="number"> 416</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 417</span>        <span class="k1">case</span> ALLEGRO_KEY_LEFT <span class="k2">:</span>
<span class="number"> 418</span>          <span class="k1">if</span><span class="k2">(</span>tf_position <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 419</span>            tf_position--<span class="k2">;</span>
<span class="number"> 420</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 421</span>        <span class="k1">case</span> ALLEGRO_KEY_RIGHT <span class="k2">:</span>
<span class="number"> 422</span>          <span class="k1">if</span><span class="k2">(</span>tf_position <span class="k3">&lt;</span> tf_string_size<span class="k2">)</span>
<span class="number"> 423</span>            tf_position<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 424</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 425</span>        <span class="k1">case</span> ALLEGRO_KEY_UP <span class="k2">:</span>
<span class="number"> 426</span>          <span class="c">//if you want to add a keyboard buffer of previous tf_strings</span>
<span class="number"> 427</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 428</span>        <span class="k1">case</span> ALLEGRO_KEY_DOWN <span class="k2">:</span>
<span class="number"> 429</span>          <span class="c">//same as key up</span>
<span class="number"> 430</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 431</span>
<span class="number"> 432</span>        <span class="k1">case</span> ALLEGRO_KEY_PAD_SLASH <span class="k2">:</span>
<span class="number"> 433</span>          <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'/'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 434</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 435</span>        <span class="k1">case</span> ALLEGRO_KEY_PAD_ASTERISK <span class="k2">:</span>
<span class="number"> 436</span>          <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'*'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 437</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 438</span>        <span class="k1">case</span> ALLEGRO_KEY_PAD_MINUS <span class="k2">:</span>
<span class="number"> 439</span>          <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'-'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 440</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 441</span>        <span class="k1">case</span> ALLEGRO_KEY_PAD_PLUS <span class="k2">:</span>
<span class="number"> 442</span>          <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'+'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 443</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 444</span>        <span class="k1">case</span> ALLEGRO_KEY_PAD_DELETE <span class="k2">:</span>
<span class="number"> 445</span>          <span class="k1">return</span> DeleteCharacter<span class="k2">(</span><span class="k1">true</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 446</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 447</span>
<span class="number"> 448</span>        <span class="k1">case</span> ALLEGRO_KEY_COLON2 <span class="k2">:</span>
<span class="number"> 449</span>          <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">':'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 450</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 451</span>
<span class="number"> 452</span>        <span class="k1">case</span> ALLEGRO_KEY_PAD_EQUALS <span class="k2">:</span>
<span class="number"> 453</span>          <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'='</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 454</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 455</span>        <span class="k1">case</span> ALLEGRO_KEY_BACKQUOTE <span class="k2">:</span>
<span class="number"> 456</span>          <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'\''</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 457</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 458</span>        <span class="k1">case</span> ALLEGRO_KEY_SEMICOLON2 <span class="k2">:</span>
<span class="number"> 459</span>          <span class="k1">if</span><span class="k2">(</span>shiftDown<span class="k2">)</span>
<span class="number"> 460</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">':'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 461</span>          <span class="k1">else</span>
<span class="number"> 462</span>            <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">';'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 463</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 464</span>      <span class="k2">}</span>
<span class="number"> 465</span>    <span class="k2">}</span>
<span class="number"> 466</span>  <span class="k2">}</span>
<span class="number"> 467</span>
<span class="number"> 468</span>  <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 469</span><span class="k2">}</span>
<span class="number"> 470</span>
<span class="number"> 471</span>
<span class="number"> 472</span><span class="p">#endif</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Nazerith)</author>
		<pubDate>Thu, 17 Feb 2011 22:02:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Nazerith said:</div><div class="quote"><p>
speed is why I&#39;m not using std::String
</p></div></div><p>
This may be counter intuitive, but you&#39;ll probably save more time in development by using std::string. And also, the standard library has probably been optimized better than you could do with char* yourself. There&#39;s no way that at 60 updates per second that you will see any difference in speed of any kind by using char*&#39;s manually instead of using std::string.</p><div class="quote_container"><div class="title">Nazerith said:</div><div class="quote"><p>
</p><div class="source-code snippet"><div class="inner"><pre>   tf_array_size <span class="k3">=</span> MaxLength<span class="k2">;</span>
<span class="c">//...</span>
   <a href="http://www.delorie.com/djgpp/doc/libc/libc_769.html" target="_blank">strncpy</a><span class="k2">(</span>tf_string,StartString,tf_array_size<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
</p></div></div><p>
tf_array_size should be MaxLength plus one, to account for the null terminator.<br />Also, if you copy X characters into an array with X elements, where will the null terminator go?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 18 Feb 2011 11:42:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ugh.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">bool</span> TextField::ProcessKey<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">)</span>
<span class="k2">{</span>
  <a href="http://www.allegro.cc/manual/ALLEGRO_KEYBOARD_STATE"><span class="a">ALLEGRO_KEYBOARD_STATE</span></a> state<span class="k2">;</span>
  <span class="k1">bool</span> shiftDown<span class="k3">=</span><span class="k1">false</span><span class="k2">;</span>

  <a href="http://www.allegro.cc/manual/al_get_keyboard_state"><span class="a">al_get_keyboard_state</span></a><span class="k2">(</span><span class="k3">&amp;</span>state<span class="k2">)</span><span class="k2">;</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="k3">|</span><span class="k3">|</span> 
    <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span><span class="k3">&amp;</span>state, ALLEGRO_KEY_ALT<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span><span class="k3">&amp;</span>state, ALLEGRO_KEY_ALTGR<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> 
    <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span><span class="k3">&amp;</span>state, ALLEGRO_KEY_RCTRL<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span><span class="k3">&amp;</span>state, ALLEGRO_KEY_LCTRL<span class="k2">)</span><span class="k2">)</span>
      <span class="k1">return</span> NULL<span class="k2">;</span>
  <span class="k1">else</span>
</pre></div></div><p>

ev.keyboard.modifiers already has this information.</p><div class="source-code snippet"><div class="inner"><pre>    <span class="k1">if</span><span class="k2">(</span>ev.keyboard.keycode <span class="k3">&gt;</span><span class="k3">=</span> ALLEGRO_KEY_A <span class="k3">&amp;</span><span class="k3">&amp;</span> ev.keyboard.keycode <span class="k3">&lt;</span><span class="k3">=</span> ALLEGRO_KEY_Z<span class="k2">)</span>
    <span class="k2">{</span>
      <span class="k1">if</span><span class="k2">(</span>shiftDown<span class="k2">)</span>
        <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'A'</span><span class="k3">+</span>ev.keyboard.keycode-ALLEGRO_KEY_A<span class="k2">)</span><span class="k2">;</span>
      <span class="k1">else</span>
        <span class="k1">return</span> AddCharacter<span class="k2">(</span><span class="s">'a'</span><span class="k3">+</span>ev.keyboard.keycode-ALLEGRO_KEY_A<span class="k2">)</span><span class="k2">;</span>
    <span class="k2">}</span>
</pre></div></div><p>

The ev.keyboard.unichar field already has the information you need. Your code is needlessly verbose and will only &quot;work&quot; on US keyboard layouts.</p><p>If something is very repetitious, alarms should be sounding off in your head. Programmers hate repetition.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Wang)</author>
		<pubDate>Fri, 18 Feb 2011 12:11:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/606417/903982#target">Edgar Reynaldo</a> said:</div><div class="quote"><p>This may be counter intuitive, but you&#39;ll probably save more time in development by using std::string. And also, the standard library has probably been optimized better than you could do with char* yourself. There&#39;s no way that at 60 updates per second that you will see any difference in speed of any kind by using char*&#39;s manually instead of using std::string.</p></div></div><p>

Could I create a general purpose string library thats quicker than std:string. most likely not. But in the very specific usage I&#39;m implementing here, its already faster than std:string for various reasons.</p><p>1) Every time you concatenate or lengthen a std:string, new memory is allocated. I&#39;m only reallocating at a minimum of every ten concatenations.<br />2) Allocating new memory and using char * copy functions is faster than doing the same with std:string.</p><p>std:string has a bit of overhead that makes it very flexible. I don&#39;t need any of that flexibility, so I&#39;ve sacrificed the the overhead. You can find some places on the internet where people have run comparison tests. Depending on the exact test, char* operates roughly 2x to 10x faster than std::string but you have to be willing to handle your own memory management.</p><p>I&#39;m not worried about handling it 60 times a minute, but in a game there are frequently lots of events between frame renders. The less time it spends processing here, the more time it has to do other things. Since I&#39;m working up these components for an online game, I expect lots of other things happening as well.</p><div class="quote_container"><div class="title">Edgar Reynaldo said:</div><div class="quote"><p>
</p><div class="source-code snippet"><div class="inner"><pre>tf_array_size <span class="k3">=</span> MaxLength<span class="k2">;</span>
<span class="c">//...</span>
   <a href="http://www.delorie.com/djgpp/doc/libc/libc_769.html" target="_blank">strncpy</a><span class="k2">(</span>tf_string,StartString,tf_array_size<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
tf_array_size should be MaxLength plus one, to account for the null terminator.<br />Also, if you copy X characters into an array with X elements, where will the null terminator go?</p></div></div><p>

I&#39;ve been testing dynamic strings mostly. Guess I&#39;ll need to make the array for fixed strings one larger. However on the strncpy I don&#39;t need to account for the null character in the length, since the function adds a null at the end anyways (as you pointed out previously).</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/606417/903991#target">Peter Wang</a> said:</div><div class="quote"><p>
ev.keyboard.modifiers already has this information.
</p></div></div><p>
Yep. Originally I was using the Key Down event for my class, but have already switched to Key Char events. So in my next version I&#39;ve eliminated the need to test state (which should get rid of any timing errors for rapid key presses), and it also lets me handle when someone holds down a key. </p><div class="quote_container"><div class="title">Peter Wang said:</div><div class="quote"><p>
The ev.keyboard.unichar field already has the information you need. Your code is needlessly verbose and will only &quot;work&quot; on US keyboard layouts.</p><p>If something is very repetitious, alarms should be sounding off in your head. Programmers hate repetition.</p></div></div><p>

I&#39;m still learning all the things in the Allegro library. I&#39;ll take a look at the unicode stuff and see about implementing it.</p><p>Thanks for the feedback guys. Til Laters.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Nazerith)</author>
		<pubDate>Sat, 19 Feb 2011 06:57:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/606417/904182#target">Nazerith</a> said:</div><div class="quote"><p>
I&#39;ve been testing dynamic strings mostly. Guess I&#39;ll need to make the array for fixed strings one larger. However on the strncpy I don&#39;t need to account for the null character in the length, since the function adds a null at the end anyways (as you pointed out previously).
</p></div></div><p>
strcpy adds a null, if there is space for it, but I can&#39;t say for sure that strncpy does the same thing. And there&#39;s still the problem of using strncpy to copy X elements into an array that only has X elements. If it does add a trailing null, there will still be an overflow. If it does not, you still have a string that is not null terminated.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sat, 19 Feb 2011 07:07:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Agreed. Just to play it safe I&#39;ll make the array one larger.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Nazerith)</author>
		<pubDate>Sat, 19 Feb 2011 08:41:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Mine uses Unichar and uses UTF-8 and std::string, much cleaner &amp; more effective imho.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Sat, 19 Feb 2011 09:23:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Unicode does simply down the code, but now its too simplified.</p><div class="quote_container"><div class="title">Allegro API Docs said:</div><div class="quote"><p>
<b>keyboard.unichar (int)</b><br />A Unicode code point (character). This may be zero or negative if the event was generated for a non-visible &quot;character&quot;, such as an arrow key. In that case you can act upon the keycode field.
</p></div></div><p>

So a simple test of &quot;ev.keyboard.unichar &gt; 0&quot; should do right? Well it does for arrow keys and delete, but not for esc, backspace and a number of other keys that are &quot;non-visible&quot;. So now I have the opposite issue...I&#39;ve got to test for every key that doesn&#39;t belong. While obviously easier in the long run (if you are shooting for international keyboards), its still a pain.</p><p>Urg.</p><p>For those out their who have messed with the unicode field before, you have a simple way to filter out the garbage?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Nazerith)</author>
		<pubDate>Sat, 19 Feb 2011 13:03:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><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="k1">void</span> AguiTextBox::handleKeyboard<span class="k2">(</span> <span class="k1">const</span> AguiKeyEventArgs <span class="k3">&amp;</span>keyArgs <span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>
<span class="number">  4</span>  forceShowCaret<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>  resetCaretBlinkTime<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>  <span class="k1">if</span><span class="k2">(</span>keyArgs.getExtendedKey<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> AGUI_EXT_KEY_UP<span class="k2">)</span>
<span class="number">  7</span>  <span class="k2">{</span>
<span class="number">  8</span>    keyPositionCaret<span class="k2">(</span>getCaretColumn<span class="k2">(</span><span class="k2">)</span>,getCaretRow<span class="k2">(</span><span class="k2">)</span> <span class="k3">-</span> <span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>    <span class="k1">return</span><span class="k2">;</span>
<span class="number"> 10</span>  <span class="k2">}</span>
<span class="number"> 11</span>  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>keyArgs.getExtendedKey<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> AGUI_EXT_KEY_DOWN<span class="k2">)</span>
<span class="number"> 12</span>  <span class="k2">{</span>
<span class="number"> 13</span>    keyPositionCaret<span class="k2">(</span>getCaretColumn<span class="k2">(</span><span class="k2">)</span>,getCaretRow<span class="k2">(</span><span class="k2">)</span> <span class="k3">+</span> <span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>    <span class="k1">return</span><span class="k2">;</span>
<span class="number"> 15</span>  <span class="k2">}</span>
<span class="number"> 16</span>  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>keyArgs.getExtendedKey<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> AGUI_EXT_KEY_LEFT<span class="k2">)</span>
<span class="number"> 17</span>  <span class="k2">{</span>
<span class="number"> 18</span>    keyPositionCaret<span class="k2">(</span>getCaretColumn<span class="k2">(</span><span class="k2">)</span> <span class="k3">-</span> <span class="n">1</span>,getCaretRow<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>    <span class="k1">return</span><span class="k2">;</span>
<span class="number"> 20</span>  <span class="k2">}</span>
<span class="number"> 21</span>  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>keyArgs.getExtendedKey<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> AGUI_EXT_KEY_RIGHT<span class="k2">)</span>
<span class="number"> 22</span>  <span class="k2">{</span>
<span class="number"> 23</span>    keyPositionCaret<span class="k2">(</span>getCaretColumn<span class="k2">(</span><span class="k2">)</span> <span class="k3">+</span> <span class="n">1</span>,getCaretRow<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>    <span class="k1">return</span><span class="k2">;</span>
<span class="number"> 25</span>  <span class="k2">}</span>
<span class="number"> 26</span>  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>keyArgs.getKey<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> AGUI_KEY_BACKSPACE<span class="k2">)</span>
<span class="number"> 27</span>  <span class="k2">{</span>
<span class="number"> 28</span>    removeLastCharacter<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 29</span>  <span class="k2">}</span>
<span class="number"> 30</span>  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>keyArgs.getKey<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> AGUI_KEY_DELETE<span class="k2">)</span>
<span class="number"> 31</span>  <span class="k2">{</span>
<span class="number"> 32</span>    removeNextCharacter<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 33</span>  <span class="k2">}</span>
<span class="number"> 34</span>  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>keyArgs.getKey<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> AGUI_KEY_ENTER<span class="k2">)</span>
<span class="number"> 35</span>  <span class="k2">{</span>
<span class="number"> 36</span>    addToNextCharacter<span class="k2">(</span><span class="s">'\n'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 37</span>  <span class="k2">}</span>
<span class="number"> 38</span>  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>keyArgs.getUnichar<span class="k2">(</span><span class="k2">)</span> <span class="k3">&gt;</span><span class="k3">=</span> <span class="s">' '</span><span class="k2">)</span>
<span class="number"> 39</span>  <span class="k2">{</span>
<span class="number"> 40</span>    addToNextCharacter<span class="k2">(</span>keyArgs.getUnichar<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 41</span>  <span class="k2">}</span>
<span class="number"> 42</span>
<span class="number"> 43</span>
<span class="number"> 44</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Sat, 19 Feb 2011 18:03:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/606417/904182#target">Nazerith</a> said:</div><div class="quote"><p>
1) Every time you concatenate or lengthen a std:string, new memory is allocated. I&#39;m only reallocating at a minimum of every ten concatenations.<br />2) Allocating new memory and using char * copy functions is faster than doing the same with std:string.
</p></div></div><p>
Those are assumptions you&#39;re making, and they&#39;re both wrong.<br />1) A string is backed by a std::vector internally, which means that it only resizes when its capacity would otherwise be exceeded, and when it does, it grows exponentially (e.g., double its capacity on every overflow). You are growing every ten concatenations, which is O(n); std::string grows at O(log n).<br />2) Although std::string looks horribly complicated when you look at the source code, most of that complexity is executed at compile time, not at run time. The result is pretty efficient. Using things like strcat(), however, is horribly inefficient due to an inherent problem with null-terminated strings. Here&#39;s a bit of reading for you: <a href="http://en.wikipedia.org/wiki/Schlemiel_the_Painter%27s_algorithm">http://en.wikipedia.org/wiki/Schlemiel_the_Painter%27s_algorithm</a> (or might as well read the original article: <a href="http://www.joelonsoftware.com/articles/fog0000000319.html">http://www.joelonsoftware.com/articles/fog0000000319.html</a>). In other words, a naive C-string implementation is almost certainly less efficient than a naive std::string implementation (std::string maintains a string length counter internally, so getting the length or finding the &#39;past-the-end&#39; position is O(1)).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tobias Dammers)</author>
		<pubDate>Sun, 20 Feb 2011 01:13:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Since it uses a std::vector you should also be able to reserve x, that way if you know about how much you will need you can preallocate it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Sun, 20 Feb 2011 04:02:16 +0000</pubDate>
	</item>
</rss>
