// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ // // Copyright (c) 2004, Haiku // // This software is part of the Haiku distribution and is covered // by the Haiku license. // // // File: Keymap.cpp // Author: Jérôme Duval // Description: keymap bin // Created : July 29, 2004 // // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ #include "Keymap.h" #include #include #include #include #include #include #include #include #define CHARS_TABLE_MAXSIZE 10000 Keymap::Keymap() : fChars(NULL), fCharsSize(0) { } void Keymap::GetKey( char *chars, int32 offset, char* string) { int size = chars[offset++]; char str[32]; memset(str, 0, 32); memset(string, 0, 32); switch( size ) { case 0: // Not mapped sprintf(str, "''"); break; case 1: // 1-byte UTF-8/ASCII character if ((uint8)chars[offset] < 0x20 || (uint8)chars[offset] > 0x7e) sprintf(str, "0x%02x", (uint8)chars[offset]); else sprintf(str, "'%s%c'", (chars[offset] == '\\' || chars[offset] == '\'') ? "\\" : "", chars[offset]); break; default: // n-byte UTF-8/ASCII character sprintf(str, "0x"); for (int i=0; i 0) { if (current[0] == '\\') current[0] = current[1]; else if (current[0] == '\'') current[0] = ' '; length = 1; } else if (sscanf(buffer + regs.start[i], "0x%s", hexChars) > 0) { length = strlen(hexChars) / 2; for (uint32 j=0; j= 0) { sscanf(buffer + regs.start[1], "%ld", &fKeys.version); } else if (re_search(&capslockBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { sscanf(buffer + regs.start[1], "0x%lx", &fKeys.caps_key); } else if (re_search(&scrolllockBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { sscanf(buffer + regs.start[1], "0x%lx", &fKeys.scroll_key); } else if (re_search(&numlockBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { sscanf(buffer + regs.start[1], "0x%lx", &fKeys.num_key); } else if (re_search(&lshiftBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { sscanf(buffer + regs.start[1], "0x%lx", &fKeys.left_shift_key); } else if (re_search(&rshiftBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { sscanf(buffer + regs.start[1], "0x%lx", &fKeys.right_shift_key); } else if (re_search(&lcommandBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { sscanf(buffer + regs.start[1], "0x%lx", &fKeys.left_command_key); } else if (re_search(&rcommandBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { sscanf(buffer + regs.start[1], "0x%lx", &fKeys.right_command_key); } else if (re_search(&lcontrolBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { sscanf(buffer + regs.start[1], "0x%lx", &fKeys.left_control_key); } else if (re_search(&rcontrolBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { sscanf(buffer + regs.start[1], "0x%lx", &fKeys.right_control_key); } else if (re_search(&loptionBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { sscanf(buffer + regs.start[1], "0x%lx", &fKeys.left_option_key); } else if (re_search(&roptionBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { sscanf(buffer + regs.start[1], "0x%lx", &fKeys.right_option_key); } else if (re_search(&menuBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { sscanf(buffer + regs.start[1], "0x%lx", &fKeys.menu_key); } else if (re_search(&locksettingsBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { fKeys.lock_settings = 0; for (int32 i=1; i<=3; i++) { if (regs.end[i] - regs.start[i] <= 0) break; if (strncmp(buffer + regs.start[i], "CapsLock", regs.end[i] - regs.start[i]) == 0) fKeys.lock_settings |= B_CAPS_LOCK; else if (strncmp(buffer + regs.start[i], "NumLock", regs.end[i] - regs.start[i]) == 0) fKeys.lock_settings |= B_NUM_LOCK; else if (strncmp(buffer + regs.start[i], "ScrollLock", regs.end[i] - regs.start[i]) == 0) fKeys.lock_settings |= B_SCROLL_LOCK; } } else if (re_search(&keyBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { uint32 keyCode; if (sscanf(buffer + regs.start[1], "0x%lx", &keyCode) > 0) { for (int i=2; i<=10; i++) { maps[i-2][keyCode] = offset; ComputeChars(buffer, regs, i, offset); } } } else if (re_search(´Buf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { for (int i=1; i<=2; i++) { fKeys.acute_dead_key[acuteOffset++] = offset; ComputeChars(buffer, regs, i, offset); } } else if (re_search(&graveBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { for (int i=1; i<=2; i++) { fKeys.grave_dead_key[graveOffset++] = offset; ComputeChars(buffer, regs, i, offset); } } else if (re_search(&circumflexBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { for (int i=1; i<=2; i++) { fKeys.circumflex_dead_key[circumflexOffset++] = offset; ComputeChars(buffer, regs, i, offset); } } else if (re_search(&diaeresisBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { for (int i=1; i<=2; i++) { fKeys.dieresis_dead_key[diaeresisOffset++] = offset; ComputeChars(buffer, regs, i, offset); } } else if (re_search(&tildeBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { for (int i=1; i<=2; i++) { fKeys.tilde_dead_key[tildeOffset++] = offset; ComputeChars(buffer, regs, i, offset); } } else if (re_search(´tabBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { ComputeTables(buffer, regs, fKeys.acute_tables); } else if (re_search(&gravetabBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { ComputeTables(buffer, regs, fKeys.grave_tables); } else if (re_search(&circumflextabBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { ComputeTables(buffer, regs, fKeys.circumflex_tables); } else if (re_search(&diaeresistabBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { ComputeTables(buffer, regs, fKeys.dieresis_tables); } else if (re_search(&tildetabBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { ComputeTables(buffer, regs, fKeys.tilde_tables); } } fCharsSize = offset; if (fKeys.version != 3) return B_ERROR; return B_OK; } // we save a map to a file status_t Keymap::Save(entry_ref &ref) { status_t err; BFile file(&ref, B_WRITE_ONLY | B_CREATE_FILE | B_ERASE_FILE ); if ((err = file.InitCheck()) != B_OK) { printf("error %s\n", strerror(err)); return err; } for (uint32 i=0; i\n\n"); fprintf(f, "const key_map sSystemKeymap = {\n"); fprintf(f, "\tversion:%ld,\n", fKeys.version); fprintf(f, "\tcaps_key:0x%lx,\n", fKeys.caps_key); fprintf(f, "\tscroll_key:0x%lx,\n", fKeys.scroll_key); fprintf(f, "\tnum_key:0x%lx,\n", fKeys.num_key); fprintf(f, "\tleft_shift_key:0x%lx,\n", fKeys.left_shift_key); fprintf(f, "\tright_shift_key:0x%lx,\n", fKeys.right_shift_key); fprintf(f, "\tleft_command_key:0x%lx,\n", fKeys.left_command_key); fprintf(f, "\tright_command_key:0x%lx,\n", fKeys.right_command_key); fprintf(f, "\tleft_control_key:0x%lx,\n", fKeys.left_control_key); fprintf(f, "\tright_control_key:0x%lx,\n", fKeys.right_control_key); fprintf(f, "\tleft_option_key:0x%lx,\n", fKeys.left_option_key); fprintf(f, "\tright_option_key:0x%lx,\n", fKeys.right_option_key); fprintf(f, "\tmenu_key:0x%lx,\n", fKeys.menu_key); fprintf(f, "\tlock_settings:0x%lx,\n", fKeys.lock_settings); fprintf(f, "\tcontrol_map:{\n"); for (uint32 i=0; i<128; i++) fprintf(f, "\t\t%ld,\n", fKeys.control_map[i]); fprintf(f, "\t},\n"); fprintf(f, "\toption_caps_shift_map:{\n"); for (uint32 i=0; i<128; i++) fprintf(f, "\t\t%ld,\n", fKeys.option_caps_shift_map[i]); fprintf(f, "\t},\n"); fprintf(f, "\toption_caps_map:{\n"); for (uint32 i=0; i<128; i++) fprintf(f, "\t\t%ld,\n", fKeys.option_caps_map[i]); fprintf(f, "\t},\n"); fprintf(f, "\toption_shift_map:{\n"); for (uint32 i=0; i<128; i++) fprintf(f, "\t\t%ld,\n", fKeys.option_shift_map[i]); fprintf(f, "\t},\n"); fprintf(f, "\toption_map:{\n"); for (uint32 i=0; i<128; i++) fprintf(f, "\t\t%ld,\n", fKeys.option_map[i]); fprintf(f, "\t},\n"); fprintf(f, "\tcaps_shift_map:{\n"); for (uint32 i=0; i<128; i++) fprintf(f, "\t\t%ld,\n", fKeys.caps_shift_map[i]); fprintf(f, "\t},\n"); fprintf(f, "\tcaps_map:{\n"); for (uint32 i=0; i<128; i++) fprintf(f, "\t\t%ld,\n", fKeys.caps_map[i]); fprintf(f, "\t},\n"); fprintf(f, "\tshift_map:{\n"); for (uint32 i=0; i<128; i++) fprintf(f, "\t\t%ld,\n", fKeys.shift_map[i]); fprintf(f, "\t},\n"); fprintf(f, "\tnormal_map:{\n"); for (uint32 i=0; i<128; i++) fprintf(f, "\t\t%ld,\n", fKeys.normal_map[i]); fprintf(f, "\t},\n"); fprintf(f, "\tacute_dead_key:{\n"); for (uint32 i=0; i<32; i++) fprintf(f, "\t\t%ld,\n", fKeys.acute_dead_key[i]); fprintf(f, "\t},\n"); fprintf(f, "\tgrave_dead_key:{\n"); for (uint32 i=0; i<32; i++) fprintf(f, "\t\t%ld,\n", fKeys.grave_dead_key[i]); fprintf(f, "\t},\n"); fprintf(f, "\tcircumflex_dead_key:{\n"); for (uint32 i=0; i<32; i++) fprintf(f, "\t\t%ld,\n", fKeys.circumflex_dead_key[i]); fprintf(f, "\t},\n"); fprintf(f, "\tdieresis_dead_key:{\n"); for (uint32 i=0; i<32; i++) fprintf(f, "\t\t%ld,\n", fKeys.dieresis_dead_key[i]); fprintf(f, "\t},\n"); fprintf(f, "\ttilde_dead_key:{\n"); for (uint32 i=0; i<32; i++) fprintf(f, "\t\t%ld,\n", fKeys.tilde_dead_key[i]); fprintf(f, "\t},\n"); fprintf(f, "\tacute_tables:0x%lx,\n", fKeys.acute_tables); fprintf(f, "\tgrave_tables:0x%lx,\n", fKeys.grave_tables); fprintf(f, "\tcircumflex_tables:0x%lx,\n", fKeys.circumflex_tables); fprintf(f, "\tdieresis_tables:0x%lx,\n", fKeys.dieresis_tables); fprintf(f, "\ttilde_tables:0x%lx,\n", fKeys.tilde_tables); fprintf(f, "};\n\n"); fprintf(f, "const char sSystemKeyChars[] = {\n"); for (uint32 i=0; i