diff options
-rw-r--r-- | gui/devices/1920x1200/res/ui.xml | 6 | ||||
-rw-r--r-- | gui/keyboard.cpp | 334 | ||||
-rw-r--r-- | gui/objects.hpp | 36 |
3 files changed, 164 insertions, 212 deletions
diff --git a/gui/devices/1920x1200/res/ui.xml b/gui/devices/1920x1200/res/ui.xml index 986c02657..cac02796e 100644 --- a/gui/devices/1920x1200/res/ui.xml +++ b/gui/devices/1920x1200/res/ui.xml @@ -427,14 +427,14 @@ <row1 key01="153:" key02="q" long02="1" key03="w" long03="2" key04="e" long04="3" key05="r" long05="4" key06="t" long06="5" key07="y" long07="6" key08="u" long08="7" key09="i" long09="8" key10="o" long10="9" key11="p" long11="0" key12="177:c:8" /> <row2 key01="213:layout3" key02="156:a" key03="156:s" key04="156:d" key05="156:f" key06="156:g" key07="156:h" key08="156:j" key09="k" key10="156:l" key11="303:action" /> <row3 key01="269:layout2" key02="154:z" key03="154:x" key04="154:c" key05="154:v" key06="154:b" key07="154:n" key08="154:m" key09="154:," long09="!" key10="154:." long10="?" key11="265:layout2" /> - <row4 key01="600:" key02="720: " key03="/" long03=":" key04="-" long0="_" /> + <row4 key01="600:" key02="720: " key03="/" long03=":" key04="-" long04="_" /> </layout1> <layout2> <keysize height="129" width="159" capslock="0" revert_layout="1" /> <row1 key01="153:" key02="Q" long02="1" key03="W" long03="2" key04="E" long04="3" key05="R" long05="4" key06="T" long06="5" key07="Y" long07="6" key08="U" long08="7" key09="I" long09="8" key10="O" long10="9" key11="P" long11="0" key12="177:c:8" /> <row2 key01="213:layout3" key02="156:A" key03="156:S" key04="156:D" key05="156:F" key06="156:G" key07="156:H" key08="156:J" key09="156:K" key10="156:L" key11="303:action" /> - <row3 key01="269:layout1" key02="154:Z" key03="154:X" key04="154:C" key05="154:V" key06="154:B" key07="154:N" key08="154:M" key09="154:," long09="!" key10="154:." long10="?" key11="265:layout1" /> - <row4 key01="600:" key02="720: " key03="/" long03=":" key04="-" long0="_" /> + <row3 key01="269:layout1" key02="154:Z" key03="154:X" key04="154:C" key05="154:V" key06="154:B" key07="154:N" key08="154:M" key09="154:!" key10="154:?" key11="265:layout1" /> + <row4 key01="600:" key02="720: " key03=":" key04="_" /> </layout2> <layout3> <keysize height="129" width="159" /> diff --git a/gui/keyboard.cpp b/gui/keyboard.cpp index d0262aac2..914c944f1 100644 --- a/gui/keyboard.cpp +++ b/gui/keyboard.cpp @@ -16,20 +16,8 @@ along with TWRP. If not, see <http://www.gnu.org/licenses/>. */ -#include <stdarg.h> -#include <stdio.h> #include <stdlib.h> #include <string.h> -#include <fcntl.h> -#include <sys/reboot.h> -#include <sys/stat.h> -#include <sys/time.h> -#include <sys/mman.h> -#include <sys/types.h> -#include <sys/ioctl.h> -#include <time.h> -#include <unistd.h> -#include <stdlib.h> #include "../data.hpp" #include <string> @@ -56,26 +44,23 @@ GUIKeyboard::GUIKeyboard(xml_node<>* node) xml_node<>* keylayout; xml_node<>* keyrow; - for (layoutindex=0; layoutindex<MAX_KEYBOARD_LAYOUTS; layoutindex++) - keyboardImg[layoutindex] = NULL; + for (layoutindex=0; layoutindex<MAX_KEYBOARD_LAYOUTS; layoutindex++) { + layouts[layoutindex].keyboardImg = NULL; + memset(layouts[layoutindex].keys, 0, sizeof(Layout::keys)); + memset(layouts[layoutindex].row_end_y, 0, sizeof(Layout::row_end_y)); + } mRendered = false; currentLayout = 1; - mAction = NULL; + CapsLockOn = false; KeyboardHeight = KeyboardWidth = 0; if (!node) return; - // Load the action - child = FindNode(node, "action"); - if (child) - { - mAction = new GUIAction(node); - } - mHighlightColor = LoadAttrColor(FindNode(node, "highlight"), "color", &hasHighlight); mCapsHighlightColor = LoadAttrColor(FindNode(node, "capshighlight"), "color", &hasCapsHighlight); + // compatibility ugliness: resources should be specified in the layouts themselves instead // Load the images for the different layouts child = FindNode(node, "layout"); if (child) @@ -84,7 +69,7 @@ GUIKeyboard::GUIKeyboard(xml_node<>* node) strcpy(resource, "resource1"); attr = child->first_attribute(resource); while (attr && layoutindex < (MAX_KEYBOARD_LAYOUTS + 1)) { - keyboardImg[layoutindex - 1] = LoadAttrImage(child, resource); + layouts[layoutindex - 1].keyboardImg = LoadAttrImage(child, resource); layoutindex++; resource[8] = (char)(layoutindex + 48); @@ -93,10 +78,10 @@ GUIKeyboard::GUIKeyboard(xml_node<>* node) } // Check the first image to get height and width - if (keyboardImg[0] && keyboardImg[0]->GetResource()) + if (layouts[0].keyboardImg && layouts[0].keyboardImg->GetResource()) { - KeyboardWidth = keyboardImg[0]->GetWidth(); - KeyboardHeight = keyboardImg[0]->GetHeight(); + KeyboardWidth = layouts[0].keyboardImg->GetWidth(); + KeyboardHeight = layouts[0].keyboardImg->GetHeight(); } // Load all of the layout maps @@ -110,29 +95,15 @@ GUIKeyboard::GUIKeyboard(xml_node<>* node) return; } + Layout& lay = layouts[layoutindex - 1]; + child = keylayout->first_node("keysize"); - if (child) { - attr = child->first_attribute("height"); - if (attr) - keyHeight = scale_theme_y(atoi(attr->value())); - else - keyHeight = 0; - attr = child->first_attribute("width"); - if (attr) - keyWidth = scale_theme_x(atoi(attr->value())); - else - keyWidth = 0; - attr = child->first_attribute("capslock"); - if (attr) - caps_tracking[layoutindex - 1].capslock = atoi(attr->value()); - else - caps_tracking[layoutindex - 1].capslock = 1; - attr = child->first_attribute("revert_layout"); - if (attr) - caps_tracking[layoutindex - 1].revert_layout = atoi(attr->value()); - else - caps_tracking[layoutindex - 1].revert_layout = -1; - } + keyHeight = LoadAttrIntScaleY(child, "height", 0); + keyWidth = LoadAttrIntScaleX(child, "width", 0); + // compatibility ugliness: capslock="0" means that this is the caps layout. Also it has nothing to do with keysize. + lay.is_caps = (LoadAttrInt(child, "capslock", 1) == 0); + // compatibility ugliness: revert_layout has nothing to do with keysize. + lay.revert_layout = LoadAttrInt(child, "revert_layout", -1); rowindex = 1; Yindex = 0; @@ -146,7 +117,7 @@ GUIKeyboard::GUIKeyboard(xml_node<>* node) } Yindex += keyHeight; - row_heights[layoutindex - 1][rowindex - 1] = Yindex; + lay.row_end_y[rowindex - 1] = Yindex; keyindex = 1; Xindex = 0; @@ -166,7 +137,7 @@ GUIKeyboard::GUIKeyboard(xml_node<>* node) return; } - if (ParseKey(keyinfo, keyboard_keys[layoutindex - 1][rowindex - 1][keyindex - 1], Xindex, keyWidth, false)) + if (ParseKey(keyinfo, lay.keys[rowindex - 1][keyindex - 1], Xindex, keyWidth, false)) LOGERR("Invalid key info on layout%i, row%i, key%02i.\n", layoutindex, rowindex, keyindex); @@ -181,7 +152,7 @@ GUIKeyboard::GUIKeyboard(xml_node<>* node) return; } - if (ParseKey(keyinfo, keyboard_keys[layoutindex - 1][rowindex - 1][keyindex - 1], Xindex, keyWidth, true)) + if (ParseKey(keyinfo, lay.keys[rowindex - 1][keyindex - 1], Xindex, keyWidth, true)) LOGERR("Invalid long press key info on layout%i, row%i, long%02i.\n", layoutindex, rowindex, keyindex); } keyindex++; @@ -197,11 +168,10 @@ GUIKeyboard::GUIKeyboard(xml_node<>* node) keylayout = FindNode(node, layout); } - int x, y, w, h; + int x, y; // Load the placement - LoadPlacement(FindNode(node, "placement"), &x, &y, &w, &h); - SetActionPos(x, y, KeyboardWidth, KeyboardHeight); - SetRenderPos(x, y, w, h); + LoadPlacement(FindNode(node, "placement"), &x, &y); + SetRenderPos(x, y, KeyboardWidth, KeyboardHeight); return; } @@ -209,7 +179,7 @@ GUIKeyboard::~GUIKeyboard() { } -int GUIKeyboard::ParseKey(const char* keyinfo, keyboard_key_class& key, int& Xindex, int keyWidth, bool longpress) +int GUIKeyboard::ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress) { int keychar = 0; if (strlen(keyinfo) == 1) { @@ -260,30 +230,30 @@ int GUIKeyboard::Render(void) return 0; } - int ret = 0; + Layout& lay = layouts[currentLayout - 1]; - if (keyboardImg[currentLayout - 1] && keyboardImg[currentLayout - 1]->GetResource()) - gr_blit(keyboardImg[currentLayout - 1]->GetResource(), 0, 0, KeyboardWidth, KeyboardHeight, mRenderX, mRenderY); + if (lay.keyboardImg && lay.keyboardImg->GetResource()) + gr_blit(lay.keyboardImg->GetResource(), 0, 0, KeyboardWidth, KeyboardHeight, mRenderX, mRenderY); // Draw highlight for capslock - if (hasCapsHighlight && caps_tracking[currentLayout - 1].capslock == 0 && caps_tracking[currentLayout - 1].set_capslock) { - int boxheight, boxwidth, x; + if (hasCapsHighlight && lay.is_caps && CapsLockOn) { gr_color(mCapsHighlightColor.red, mCapsHighlightColor.green, mCapsHighlightColor.blue, mCapsHighlightColor.alpha); for (int indexy=0; indexy<MAX_KEYBOARD_ROWS; indexy++) { for (int indexx=0; indexx<MAX_KEYBOARD_KEYS; indexx++) { - if ((int)keyboard_keys[currentLayout - 1][indexy][indexx].key == KEYBOARD_LAYOUT && (int)keyboard_keys[currentLayout - 1][indexy][indexx].layout == caps_tracking[currentLayout - 1].revert_layout) { + if ((int)lay.keys[indexy][indexx].key == KEYBOARD_LAYOUT && (int)lay.keys[indexy][indexx].layout == lay.revert_layout) { + int boxheight, boxwidth, x; if (indexy == 0) - boxheight = row_heights[currentLayout - 1][indexy]; + boxheight = lay.row_end_y[indexy]; else - boxheight = row_heights[currentLayout - 1][indexy] - row_heights[currentLayout - 1][indexy - 1]; + boxheight = lay.row_end_y[indexy] - lay.row_end_y[indexy - 1]; if (indexx == 0) { x = mRenderX; - boxwidth = keyboard_keys[currentLayout - 1][indexy][indexx].end_x; + boxwidth = lay.keys[indexy][indexx].end_x; } else { - x = mRenderX + keyboard_keys[currentLayout - 1][indexy][indexx - 1].end_x; - boxwidth = keyboard_keys[currentLayout - 1][indexy][indexx].end_x - keyboard_keys[currentLayout - 1][indexy][indexx - 1].end_x; + x = mRenderX + lay.keys[indexy][indexx - 1].end_x; + boxwidth = lay.keys[indexy][indexx].end_x - lay.keys[indexy][indexx - 1].end_x; } - gr_fill(x, mRenderY + row_heights[currentLayout - 1][indexy - 1], boxwidth, boxheight); + gr_fill(x, mRenderY + lay.row_end_y[indexy - 1], boxwidth, boxheight); } } } @@ -292,24 +262,24 @@ int GUIKeyboard::Render(void) if (hasHighlight && highlightRenderCount != 0) { int boxheight, boxwidth, x; if (rowY == 0) - boxheight = row_heights[currentLayout - 1][rowY]; + boxheight = lay.row_end_y[rowY]; else - boxheight = row_heights[currentLayout - 1][rowY] - row_heights[currentLayout - 1][rowY - 1]; + boxheight = lay.row_end_y[rowY] - lay.row_end_y[rowY - 1]; if (colX == 0) { x = mRenderX; - boxwidth = keyboard_keys[currentLayout - 1][rowY][colX].end_x; + boxwidth = lay.keys[rowY][colX].end_x; } else { - x = mRenderX + keyboard_keys[currentLayout - 1][rowY][colX - 1].end_x; - boxwidth = keyboard_keys[currentLayout - 1][rowY][colX].end_x - keyboard_keys[currentLayout - 1][rowY][colX - 1].end_x; + x = mRenderX + lay.keys[rowY][colX - 1].end_x; + boxwidth = lay.keys[rowY][colX].end_x - lay.keys[rowY][colX - 1].end_x; } gr_color(mHighlightColor.red, mHighlightColor.green, mHighlightColor.blue, mHighlightColor.alpha); - gr_fill(x, mRenderY + row_heights[currentLayout - 1][rowY - 1], boxwidth, boxheight); + gr_fill(x, mRenderY + lay.row_end_y[rowY - 1], boxwidth, boxheight); if (highlightRenderCount > 0) highlightRenderCount--; } else mRendered = true; - return ret; + return 0; } int GUIKeyboard::Update(void) @@ -324,73 +294,70 @@ int GUIKeyboard::SetRenderPos(int x, int y, int w, int h) { mRenderX = x; mRenderY = y; - if (w || h) - { - mRenderW = KeyboardWidth; - mRenderH = KeyboardHeight; - } - - if (mAction) mAction->SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH); + mRenderW = KeyboardWidth; + mRenderH = KeyboardHeight; SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH); return 0; } -int GUIKeyboard::GetSelection(int x, int y) +GUIKeyboard::Key* GUIKeyboard::HitTestKey(int x, int y) { - if (x < mRenderX || x - mRenderX > (int)KeyboardWidth || y < mRenderY || y - mRenderY > (int)KeyboardHeight) return -1; - return 0; + if (!IsInRegion(x, y)) + return NULL; + + int rely = y - mRenderY; + int relx = x - mRenderX; + + Layout& lay = layouts[currentLayout - 1]; + + // Find the correct row + int row; + for (row = 0; row < MAX_KEYBOARD_ROWS; ++row) { + if (lay.row_end_y[row] > rely) + break; + } + if (row == MAX_KEYBOARD_ROWS) + return NULL; + + // Find the correct key (column) + int col; + int x1 = 0; + for (col = 0; col < MAX_KEYBOARD_KEYS; ++col) { + Key& key = lay.keys[row][col]; + if (x1 <= relx && relx < key.end_x && key.key != 0) { + // This is the key that was pressed! + rowY = row; + colX = col; + return &key; + } + x1 = key.end_x; + } + return NULL; } int GUIKeyboard::NotifyTouch(TOUCH_STATE state, int x, int y) { - static int startSelection = -1, was_held = 0, startX = 0; - static unsigned char initial_key = 0; - int indexy, indexx, rely, relx, rowIndex = 0; - - rely = y - mRenderY; - relx = x - mRenderX; + static int was_held = 0, startX = 0; + static Key* initial_key = 0; if (!isConditionTrue()) return -1; switch (state) { case TOUCH_START: - if (GetSelection(x, y) == 0) { - startSelection = -1; - was_held = 0; - startX = x; - // Find the correct row - for (indexy=0; indexy<MAX_KEYBOARD_ROWS; indexy++) { - if (row_heights[currentLayout - 1][indexy] > rely) { - rowIndex = indexy; - rowY = indexy; - indexy = MAX_KEYBOARD_ROWS; - } - } - - // Find the correct key (column) - for (indexx=0; indexx<MAX_KEYBOARD_KEYS; indexx++) { - if (keyboard_keys[currentLayout - 1][rowIndex][indexx].end_x > relx) { - // This is the key that was pressed! - initial_key = keyboard_keys[currentLayout - 1][rowIndex][indexx].key; - colX = indexx; - indexx = MAX_KEYBOARD_KEYS; - } - } - if (initial_key != 0) - highlightRenderCount = -1; - else - highlightRenderCount = 0; - mRendered = false; - } else { - if (highlightRenderCount != 0) - mRendered = false; + was_held = 0; + startX = x; + initial_key = HitTestKey(x, y); + if (initial_key) + highlightRenderCount = -1; + else highlightRenderCount = 0; - startSelection = 0; - } + mRendered = false; break; + case TOUCH_DRAG: break; + case TOUCH_RELEASE: if (x < startX - (KeyboardWidth * 0.5)) { if (highlightRenderCount != 0) { @@ -407,17 +374,18 @@ int GUIKeyboard::NotifyTouch(TOUCH_STATE state, int x, int y) PageManager::NotifyKeyboard(KEYBOARD_SWIPE_RIGHT); return 0; } - + // fall through case TOUCH_HOLD: case TOUCH_REPEAT: - - if (startSelection == 0 || GetSelection(x, y) == -1) { + if (!initial_key) { if (highlightRenderCount != 0) { highlightRenderCount = 0; mRendered = false; } return 0; - } else if (highlightRenderCount != 0) { + } + + if (highlightRenderCount != 0) { if (state == TOUCH_RELEASE) highlightRenderCount = 2; else @@ -425,75 +393,57 @@ int GUIKeyboard::NotifyTouch(TOUCH_STATE state, int x, int y) mRendered = false; } - // Find the correct row - for (indexy=0; indexy<MAX_KEYBOARD_ROWS; indexy++) { - if (row_heights[currentLayout - 1][indexy] > rely) { - rowIndex = indexy; - indexy = MAX_KEYBOARD_ROWS; + if (HitTestKey(x, y) != initial_key) { + // We dragged off of the starting key + if (highlightRenderCount != 0) { + highlightRenderCount = 0; + mRendered = false; } - } - - // Find the correct key (column) - for (indexx=0; indexx<MAX_KEYBOARD_KEYS; indexx++) { - keyboard_key_class& key = keyboard_keys[currentLayout - 1][rowIndex][indexx]; - if (key.end_x > relx) { - // This is the key that was pressed! - if (key.key != initial_key) { - // We dragged off of the starting key - startSelection = 0; - break; - } else if (state == TOUCH_RELEASE && was_held == 0) { - DataManager::Vibrate("tw_keyboard_vibrate"); - if ((int)key.key < KEYBOARD_SPECIAL_KEYS && (int)key.key > 0) { - // Regular key - PageManager::NotifyKeyboard(key.key); - if (caps_tracking[currentLayout - 1].capslock == 0 && !caps_tracking[currentLayout - 1].set_capslock) { - // caps lock was not set, change layouts - currentLayout = caps_tracking[currentLayout - 1].revert_layout; - mRendered = false; - } - } else if ((int)key.key == KEYBOARD_LAYOUT) { - // Switch layouts - if (caps_tracking[currentLayout - 1].capslock == 0 && key.layout == caps_tracking[currentLayout - 1].revert_layout) { - if (!caps_tracking[currentLayout - 1].set_capslock) { - caps_tracking[currentLayout - 1].set_capslock = 1; // Set the caps lock - } else { - caps_tracking[currentLayout - 1].set_capslock = 0; // Unset the caps lock and change layouts - currentLayout = key.layout; - } - } else { - currentLayout = key.layout; - } - mRendered = false; - } else if ((int)key.key == KEYBOARD_ACTION) { - // Action - highlightRenderCount = 0; - if (mAction) { - // Keyboard has its own action defined - return (mAction ? mAction->NotifyTouch(state, x, y) : 1); - } else { - // Send action notification - PageManager::NotifyKeyboard(key.key); - } - } - } else if (state == TOUCH_HOLD) { - was_held = 1; - if ((int)key.key == KEYBOARD_BACKSPACE) { - // Repeat backspace - PageManager::NotifyKeyboard(key.key); - } else if ((int)key.longpresskey < KEYBOARD_SPECIAL_KEYS && (int)key.longpresskey > 0) { - // Long Press Key - DataManager::Vibrate("tw_keyboard_vibrate"); - PageManager::NotifyKeyboard(key.longpresskey); + return 0; + } else { + Key& key = *initial_key; + Layout& lay = layouts[currentLayout - 1]; + if (state == TOUCH_RELEASE && was_held == 0) { + DataManager::Vibrate("tw_keyboard_vibrate"); + if ((int)key.key == KEYBOARD_LAYOUT) { + // Switch layouts + if (lay.is_caps && key.layout == lay.revert_layout && !CapsLockOn) { + CapsLockOn = true; // Set the caps lock + } else { + CapsLockOn = false; // Unset the caps lock and change layouts + currentLayout = key.layout; } - } else if (state == TOUCH_REPEAT) { - was_held = 1; - if ((int)key.key == KEYBOARD_BACKSPACE) { - // Repeat backspace - PageManager::NotifyKeyboard(key.key); + mRendered = false; + } else if ((int)key.key == KEYBOARD_ACTION) { + // Action + highlightRenderCount = 0; + // Send action notification + PageManager::NotifyKeyboard(key.key); + } else if ((int)key.key < KEYBOARD_SPECIAL_KEYS && (int)key.key > 0) { + // Regular key + PageManager::NotifyKeyboard(key.key); + if (!CapsLockOn && lay.is_caps) { + // caps lock was not set, change layouts + currentLayout = lay.revert_layout; + mRendered = false; } } - indexx = MAX_KEYBOARD_KEYS; + } else if (state == TOUCH_HOLD) { + was_held = 1; + if ((int)key.key == KEYBOARD_BACKSPACE) { + // Repeat backspace + PageManager::NotifyKeyboard(key.key); + } else if ((int)key.longpresskey < KEYBOARD_SPECIAL_KEYS && (int)key.longpresskey > 0) { + // Long Press Key + DataManager::Vibrate("tw_keyboard_vibrate"); + PageManager::NotifyKeyboard(key.longpresskey); + } + } else if (state == TOUCH_REPEAT) { + was_held = 1; + if ((int)key.key == KEYBOARD_BACKSPACE) { + // Repeat backspace + PageManager::NotifyKeyboard(key.key); + } } } break; diff --git a/gui/objects.hpp b/gui/objects.hpp index d26b0c2ed..e70053e3b 100644 --- a/gui/objects.hpp +++ b/gui/objects.hpp @@ -815,9 +815,6 @@ protected: int sUpdate; }; -#define MAX_KEYBOARD_LAYOUTS 5 -#define MAX_KEYBOARD_ROWS 9 -#define MAX_KEYBOARD_KEYS 20 #define KEYBOARD_ACTION 253 #define KEYBOARD_LAYOUT 254 #define KEYBOARD_SWIPE_LEFT 252 @@ -844,35 +841,40 @@ public: virtual int SetRenderPos(int x, int y, int w = 0, int h = 0); protected: - virtual int GetSelection(int x, int y); - -protected: - struct keyboard_key_class + struct Key { - unsigned char key; + unsigned char key; // ASCII code or one of the special KEYBOARD_* codes above unsigned char longpresskey; int end_x; int layout; }; - int ParseKey(const char* keyinfo, keyboard_key_class& key, int& Xindex, int keyWidth, bool longpress); - struct capslock_tracking_struct + int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress); + + enum { + MAX_KEYBOARD_LAYOUTS = 5, + MAX_KEYBOARD_ROWS = 9, + MAX_KEYBOARD_KEYS = 20 + }; + struct Layout { - int capslock; - int set_capslock; + ImageResource* keyboardImg; + struct Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS]; + int row_end_y[MAX_KEYBOARD_ROWS]; + bool is_caps; int revert_layout; }; + Layout layouts[MAX_KEYBOARD_LAYOUTS]; + + // Find key at screen coordinates + Key* HitTestKey(int x, int y); - ImageResource* keyboardImg[MAX_KEYBOARD_LAYOUTS]; - struct keyboard_key_class keyboard_keys[MAX_KEYBOARD_LAYOUTS][MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS]; - struct capslock_tracking_struct caps_tracking[MAX_KEYBOARD_LAYOUTS]; bool mRendered; std::string mVariable; int currentLayout; - int row_heights[MAX_KEYBOARD_LAYOUTS][MAX_KEYBOARD_ROWS]; + bool CapsLockOn; unsigned int KeyboardWidth, KeyboardHeight; int rowY, colX, highlightRenderCount; bool hasHighlight, hasCapsHighlight; - GUIAction* mAction; COLOR mHighlightColor; COLOR mCapsHighlightColor; }; |