Add capslock support to keyboard

Change-Id: I4be3849ff0485536575395d798aa5edbe12651a7
diff --git a/gui/keyboard.cpp b/gui/keyboard.cpp
index 78e27a1..bb52d55 100644
--- a/gui/keyboard.cpp
+++ b/gui/keyboard.cpp
@@ -47,7 +47,7 @@
 {
 	int layoutindex, rowindex, keyindex, Xindex, Yindex, keyHeight = 0, keyWidth = 0;
 	rowY = colX = -1;
-	highlightRenderCount = hasHighlight = 0;
+	highlightRenderCount = hasHighlight = hasCapsHighlight = 0;
 	char resource[10], layout[8], row[5], key[6], longpress[7];
 	xml_attribute<>* attr;
 	xml_node<>* child;
@@ -82,6 +82,17 @@
 		}
 	}
 
+	memset(&mCapsHighlightColor, 0, sizeof(COLOR));
+	child = node->first_node("capshighlight");
+	if (child) {
+		attr = child->first_attribute("color");
+		if (attr) {
+			hasCapsHighlight = 1;
+			std::string color = attr->value();
+			ConvertStrToColor(color, &mCapsHighlightColor);
+		}
+	}
+
 	// Load the images for the different layouts
 	child = node->first_node("layout");
 	if (child)
@@ -128,6 +139,16 @@
 				keyWidth = 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;
 		}
 
 		rowindex = 1;
@@ -320,6 +341,30 @@
 	if (keyboardImg[currentLayout - 1] && keyboardImg[currentLayout - 1]->GetResource())
 		gr_blit(keyboardImg[currentLayout - 1]->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;
+		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 (indexy == 0)
+						boxheight = row_heights[currentLayout - 1][indexy];
+					else
+						boxheight = row_heights[currentLayout - 1][indexy] - row_heights[currentLayout - 1][indexy - 1];
+					if (indexx == 0) {
+						x = mRenderX;
+						boxwidth = keyboard_keys[currentLayout - 1][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;
+					}
+					gr_fill(x, mRenderY + row_heights[currentLayout - 1][indexy - 1], boxwidth, boxheight);
+				}
+			}
+		}
+	}
+
 	if (hasHighlight && highlightRenderCount != 0) {
 		int boxheight, boxwidth, x;
 		if (rowY == 0)
@@ -477,9 +522,23 @@
 					if ((int)keyboard_keys[currentLayout - 1][rowIndex][indexx].key < KEYBOARD_SPECIAL_KEYS && (int)keyboard_keys[currentLayout - 1][rowIndex][indexx].key > 0) {
 						// Regular key
 						PageManager::NotifyKeyboard(keyboard_keys[currentLayout - 1][rowIndex][indexx].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)keyboard_keys[currentLayout - 1][rowIndex][indexx].key == KEYBOARD_LAYOUT) {
 						// Switch layouts
-						currentLayout = keyboard_keys[currentLayout - 1][rowIndex][indexx].layout;
+						if (caps_tracking[currentLayout - 1].capslock == 0 && keyboard_keys[currentLayout - 1][rowIndex][indexx].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 = keyboard_keys[currentLayout - 1][rowIndex][indexx].layout;
+							}
+						} else {
+							currentLayout = keyboard_keys[currentLayout - 1][rowIndex][indexx].layout;
+						}
 						mRendered = false;
 					} else if ((int)keyboard_keys[currentLayout - 1][rowIndex][indexx].key == KEYBOARD_ACTION) {
 						// Action