David Smart / Keypad

Dependents:   RA8875_KeyPadDemo PUB_RA8875_Keypad IAC_Final_Monil_copy

Committer:
WiredHome
Date:
Sat Nov 12 20:09:21 2016 +0000
Revision:
5:7ccb8f7386fa
Parent:
4:edb5155f1b6f
Child:
6:4da6fa0fe51b
Remove debug msgs.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WiredHome 0:9b0b4ae5b47a 1 #include "Keypad.h"
WiredHome 0:9b0b4ae5b47a 2
WiredHome 1:7feeebbd8367 3 // byte pairs: size, symbol [,size, symbol [, size, symbol [...]]]
WiredHome 1:7feeebbd8367 4 // size is a scale factor where 10 = "normal calculated size" based on the keyboard width and the # of keys, 5 is 1/2 width, etc.
WiredHome 1:7feeebbd8367 5 // symbol is either the ASCII character to show, when leveraging the RA8875 internal fonts, or it is a special
WiredHome 1:7feeebbd8367 6 // character [normally non-printable] that is intercepted to perform an operation (e.g. <bs>, <shift>, etc.)
WiredHome 1:7feeebbd8367 7 // \x01: special no-key value, to leave whitespace before the next key.
WiredHome 2:6d05764dfde7 8 const char kpd_shiftkeys[] = {
WiredHome 0:9b0b4ae5b47a 9 5,'\x01', 8,'\x15',10,'~',10,'!',10,'@',10,'#',10,'$',10,'%',10,'^',10,'&',10,'*',10,'(',10,')',10,'_', 10,'+',10,'\x1B',0,0,
WiredHome 0:9b0b4ae5b47a 10 5,'\x01',12,'\x1A',10,'Q',10,'W',10,'E',10,'R',10,'T',10,'Y',10,'U',10,'I',10,'O',10,'P',10,'{', 10,'}',10,'|',0,0,
WiredHome 0:9b0b4ae5b47a 11 5,'\x01',15,' ',10,'A',10,'S',10,'D',10,'F',10,'G',10,'H',10,'J',10,'K',10,'L',10,':',10,'"', 17,'\x1C',0,0,
WiredHome 0:9b0b4ae5b47a 12 5,'\x01',21,'\x18',10,'Z',10,'X',10,'C',10,'V',10,'B',10,'N',10,'M',10,'<',10,'>',10,'?',21,'\x18',0,0,
WiredHome 0:9b0b4ae5b47a 13 5,'\x01',40,'\x01',55,' ',0,0,
WiredHome 0:9b0b4ae5b47a 14 0,0
WiredHome 0:9b0b4ae5b47a 15 };
WiredHome 2:6d05764dfde7 16 const char kpd_unshiftkeys[] = {
WiredHome 0:9b0b4ae5b47a 17 5,'\x01', 8,'\x15',10,'`',10,'1',10,'2',10,'3',10,'4',10,'5',10,'6',10,'7',10,'8',10,'9',10,'0',10,'-', 10,'=',10,'\x1B',0,0,
WiredHome 0:9b0b4ae5b47a 18 5,'\x01',12,'\x1A',10,'q',10,'w',10,'e',10,'r',10,'t',10,'y',10,'u',10,'i',10,'o',10,'p',10,'[', 10,']',10,'\\',0,0,
WiredHome 0:9b0b4ae5b47a 19 5,'\x01',15,' ',10,'a',10,'s',10,'d',10,'f',10,'g',10,'h',10,'j',10,'k',10,'l',10,';',10,'\'', 17,'\x1C',0,0,
WiredHome 0:9b0b4ae5b47a 20 5,'\x01',21,'\x18',10,'z',10,'x',10,'c',10,'v',10,'b',10,'n',10,'m',10,',',10,'.',10,'/',21,'\x18',0,0,
WiredHome 0:9b0b4ae5b47a 21 5,'\x01',40,'\x01',55,' ',0,0,
WiredHome 0:9b0b4ae5b47a 22 0,0
WiredHome 0:9b0b4ae5b47a 23 };
WiredHome 0:9b0b4ae5b47a 24
WiredHome 1:7feeebbd8367 25 const Keypad::keyboard_t internalkbd = {
WiredHome 1:7feeebbd8367 26 0,-1, // x,y: 0; start at left edge, -1; top is calculated from # rows
WiredHome 1:7feeebbd8367 27 // -1 is size calculated
WiredHome 1:7feeebbd8367 28 0, // wi,h: width is calculated
WiredHome 1:7feeebbd8367 29 0, // bottom of screen justified
WiredHome 1:7feeebbd8367 30 5, // 5 rows
WiredHome 1:7feeebbd8367 31 15, // columns in the <esc>`1234...-=<bs> row
WiredHome 2:6d05764dfde7 32 kpd_unshiftkeys,
WiredHome 2:6d05764dfde7 33 kpd_shiftkeys
WiredHome 1:7feeebbd8367 34 };
WiredHome 1:7feeebbd8367 35
WiredHome 1:7feeebbd8367 36
WiredHome 0:9b0b4ae5b47a 37
WiredHome 0:9b0b4ae5b47a 38 Keypad::Keypad(RA8875 & _ra, color_t _fore, color_t _back) : ra(_ra), fore(_fore), back(_back) {
WiredHome 0:9b0b4ae5b47a 39 shift = false;
WiredHome 1:7feeebbd8367 40 enter_key = KYBD_SYM_ENTER;
WiredHome 1:7feeebbd8367 41 esc_key = KYBD_SYM_ESCAPE;
WiredHome 4:edb5155f1b6f 42 user_font = NULL;
WiredHome 4:edb5155f1b6f 43 user_font_scale = 0;
WiredHome 0:9b0b4ae5b47a 44 }
WiredHome 0:9b0b4ae5b47a 45
WiredHome 0:9b0b4ae5b47a 46 Keypad::~Keypad() {
WiredHome 0:9b0b4ae5b47a 47 }
WiredHome 0:9b0b4ae5b47a 48
WiredHome 1:7feeebbd8367 49 bool Keypad::SetKeyboard(const keyboard_t * _kbd, char _enter_key, char _esc_key) {
WiredHome 1:7feeebbd8367 50 if (_kbd)
WiredHome 1:7feeebbd8367 51 kbd = _kbd;
WiredHome 1:7feeebbd8367 52 else
WiredHome 1:7feeebbd8367 53 kbd = &internalkbd;
WiredHome 1:7feeebbd8367 54 enter_key = _enter_key;
WiredHome 1:7feeebbd8367 55 esc_key = _esc_key;
WiredHome 1:7feeebbd8367 56 return true;
WiredHome 1:7feeebbd8367 57 }
WiredHome 1:7feeebbd8367 58
WiredHome 4:edb5155f1b6f 59 bool Keypad::SetKeyboardFont(const uint8_t * _font, int _fontscale) {
WiredHome 4:edb5155f1b6f 60 if (_font)
WiredHome 4:edb5155f1b6f 61 user_font = _font;
WiredHome 4:edb5155f1b6f 62 else
WiredHome 4:edb5155f1b6f 63 user_font_scale = _fontscale;
WiredHome 4:edb5155f1b6f 64 return true;
WiredHome 4:edb5155f1b6f 65 }
WiredHome 4:edb5155f1b6f 66
WiredHome 0:9b0b4ae5b47a 67 void Keypad::DrawKey(rect_t r, char c, bool invert) {
WiredHome 2:6d05764dfde7 68 ra.fillroundrect(r, 2, 2, invert ? fore : back);
WiredHome 2:6d05764dfde7 69 ra.roundrect(r, 2, 2, invert ? back : fore);
WiredHome 0:9b0b4ae5b47a 70 ra.SetTextCursor(r.p1.x+(r.p2.x-r.p1.x)/2-ra.fontwidth()/2, r.p1.y+2);
WiredHome 1:7feeebbd8367 71 if (invert) {
WiredHome 1:7feeebbd8367 72 ra.foreground(back);
WiredHome 1:7feeebbd8367 73 ra.background(fore);
WiredHome 3:402f1126a3ec 74 ra.SetTextCursorControl(RA8875::NOCURSOR);
WiredHome 1:7feeebbd8367 75 }
WiredHome 0:9b0b4ae5b47a 76 ra.putc(c);
WiredHome 1:7feeebbd8367 77 if (invert) {
WiredHome 1:7feeebbd8367 78 ra.foreground(fore);
WiredHome 1:7feeebbd8367 79 ra.background(back);
WiredHome 1:7feeebbd8367 80 }
WiredHome 0:9b0b4ae5b47a 81 }
WiredHome 0:9b0b4ae5b47a 82
WiredHome 0:9b0b4ae5b47a 83 void Keypad::Erase(color_t c) {
WiredHome 0:9b0b4ae5b47a 84 dim_t kH = ra.fontheight() + 4;
WiredHome 1:7feeebbd8367 85 rect_t r = ComputeKeypadRect();
WiredHome 1:7feeebbd8367 86
WiredHome 4:edb5155f1b6f 87 ra.fillrect(r, c);
WiredHome 4:edb5155f1b6f 88 if (user_font)
WiredHome 4:edb5155f1b6f 89 ra.SelectUserFont(restore_font); // restore
WiredHome 4:edb5155f1b6f 90 else if (restore_hScale | restore_vScale)
WiredHome 4:edb5155f1b6f 91 ra.SetTextFontSize(restore_hScale, restore_vScale);
WiredHome 5:7ccb8f7386fa 92 //printf("Restore: font: %p, scale: %d,%d\r\n", user_font, restore_hScale, restore_vScale);
WiredHome 0:9b0b4ae5b47a 93 }
WiredHome 0:9b0b4ae5b47a 94
WiredHome 0:9b0b4ae5b47a 95 void Keypad::DrawInputPanel(const char * prompt) {
WiredHome 4:edb5155f1b6f 96 rect_t r;
WiredHome 4:edb5155f1b6f 97
WiredHome 4:edb5155f1b6f 98 if (user_font || user_font_scale) {
WiredHome 4:edb5155f1b6f 99 restore_font = ra.GetUserFont(); // save to later restore
WiredHome 4:edb5155f1b6f 100 ra.GetTextFontSize(&restore_hScale, &restore_vScale);
WiredHome 5:7ccb8f7386fa 101 //printf("Save : font: %p, scale: %d,%d\r\n", user_font, restore_hScale, restore_vScale);
WiredHome 4:edb5155f1b6f 102 }
WiredHome 4:edb5155f1b6f 103 if (!user_font && user_font_scale) {
WiredHome 4:edb5155f1b6f 104 ra.SetTextFontSize(user_font_scale);
WiredHome 4:edb5155f1b6f 105 }
WiredHome 4:edb5155f1b6f 106 r = ComputeKeypadRect();
WiredHome 0:9b0b4ae5b47a 107 ra.fillrect(r, back);
WiredHome 0:9b0b4ae5b47a 108 ra.foreground(fore);
WiredHome 0:9b0b4ae5b47a 109 ra.background(back);
WiredHome 0:9b0b4ae5b47a 110 ra.SetTextCursor(r.p1.x,r.p1.y+2);
WiredHome 5:7ccb8f7386fa 111 ra.puts(prompt); ra.puts(":");
WiredHome 0:9b0b4ae5b47a 112 userText = ra.GetTextCursor();
WiredHome 0:9b0b4ae5b47a 113 DrawKeypad();
WiredHome 0:9b0b4ae5b47a 114 }
WiredHome 0:9b0b4ae5b47a 115
WiredHome 1:7feeebbd8367 116 rect_t Keypad::ComputeKeypadRect(void) {
WiredHome 1:7feeebbd8367 117 dim_t kH = ra.fontheight() + 4;
WiredHome 1:7feeebbd8367 118 rect_t r;
WiredHome 1:7feeebbd8367 119
WiredHome 1:7feeebbd8367 120 if (kbd->x <= 0)
WiredHome 1:7feeebbd8367 121 r.p1.x = 0;
WiredHome 1:7feeebbd8367 122 else
WiredHome 1:7feeebbd8367 123 r.p1.x = kbd->x;
WiredHome 1:7feeebbd8367 124 if (kbd->y <= 0)
WiredHome 1:7feeebbd8367 125 r.p1.y = ra.height() - (kH * (kbd->rows+1)) - 1;
WiredHome 1:7feeebbd8367 126 else
WiredHome 1:7feeebbd8367 127 r.p1.y = kbd->y;
WiredHome 1:7feeebbd8367 128 if (kbd->width == 0)
WiredHome 1:7feeebbd8367 129 r.p2.x = ra.width() - 1;
WiredHome 1:7feeebbd8367 130 else
WiredHome 1:7feeebbd8367 131 r.p2.x = r.p1.x + kbd->width - 1;
WiredHome 1:7feeebbd8367 132 if (kbd->height == 0)
WiredHome 1:7feeebbd8367 133 r.p2.y = ra.height() - 1;
WiredHome 1:7feeebbd8367 134 else
WiredHome 1:7feeebbd8367 135 r.p2.y = r.p1.y + kbd->height - 1;
WiredHome 3:402f1126a3ec 136 //printf("KeypadRect (%d,%d) - (%d,%d)\r\n", r.p1.x, r.p1.y, r.p2.x, r.p2.y);
WiredHome 1:7feeebbd8367 137 return r;
WiredHome 1:7feeebbd8367 138 }
WiredHome 1:7feeebbd8367 139
WiredHome 0:9b0b4ae5b47a 140 void Keypad::DrawKeypad(void) {
WiredHome 4:edb5155f1b6f 141 dim_t fW;
WiredHome 4:edb5155f1b6f 142 dim_t fH;
WiredHome 4:edb5155f1b6f 143 dim_t kW; // key width
WiredHome 4:edb5155f1b6f 144 dim_t kH; // key Height
WiredHome 4:edb5155f1b6f 145
WiredHome 4:edb5155f1b6f 146 fW = ra.fontwidth();
WiredHome 4:edb5155f1b6f 147 fH = ra.fontheight();
WiredHome 4:edb5155f1b6f 148 kH = fH + 4;
WiredHome 1:7feeebbd8367 149
WiredHome 1:7feeebbd8367 150 const char * p = kbd->keydef1;
WiredHome 1:7feeebbd8367 151 rect_t r = ComputeKeypadRect();
WiredHome 1:7feeebbd8367 152 rect_t ref = r;
WiredHome 1:7feeebbd8367 153 kW = (ref.p2.x - ref.p1.x) / (kbd->cols+1);
WiredHome 3:402f1126a3ec 154 //printf("DrawKeypad kW=%d from (%d,%d) %d\r\n", kW, ref.p2.x, ref.p1.x, kbd->cols+1);
WiredHome 1:7feeebbd8367 155 r.p1.y += kH;
WiredHome 0:9b0b4ae5b47a 156 if (shift)
WiredHome 1:7feeebbd8367 157 p = kbd->keydef2;
WiredHome 0:9b0b4ae5b47a 158 while (*p || *(p+2)) {
WiredHome 0:9b0b4ae5b47a 159 if (*p == 0) {
WiredHome 1:7feeebbd8367 160 r.p1.x = ref.p1.x;
WiredHome 0:9b0b4ae5b47a 161 r.p1.y += kH;
WiredHome 0:9b0b4ae5b47a 162 } else {
WiredHome 0:9b0b4ae5b47a 163 const char * symbol = p + 1;
WiredHome 0:9b0b4ae5b47a 164 if (*symbol >= 0x10) {
WiredHome 0:9b0b4ae5b47a 165 r.p2.x = r.p1.x + (kW * *p)/10;
WiredHome 0:9b0b4ae5b47a 166 r.p2.y = r.p1.y + kH;
WiredHome 0:9b0b4ae5b47a 167 DrawKey(r,*symbol);
WiredHome 0:9b0b4ae5b47a 168 }
WiredHome 0:9b0b4ae5b47a 169 r.p1.x += (kW * *p)/10;
WiredHome 0:9b0b4ae5b47a 170 }
WiredHome 0:9b0b4ae5b47a 171 p+=2;
WiredHome 0:9b0b4ae5b47a 172 }
WiredHome 0:9b0b4ae5b47a 173 }
WiredHome 0:9b0b4ae5b47a 174
WiredHome 0:9b0b4ae5b47a 175 char Keypad::isKeyTouched(point_t * point, rect_t * rectTouched) {
WiredHome 1:7feeebbd8367 176 dim_t kW;
WiredHome 0:9b0b4ae5b47a 177 dim_t kH = ra.fontheight() + 4;
WiredHome 0:9b0b4ae5b47a 178
WiredHome 1:7feeebbd8367 179 const char * p = kbd->keydef1;
WiredHome 1:7feeebbd8367 180 rect_t r = ComputeKeypadRect();
WiredHome 1:7feeebbd8367 181 rect_t ref = r;
WiredHome 1:7feeebbd8367 182 kW = (ref.p2.x - ref.p1.x) / (kbd->cols+1);
WiredHome 1:7feeebbd8367 183 r.p1.y = r.p1.y + kH;
WiredHome 0:9b0b4ae5b47a 184 if (shift)
WiredHome 1:7feeebbd8367 185 p = kbd->keydef2;
WiredHome 0:9b0b4ae5b47a 186 while (*p || *(p+2)) {
WiredHome 0:9b0b4ae5b47a 187 if (*p == 0) {
WiredHome 1:7feeebbd8367 188 r.p1.x = ref.p1.x;
WiredHome 0:9b0b4ae5b47a 189 r.p1.y += kH;
WiredHome 0:9b0b4ae5b47a 190 } else {
WiredHome 0:9b0b4ae5b47a 191 const char * symbol = p + 1;
WiredHome 0:9b0b4ae5b47a 192 if (*symbol >= 0x10) {
WiredHome 0:9b0b4ae5b47a 193 r.p2.x = r.p1.x + (kW * *p)/10;
WiredHome 0:9b0b4ae5b47a 194 r.p2.y = r.p1.y + kH;
WiredHome 0:9b0b4ae5b47a 195 if (ra.Intersect(r, *point)) {
WiredHome 0:9b0b4ae5b47a 196 if (rectTouched)
WiredHome 0:9b0b4ae5b47a 197 *rectTouched = r;
WiredHome 0:9b0b4ae5b47a 198 return (*symbol);
WiredHome 0:9b0b4ae5b47a 199 }
WiredHome 0:9b0b4ae5b47a 200 }
WiredHome 0:9b0b4ae5b47a 201 r.p1.x += (kW * *p)/10;
WiredHome 0:9b0b4ae5b47a 202 }
WiredHome 0:9b0b4ae5b47a 203 p+=2;
WiredHome 0:9b0b4ae5b47a 204 }
WiredHome 0:9b0b4ae5b47a 205 return 0;
WiredHome 0:9b0b4ae5b47a 206 }
WiredHome 0:9b0b4ae5b47a 207
WiredHome 0:9b0b4ae5b47a 208 void Keypad::ShowBufferMetrics(void) {
WiredHome 1:7feeebbd8367 209 rect_t r = ComputeKeypadRect();
WiredHome 3:402f1126a3ec 210 ra.SetTextCursor(r.p2.x-1-ra.fontwidth()*5, r.p1.y+2);
WiredHome 3:402f1126a3ec 211 ra.printf("%02d/%02d", pNext - pStart, bufSize); // "001/100"
WiredHome 1:7feeebbd8367 212 //ra.SetTextCursor(ra.width()-1-ra.fontwidth()*7, ra.height()-1-ra.fontheight());
WiredHome 0:9b0b4ae5b47a 213 ra.SetTextCursor(userText.x, userText.y);
WiredHome 0:9b0b4ae5b47a 214 ra.SetTextCursorControl(RA8875::UNDER);
WiredHome 0:9b0b4ae5b47a 215 }
WiredHome 0:9b0b4ae5b47a 216
WiredHome 4:edb5155f1b6f 217 bool Keypad::GetString(char * buffer, size_t size, const char * prompt, char mask, bool auto_close) {
WiredHome 0:9b0b4ae5b47a 218 point_t point = {0, 0};
WiredHome 4:edb5155f1b6f 219 bool success = false;
WiredHome 4:edb5155f1b6f 220
WiredHome 0:9b0b4ae5b47a 221 pStart = pNext = buffer;
WiredHome 0:9b0b4ae5b47a 222 bufSize = size;
WiredHome 0:9b0b4ae5b47a 223 DrawInputPanel(prompt);
WiredHome 0:9b0b4ae5b47a 224 ShowBufferMetrics();
WiredHome 0:9b0b4ae5b47a 225 while (1) {
WiredHome 0:9b0b4ae5b47a 226 if (touch == ra.TouchPanelReadable(&point)) {
WiredHome 0:9b0b4ae5b47a 227 rect_t touchRect;
WiredHome 1:7feeebbd8367 228 // find out if they touched a key;
WiredHome 0:9b0b4ae5b47a 229 char key = isKeyTouched(&point, &touchRect);
WiredHome 0:9b0b4ae5b47a 230 if (key) {
WiredHome 0:9b0b4ae5b47a 231 DrawKey(touchRect, key, true);
WiredHome 0:9b0b4ae5b47a 232 wait_ms(50);
WiredHome 0:9b0b4ae5b47a 233 TouchCode_t is;
WiredHome 0:9b0b4ae5b47a 234 do {
WiredHome 0:9b0b4ae5b47a 235 is = ra.TouchPanelReadable(NULL);
WiredHome 5:7ccb8f7386fa 236 //printf("is: %d\r\n", is);
WiredHome 4:edb5155f1b6f 237
WiredHome 0:9b0b4ae5b47a 238 } while (is != no_touch);
WiredHome 0:9b0b4ae5b47a 239 DrawKey(touchRect, key);
WiredHome 0:9b0b4ae5b47a 240 }
WiredHome 5:7ccb8f7386fa 241 //printf("Touch %02X at (%d,%d)\r\n", key, point.x, point.y);
WiredHome 5:7ccb8f7386fa 242 //printf("Touch %02X at (%d,%d)\r\n", key, point.x, point.y);
WiredHome 1:7feeebbd8367 243 if (key == enter_key) {
WiredHome 0:9b0b4ae5b47a 244 *pNext = '\0';
WiredHome 0:9b0b4ae5b47a 245 ra.SetTextCursorControl();
WiredHome 4:edb5155f1b6f 246 success = true;
WiredHome 4:edb5155f1b6f 247 break;
WiredHome 1:7feeebbd8367 248 } else if (key == esc_key) {
WiredHome 0:9b0b4ae5b47a 249 *buffer = '\0';
WiredHome 0:9b0b4ae5b47a 250 ra.SetTextCursorControl();
WiredHome 4:edb5155f1b6f 251 success = false;
WiredHome 4:edb5155f1b6f 252 break;
WiredHome 1:7feeebbd8367 253 } else if (key == KYBD_SYM_BS) {
WiredHome 0:9b0b4ae5b47a 254 if (pNext > buffer) {
WiredHome 0:9b0b4ae5b47a 255 pNext--;
WiredHome 0:9b0b4ae5b47a 256 // blank the last char
WiredHome 0:9b0b4ae5b47a 257 userText.x -= ra.fontwidth();
WiredHome 0:9b0b4ae5b47a 258 ra.SetTextCursor(userText.x, userText.y);
WiredHome 0:9b0b4ae5b47a 259 ra.putc(' ');
WiredHome 0:9b0b4ae5b47a 260 }
WiredHome 1:7feeebbd8367 261 } else if (key == KYBD_SYM_TAB) {
WiredHome 0:9b0b4ae5b47a 262 *pNext++ = ' ';
WiredHome 0:9b0b4ae5b47a 263 ra.SetTextCursor(userText.x, userText.y);
WiredHome 0:9b0b4ae5b47a 264 ra.putc(' ');
WiredHome 0:9b0b4ae5b47a 265 userText.x += ra.fontwidth();
WiredHome 1:7feeebbd8367 266 } else if (key == KYBD_SYM_SHIFT) {
WiredHome 0:9b0b4ae5b47a 267 shift = !shift;
WiredHome 0:9b0b4ae5b47a 268 DrawKeypad();
WiredHome 0:9b0b4ae5b47a 269 } else if (key) {
WiredHome 0:9b0b4ae5b47a 270 *pNext++ = key;
WiredHome 0:9b0b4ae5b47a 271 ra.SetTextCursor(userText.x, userText.y);
WiredHome 0:9b0b4ae5b47a 272 if (mask)
WiredHome 0:9b0b4ae5b47a 273 ra.putc(mask);
WiredHome 0:9b0b4ae5b47a 274 else
WiredHome 0:9b0b4ae5b47a 275 ra.putc(key);
WiredHome 0:9b0b4ae5b47a 276 userText.x += ra.fontwidth();
WiredHome 0:9b0b4ae5b47a 277 }
WiredHome 0:9b0b4ae5b47a 278 if ((pNext - buffer) >= (size - 1)) {
WiredHome 0:9b0b4ae5b47a 279 *pNext = '\0';
WiredHome 0:9b0b4ae5b47a 280 ra.SetTextCursorControl();
WiredHome 4:edb5155f1b6f 281 success = true;
WiredHome 4:edb5155f1b6f 282 break;
WiredHome 0:9b0b4ae5b47a 283 }
WiredHome 0:9b0b4ae5b47a 284 ShowBufferMetrics();
WiredHome 0:9b0b4ae5b47a 285 }
WiredHome 0:9b0b4ae5b47a 286 }
WiredHome 4:edb5155f1b6f 287 if (auto_close)
WiredHome 4:edb5155f1b6f 288 Erase(back);
WiredHome 4:edb5155f1b6f 289 return success;
WiredHome 0:9b0b4ae5b47a 290 }