18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Copyright (C) 2007-2008 The Android Open Source Project 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This software is licensed under the terms of the GNU General Public 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** License version 2, as published by the Free Software Foundation, and 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** may be copied, distributed, and modified under those terms. 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This program is distributed in the hope that it will be useful, 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** but WITHOUT ANY WARRANTY; without even the implied warranty of 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** GNU General Public License for more details. 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/ 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/file.h" 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/path.h" 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/charmap.h" 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/bufprint.h" 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/system.h" 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/debug.h" 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//#include "qemu-common.h" 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** UTILITY ROUTINES 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/ 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic SkinImage* 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_image_find_in( const char* dirname, const char* filename ) 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char buffer[1024]; 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p = buffer; 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end = p + sizeof(buffer); 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint( p, end, "%s" PATH_SEP "%s", dirname, filename ); 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p >= end) 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return SKIN_IMAGE_NONE; 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return skin_image_find_simple(buffer); 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** SKIN BACKGROUND 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/ 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_background_done( SkinBackground* background ) 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (background->image) 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_image_unref(&background->image); 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_background_init_from( SkinBackground* background, 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* node, 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* basepath ) 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* img = aconfig_str(node, "image", NULL); 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int x = aconfig_int(node, "x", 0); 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int y = aconfig_int(node, "y", 0); 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project background->valid = 0; 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (img == NULL) /* no background */ 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project background->image = skin_image_find_in( basepath, img ); 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (background->image == SKIN_IMAGE_NONE) { 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project background->image = NULL; 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project background->rect.pos.x = x; 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project background->rect.pos.y = y; 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project background->rect.size.w = skin_image_w( background->image ); 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project background->rect.size.h = skin_image_h( background->image ); 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project background->valid = 1; 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** SKIN DISPLAY 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/ 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_display_done( SkinDisplay* display ) 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qframebuffer_done( display->qfbuff ); 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_display_init_from( SkinDisplay* display, AConfig* node ) 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project display->rect.pos.x = aconfig_int(node, "x", 0); 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project display->rect.pos.y = aconfig_int(node, "y", 0); 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project display->rect.size.w = aconfig_int(node, "width", 0); 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project display->rect.size.h = aconfig_int(node, "height", 0); 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project display->rotation = aconfig_unsigned(node, "rotation", SKIN_ROTATION_0); 9497d795c955f8d261a0a5294d49ea06d5a473ed03David 'Digit' Turner display->bpp = aconfig_int(node, "bpp", 16); 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project display->valid = ( display->rect.size.w > 0 && display->rect.size.h > 0 ); 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (display->valid) { 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinRect r; 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_rect_rotate( &r, &display->rect, -display->rotation ); 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qframebuffer_init( display->qfbuff, 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project r.size.w, 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project r.size.h, 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0, 10597d795c955f8d261a0a5294d49ea06d5a473ed03David 'Digit' Turner display->bpp == 32 ? QFRAME_BUFFER_RGBX_8888 10697d795c955f8d261a0a5294d49ea06d5a473ed03David 'Digit' Turner : QFRAME_BUFFER_RGB565 ); 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qframebuffer_fifo_add( display->qfbuff ); 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return display->valid ? 0 : -1; 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** SKIN BUTTON 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/ 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* name; 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidKeyCode code; 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} KeyInfo; 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic KeyInfo _keyinfo_table[] = { 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "dpad-up", kKeyCodeDpadUp }, 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "dpad-down", kKeyCodeDpadDown }, 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "dpad-left", kKeyCodeDpadLeft }, 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "dpad-right", kKeyCodeDpadRight }, 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "dpad-center", kKeyCodeDpadCenter }, 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "soft-left", kKeyCodeSoftLeft }, 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "soft-right", kKeyCodeSoftRight }, 1308b870f0a99f484e4357b2664471eab12dadec327David 'Digit' Turner { "search", kKeyCodeSearch }, 1317e61121b1801fdc63722a402bb9839746b63ddf9soledad penades { "camera", kKeyCodeCamera }, 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "volume-up", kKeyCodeVolumeUp }, 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "volume-down", kKeyCodeVolumeDown }, 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "power", kKeyCodePower }, 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "home", kKeyCodeHome }, 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "back", kKeyCodeBack }, 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "del", kKeyCodeDel }, 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "0", kKeyCode0 }, 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "1", kKeyCode1 }, 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "2", kKeyCode2 }, 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "3", kKeyCode3 }, 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "4", kKeyCode4 }, 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "5", kKeyCode5 }, 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "6", kKeyCode6 }, 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "7", kKeyCode7 }, 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "8", kKeyCode8 }, 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "9", kKeyCode9 }, 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "star", kKeyCodeStar }, 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "pound", kKeyCodePound }, 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "phone-dial", kKeyCodeCall }, 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "phone-hangup", kKeyCodeEndCall }, 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "q", kKeyCodeQ }, 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "w", kKeyCodeW }, 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "e", kKeyCodeE }, 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "r", kKeyCodeR }, 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "t", kKeyCodeT }, 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "y", kKeyCodeY }, 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "u", kKeyCodeU }, 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "i", kKeyCodeI }, 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "o", kKeyCodeO }, 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "p", kKeyCodeP }, 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "a", kKeyCodeA }, 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "s", kKeyCodeS }, 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "d", kKeyCodeD }, 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "f", kKeyCodeF }, 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "g", kKeyCodeG }, 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "h", kKeyCodeH }, 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "j", kKeyCodeJ }, 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "k", kKeyCodeK }, 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "l", kKeyCodeL }, 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "DEL", kKeyCodeDel }, 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "z", kKeyCodeZ }, 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "x", kKeyCodeX }, 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "c", kKeyCodeC }, 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "v", kKeyCodeV }, 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "b", kKeyCodeB }, 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "n", kKeyCodeN }, 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "m", kKeyCodeM }, 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "COMMA", kKeyCodeComma }, 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "PERIOD", kKeyCodePeriod }, 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "ENTER", kKeyCodeNewline }, 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "AT", kKeyCodeAt }, 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "SPACE", kKeyCodeSpace }, 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "SLASH", kKeyCodeSlash }, 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "CAP", kKeyCodeCapLeft }, 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "SYM", kKeyCodeSym }, 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "ALT", kKeyCodeAltLeft }, 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "ALT2", kKeyCodeAltRight }, 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "CAP2", kKeyCodeCapRight }, 19062ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus { "tv", kKeyCodeTV }, 19162ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus { "epg", kKeyCodeEPG }, 19262ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus { "dvr", kKeyCodeDVR }, 19362ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus { "prev", kKeyCodePrevious }, 19462ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus { "next", kKeyCodeNext }, 19562ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus { "play", kKeyCodePlay }, 19662ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus { "pause", kKeyCodePause }, 19762ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus { "stop", kKeyCodeStop }, 19862ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus { "rev", kKeyCodeRewind }, 19962ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus { "ffwd", kKeyCodeFastForward }, 20062ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus { "bookmarks", kKeyCodeBookmarks }, 20162ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus { "window", kKeyCodeCycleWindows }, 20262ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus { "channel-up", kKeyCodeChannelUp }, 20362ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus { "channel-down", kKeyCodeChannelDown }, 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 0, 0 }, 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic unsigned 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectkeyinfo_lookup_code(const char *name) 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project KeyInfo *ki = _keyinfo_table; 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while(ki->name) { 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(!strcmp(name, ki->name)) 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return ki->code; 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ki++; 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_button_free( SkinButton* button ) 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (button) { 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_image_unref( &button->image ); 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AFREE(button); 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic SkinButton* 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_button_create_from( AConfig* node, const char* basepath ) 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinButton* button; 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ANEW0(button); 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (button) { 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* img = aconfig_str(node, "image", NULL); 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int x = aconfig_int(node, "x", 0); 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int y = aconfig_int(node, "y", 0); 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project button->name = node->name; 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project button->rect.pos.x = x; 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project button->rect.pos.y = y; 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (img != NULL) 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project button->image = skin_image_find_in( basepath, img ); 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (button->image == SKIN_IMAGE_NONE) { 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_button_free(button); 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project button->rect.size.w = skin_image_w( button->image ); 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project button->rect.size.h = skin_image_h( button->image ); 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project button->keycode = keyinfo_lookup_code( button->name ); 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (button->keycode == 0) { 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint( "Warning: skin file button uses unknown key name '%s'", button->name ); 2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return button; 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** SKIN PART 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/ 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_part_free( SkinPart* part ) 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (part) { 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_background_done( part->background ); 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_display_done( part->display ); 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_PART_LOOP_BUTTONS(part,button) 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_button_free(button); 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_PART_LOOP_END 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project part->buttons = NULL; 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AFREE(part); 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic SkinLocation* 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_location_create_from_v2( AConfig* node, SkinPart* parts ) 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* partname = aconfig_str(node, "name", NULL); 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int x = aconfig_int(node, "x", 0); 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int y = aconfig_int(node, "y", 0); 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinRotation rot = aconfig_int(node, "rotation", SKIN_ROTATION_0); 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinPart* part; 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLocation* location; 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (partname == NULL) { 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint( "### WARNING: ignoring part location without 'name' element" ); 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (part = parts; part; part = part->next) 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(part->name, partname)) 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (part == NULL) { 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint( "### WARNING: ignoring part location with unknown name '%s'", partname ); 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ANEW0(location); 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->part = part; 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->anchor.x = x; 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->anchor.y = y; 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->rotation = rot; 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return location; 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic SkinPart* 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_part_create_from_v1( AConfig* root, const char* basepath ) 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinPart* part; 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* node; 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinBox box; 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ANEW0(part); 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project part->name = root->name; 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project node = aconfig_find(root, "background"); 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (node) 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_background_init_from(part->background, node, basepath); 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project node = aconfig_find(root, "display"); 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (node) 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_display_init_from(part->display, node); 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project node = aconfig_find(root, "button"); 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (node) { 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (node = node->first_child; node != NULL; node = node->next) 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinButton* button = skin_button_create_from(node, basepath); 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (button != NULL) { 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project button->next = part->buttons; 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project part->buttons = button; 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_box_minmax_init( &box ); 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (part->background->valid) 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_box_minmax_update( &box, &part->background->rect ); 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (part->display->valid) 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_box_minmax_update( &box, &part->display->rect ); 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_PART_LOOP_BUTTONS(part, button) 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_box_minmax_update( &box, &button->rect ); 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_PART_LOOP_END 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !skin_box_minmax_to_rect( &box, &part->rect ) ) { 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_part_free(part); 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project part = NULL; 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return part; 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic SkinPart* 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_part_create_from_v2( AConfig* root, const char* basepath ) 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinPart* part; 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* node; 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinBox box; 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ANEW0(part); 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project part->name = root->name; 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project node = aconfig_find(root, "background"); 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (node) 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_background_init_from(part->background, node, basepath); 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project node = aconfig_find(root, "display"); 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (node) 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_display_init_from(part->display, node); 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project node = aconfig_find(root, "buttons"); 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (node) { 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (node = node->first_child; node != NULL; node = node->next) 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinButton* button = skin_button_create_from(node, basepath); 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (button != NULL) { 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project button->next = part->buttons; 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project part->buttons = button; 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_box_minmax_init( &box ); 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (part->background->valid) 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_box_minmax_update( &box, &part->background->rect ); 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (part->display->valid) 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_box_minmax_update( &box, &part->display->rect ); 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_PART_LOOP_BUTTONS(part, button) 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_box_minmax_update( &box, &button->rect ); 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_PART_LOOP_END 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !skin_box_minmax_to_rect( &box, &part->rect ) ) { 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_part_free(part); 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project part = NULL; 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return part; 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** SKIN LAYOUT 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/ 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_layout_free( SkinLayout* layout ) 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (layout) { 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_LAYOUT_LOOP_LOCS(layout,loc) 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AFREE(loc); 4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_LAYOUT_LOOP_END 4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->locations = NULL; 425a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume if (layout->onion_image) { 426a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume skin_image_unref( &layout->onion_image ); 427a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume } 4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AFREE(layout); 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSkinDisplay* 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_layout_get_display( SkinLayout* layout ) 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_LAYOUT_LOOP_LOCS(layout,loc) 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinPart* part = loc->part; 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (part->display->valid) { 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return part->display; 4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_LAYOUT_LOOP_END 4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSkinRotation 4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_layout_get_dpad_rotation( SkinLayout* layout ) 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 44787250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner if (layout->has_dpad_rotation) 44887250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner return layout->dpad_rotation; 44987250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_LAYOUT_LOOP_LOCS(layout, loc) 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinPart* part = loc->part; 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_PART_LOOP_BUTTONS(part,button) 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (button->keycode == kKeyCodeDpadUp) 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return loc->rotation; 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_PART_LOOP_END 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_LAYOUT_LOOP_END 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return SKIN_ROTATION_0; 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_layout_event_decode( const char* event, int *ptype, int *pcode, int *pvalue ) 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project typedef struct { 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* name; 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int value; 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } EventName; 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static const EventName _event_names[] = { 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "EV_SW", 0x05 }, 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, 0 }, 4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }; 4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* x = strchr(event, ':'); 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* y = NULL; 4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const EventName* ev = _event_names; 4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (x != NULL) 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project y = strchr(x+1, ':'); 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (x == NULL || y == NULL) { 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint( "### WARNING: invalid skin layout event format: '%s', should be '<TYPE>:<CODE>:<VALUE>'", event ); 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; ev->name != NULL; ev++ ) 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!memcmp( event, ev->name, x - event ) && ev->name[x-event] == 0) 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!ev->name) { 4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint( "### WARNING: unrecognized skin layout event name: %.*s", x-event, event ); 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *ptype = ev->value; 4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *pcode = strtol(x+1, NULL, 0); 4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *pvalue = strtol(y+1, NULL, 0); 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic SkinLayout* 503a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blumeskin_layout_create_from_v2( AConfig* root, SkinPart* parts, const char* basepath ) 5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLayout* layout; 5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int width, height; 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLocation** ptail; 5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* node; 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ANEW0(layout); 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project width = aconfig_int( root, "width", 400 ); 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project height = aconfig_int( root, "height", 400 ); 5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project node = aconfig_find( root, "event" ); 5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (node != NULL) { 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_layout_event_decode( node->value, 5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project &layout->event_type, 5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project &layout->event_code, 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project &layout->event_value ); 5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->event_type = 0x05; /* close keyboard by default */ 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->event_code = 0; 5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->event_value = 1; 5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->name = root->name; 5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->color = aconfig_unsigned( root, "color", 0x808080 ) | 0xff000000; 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptail = &layout->locations; 5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 53187250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner node = aconfig_find( root, "dpad-rotation" ); 53287250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner if (node != NULL) { 53387250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner layout->dpad_rotation = aconfig_int( root, "dpad-rotation", 0 ); 53487250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner layout->has_dpad_rotation = 1; 53587250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner } 53687250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner 537a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume node = aconfig_find( root, "onion" ); 538a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume if (node != NULL) { 539a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume const char* img = aconfig_str(node, "image", NULL); 540a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume layout->onion_image = skin_image_find_in( basepath, img ); 541a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume if (layout->onion_image == SKIN_IMAGE_NONE) { 542a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume layout->onion_image = NULL; 543a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume } 544a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume // In layout file, alpha is specified in range 0-100. Convert to 545a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume // internal range 0-256 with default=128. 546a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume int alpha = aconfig_int( node, "alpha", 50 ); 547a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume layout->onion_alpha = (256*alpha)/100; 548a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume layout->onion_rotation = aconfig_int( node, "rotation", 0 ); 549a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume } 550a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume 5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (node = root->first_child; node; node = node->next) 5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!memcmp(node->name, "part", 4)) { 5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLocation* location = skin_location_create_from_v2( node, parts ); 5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (location == NULL) { 5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project continue; 5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *ptail = location; 5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptail = &location->next; 5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (layout->locations == NULL) 5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto Fail; 5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->size.w = width; 5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->size.h = height; 5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return layout; 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectFail: 5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_layout_free(layout); 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** SKIN FILE 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/ 5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_file_load_from_v1( SkinFile* file, AConfig* aconfig, const char* basepath ) 5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinPart* part; 5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLayout* layout; 5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLayout** ptail = &file->layouts; 5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLocation* location; 5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project file->parts = part = skin_part_create_from_v1( aconfig, basepath ); 5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (part == NULL) 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; nn < 2; nn++) 5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ANEW0(layout); 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->color = 0xff808080; 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ANEW0(location); 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->event_type = 0x05; /* close keyboard by default */ 6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->event_code = 0; 6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->event_value = 1; 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->part = part; 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (nn) { 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 0: 6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->anchor.x = 0; 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->anchor.y = 0; 6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->rotation = SKIN_ROTATION_0; 6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->size = part->rect.size; 6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 1: 6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->anchor.x = part->rect.size.h; 6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->anchor.y = 0; 6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->rotation = SKIN_ROTATION_90; 6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->size.w = part->rect.size.h; 6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->size.h = part->rect.size.w; 6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->event_value = 0; 6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 2: 6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->anchor.x = part->rect.size.w; 6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->anchor.y = part->rect.size.h; 6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->rotation = SKIN_ROTATION_180; 6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->size = part->rect.size; 6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: 6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->anchor.x = 0; 6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->anchor.y = part->rect.size.w; 6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->rotation = SKIN_ROTATION_270; 6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->size.w = part->rect.size.h; 6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->size.h = part->rect.size.w; 6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->event_value = 0; 6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->locations = location; 6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *ptail = layout; 6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptail = &layout->next; 6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 64459e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner file->version = 1; 6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_file_load_from_v2( SkinFile* file, AConfig* aconfig, const char* basepath ) 6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* node; 6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* first, load all parts */ 6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project node = aconfig_find(aconfig, "parts"); 6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (node == NULL) 6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinPart** ptail = &file->parts; 6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (node = node->first_child; node != NULL; node = node->next) 6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinPart* part = skin_part_create_from_v2( node, basepath ); 6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (part == NULL) { 6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint( "## WARNING: can't load part '%s' from skin\n", node->name ? "<NULL>" : node->name ); 6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project continue; 6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project part->next = NULL; 6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *ptail = part; 6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptail = &part->next; 6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (file->parts == NULL) 6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* then load all layouts */ 6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project node = aconfig_find(aconfig, "layouts"); 6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (node == NULL) 6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLayout** ptail = &file->layouts; 6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (node = node->first_child; node != NULL; node = node->next) 6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 685a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume SkinLayout* layout = skin_layout_create_from_v2( node, file->parts, basepath ); 6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (layout == NULL) { 6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint( "## WARNING: ignoring layout in skin file" ); 6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project continue; 6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *ptail = layout; 6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->next = NULL; 6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptail = &layout->next; 6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (file->layouts == NULL) 6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 69859e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner file->version = 2; 6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSkinFile* 7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_file_create_from_aconfig( AConfig* aconfig, const char* basepath ) 7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinFile* file; 7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ANEW0(file); 70859e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner 7098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( aconfig_find(aconfig, "parts") != NULL) { 7108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (skin_file_load_from_v2( file, aconfig, basepath ) < 0) { 71159e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner goto BAD_FILE; 71259e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner } 71359e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner file->version = aconfig_int(aconfig, "version", 2); 71459e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner /* The file version must be 1 or higher */ 71559e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner if (file->version <= 0) { 71659e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner dprint( "## WARNING: invalid skin version: %d", file->version); 71759e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner goto BAD_FILE; 7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 7218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (skin_file_load_from_v1( file, aconfig, basepath ) < 0) { 72259e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner goto BAD_FILE; 7238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 72459e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner file->version = 1; 7258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return file; 72759e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner 72859e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' TurnerBAD_FILE: 72959e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner skin_file_free( file ); 73059e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner return NULL; 7318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid 7348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_file_free( SkinFile* file ) 7358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (file) { 7378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_FILE_LOOP_LAYOUTS(file,layout) 7388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_layout_free(layout); 7398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_FILE_LOOP_END_LAYOUTS 7408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project file->layouts = NULL; 7418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_FILE_LOOP_PARTS(file,part) 7438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_part_free(part); 7448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_FILE_LOOP_END_PARTS 7458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project file->parts = NULL; 7468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AFREE(file); 7488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 750