GUIKeyboard::GUIKeyboard(xml_node<>* node) : GUIObject(node) { int layoutindex, rowindex, keyindex, Xindex, Yindex, keyHeight = 0, keyWidth = 0; currentKey = NULL; highlightRenderCount = 0; hasHighlight = hasCapsHighlight = false; char resource[10], layout[8], row[5], key[6], longpress[7]; xml_attribute<>* attr; xml_node<>* child; xml_node<>* keylayout; xml_node<>* keyrow; 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; CapsLockOn = false; if (!node) return; mHighlightColor = LoadAttrColor(FindNode(node, "highlight"), "color", &hasHighlight); mCapsHighlightColor = LoadAttrColor(FindNode(node, "capshighlight"), "color", &hasCapsHighlight); child = FindNode(node, "keymargin"); mKeyMarginX = LoadAttrIntScaleX(child, "x", 0); mKeyMarginY = LoadAttrIntScaleY(child, "y", 0); child = FindNode(node, "background"); mBackgroundColor = LoadAttrColor(child, "color", COLOR(32,32,32,255)); child = FindNode(node, "key-alphanumeric"); mFont = PageManager::GetResources()->FindFont(LoadAttrString(child, "font", "keylabel")); mFontColor = LoadAttrColor(child, "textcolor", COLOR(255,255,255,255)); mKeyColorAlphanumeric = LoadAttrColor(child, "color", COLOR(0,0,0,0)); child = FindNode(node, "key-other"); mSmallFont = PageManager::GetResources()->FindFont(LoadAttrString(child, "font", "keylabel-small")); mFontColorSmall = LoadAttrColor(child, "textcolor", COLOR(192,192,192,255)); mKeyColorOther = LoadAttrColor(child, "color", COLOR(0,0,0,0)); child = FindNode(node, "longpress"); mLongpressFont = PageManager::GetResources()->FindFont(LoadAttrString(child, "font", "keylabel-longpress")); mLongpressFontColor = LoadAttrColor(child, "textcolor", COLOR(128,128,128,255)); LoadPlacement(child, &longpressOffsetX, &longpressOffsetY); LoadKeyLabels(node, 0); // load global key labels // compatibility ugliness: resources should be specified in the layouts themselves instead // Load the images for the different layouts child = FindNode(node, "layout"); if (child) { layoutindex = 1; strcpy(resource, "resource1"); attr = child->first_attribute(resource); while (attr && layoutindex < (MAX_KEYBOARD_LAYOUTS + 1)) { layouts[layoutindex - 1].keyboardImg = LoadAttrImage(child, resource); layoutindex++; resource[8] = (char)(layoutindex + 48); attr = child->first_attribute(resource); } } // Check the first image to get height and width if (layouts[0].keyboardImg && layouts[0].keyboardImg->GetResource()) { mRenderW = layouts[0].keyboardImg->GetWidth(); mRenderH = layouts[0].keyboardImg->GetHeight(); } // Load all of the layout maps layoutindex = 1; strcpy(layout, "layout1"); keylayout = FindNode(node, layout); while (keylayout) { if (layoutindex > MAX_KEYBOARD_LAYOUTS) { LOGERR("Too many layouts defined in keyboard.\n"); return; } LoadKeyLabels(keylayout, layoutindex); // load per-layout key labels Layout& lay = layouts[layoutindex - 1]; child = keylayout->first_node("keysize"); 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; strcpy(row, "row1"); keyrow = keylayout->first_node(row); while (keyrow) { if (rowindex > MAX_KEYBOARD_ROWS) { LOGERR("Too many rows defined in keyboard.\n"); return; } Yindex += keyHeight; lay.row_end_y[rowindex - 1] = Yindex; keyindex = 1; Xindex = 0; strcpy(key, "key01"); attr = keyrow->first_attribute(key); while (attr) { if (keyindex > MAX_KEYBOARD_KEYS) { LOGERR("Too many keys defined in a keyboard row.\n"); return; } const char* keyinfo = attr->value(); if (strlen(keyinfo) == 0) { LOGERR("No key info on layout%i, row%i, key%dd.\n", layoutindex, rowindex, keyindex); return; } 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); // PROCESS LONG PRESS INFO IF EXISTS sprintf(longpress, "long%02i", keyindex); attr = keyrow->first_attribute(longpress); if (attr) { const char* keyinfo = attr->value(); if (strlen(keyinfo) == 0) { LOGERR("No long press info on layout%i, row%i, long%dd.\n", layoutindex, rowindex, keyindex); return; } 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++; sprintf(key, "key%02i", keyindex); attr = keyrow->first_attribute(key); } rowindex++; row[3] = (char)(rowindex + 48); keyrow = keylayout->first_node(row); } layoutindex++; layout[6] = (char)(layoutindex + 48); keylayout = FindNode(node, layout); } int x, y; // Load the placement LoadPlacement(FindNode(node, "placement"), &x, &y, &mRenderW, &mRenderH); SetRenderPos(x, y, mRenderW, mRenderH); return; }
GUIKeyboard::GUIKeyboard(xml_node<>* node) : GUIObject(node) { int layoutindex, rowindex, keyindex, Xindex, Yindex, keyHeight = 0, keyWidth = 0; rowY = colX = -1; highlightRenderCount = 0; hasHighlight = hasCapsHighlight = false; char resource[10], layout[8], row[5], key[6], longpress[7]; xml_attribute<>* attr; xml_node<>* child; xml_node<>* keylayout; xml_node<>* keyrow; 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; CapsLockOn = false; KeyboardHeight = KeyboardWidth = 0; if (!node) return; 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) { layoutindex = 1; strcpy(resource, "resource1"); attr = child->first_attribute(resource); while (attr && layoutindex < (MAX_KEYBOARD_LAYOUTS + 1)) { layouts[layoutindex - 1].keyboardImg = LoadAttrImage(child, resource); layoutindex++; resource[8] = (char)(layoutindex + 48); attr = child->first_attribute(resource); } } // Check the first image to get height and width if (layouts[0].keyboardImg && layouts[0].keyboardImg->GetResource()) { KeyboardWidth = layouts[0].keyboardImg->GetWidth(); KeyboardHeight = layouts[0].keyboardImg->GetHeight(); } // Load all of the layout maps layoutindex = 1; strcpy(layout, "layout1"); keylayout = FindNode(node, layout); while (keylayout) { if (layoutindex > MAX_KEYBOARD_LAYOUTS) { LOGERR("Too many layouts defined in keyboard.\n"); return; } Layout& lay = layouts[layoutindex - 1]; child = keylayout->first_node("keysize"); 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; strcpy(row, "row1"); keyrow = keylayout->first_node(row); while (keyrow) { if (rowindex > MAX_KEYBOARD_ROWS) { LOGERR("Too many rows defined in keyboard.\n"); return; } Yindex += keyHeight; lay.row_end_y[rowindex - 1] = Yindex; keyindex = 1; Xindex = 0; strcpy(key, "key01"); attr = keyrow->first_attribute(key); while (attr) { if (keyindex > MAX_KEYBOARD_KEYS) { LOGERR("Too many keys defined in a keyboard row.\n"); return; } const char* keyinfo = attr->value(); if (strlen(keyinfo) == 0) { LOGERR("No key info on layout%i, row%i, key%dd.\n", layoutindex, rowindex, keyindex); return; } 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); // PROCESS LONG PRESS INFO IF EXISTS sprintf(longpress, "long%02i", keyindex); attr = keyrow->first_attribute(longpress); if (attr) { const char* keyinfo = attr->value(); if (strlen(keyinfo) == 0) { LOGERR("No long press info on layout%i, row%i, long%dd.\n", layoutindex, rowindex, keyindex); return; } 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++; sprintf(key, "key%02i", keyindex); attr = keyrow->first_attribute(key); } rowindex++; row[3] = (char)(rowindex + 48); keyrow = keylayout->first_node(row); } layoutindex++; layout[6] = (char)(layoutindex + 48); keylayout = FindNode(node, layout); } int x, y; // Load the placement LoadPlacement(FindNode(node, "placement"), &x, &y); SetRenderPos(x, y, KeyboardWidth, KeyboardHeight); return; }