diff options
Diffstat (limited to 'android')
-rw-r--r-- | android/avd/hardware-properties.ini | 12 | ||||
-rw-r--r-- | android/avd/info.c | 19 | ||||
-rw-r--r-- | android/avd/info.h | 6 | ||||
-rw-r--r-- | android/main-common.c | 5 | ||||
-rw-r--r-- | android/main.c | 25 | ||||
-rw-r--r-- | android/qemulator.c | 12 | ||||
-rw-r--r-- | android/skin/keyboard.c | 30 | ||||
-rw-r--r-- | android/skin/keyboard.h | 5 |
8 files changed, 70 insertions, 44 deletions
diff --git a/android/avd/hardware-properties.ini b/android/avd/hardware-properties.ini index dabf166..0e650bb 100644 --- a/android/avd/hardware-properties.ini +++ b/android/avd/hardware-properties.ini @@ -83,6 +83,18 @@ default = yes abstract = Keyboard lid support description = Whether the QWERTY keyboard can be opened/closed. +# The name of the hardware charmap for this device. +# +# NOTE: This should always be the default 'qwerty2' unless you have +# modified the system image accordingly. This name is sent to +# the kernel at boot time. Using an incorrect name will result +# in an unusable machine. +name = hw.keyboard.charmap +type = string +default = qwerty2 +abstract = Keyboard charmap name +description = Name of the system keyboard charmap file. + # DPad keys name = hw.dPad type = boolean diff --git a/android/avd/info.c b/android/avd/info.c index f1514f2..7e4f93e 100644 --- a/android/avd/info.c +++ b/android/avd/info.c @@ -1183,3 +1183,22 @@ avdInfo_getSkinInfo( AvdInfo* i, char** pSkinName, char** pSkinDir ) AFREE(skinPath); return; } + +char* +avdInfo_getCharmapFile( AvdInfo* i, const char* charmapName ) +{ + char fileNameBuff[PATH_MAX]; + const char* fileName; + + if (charmapName == NULL || charmapName[0] == '\0') + return NULL; + + if (strstr(charmapName, ".kcm") == NULL) { + snprintf(fileNameBuff, sizeof fileNameBuff, "%s.kcm", charmapName); + fileName = fileNameBuff; + } else { + fileName = charmapName; + } + + return _avdInfo_getContentOrSdkFilePath(i, fileName); +} diff --git a/android/avd/info.h b/android/avd/info.h index 5192bb9..34997b4 100644 --- a/android/avd/info.h +++ b/android/avd/info.h @@ -215,6 +215,12 @@ const char* avdInfo_getContentPath( AvdInfo* i ); */ void avdInfo_getSkinInfo( AvdInfo* i, char** pSkinName, char** pSkinDir ); +/* Find a charmap file named <charmapName>.kcm for this AVD. + * Returns the path of the file on success, or NULL if not found. + * The result string must be freed by the caller. + */ +char* avdInfo_getCharmapFile( AvdInfo* i, const char* charmapName ); + /* Returns TRUE iff in the Android build system */ int avdInfo_inAndroidBuild( AvdInfo* i ); diff --git a/android/main-common.c b/android/main-common.c index a0e5f56..a662907 100644 --- a/android/main-common.c +++ b/android/main-common.c @@ -335,9 +335,6 @@ static const struct { { NULL, NULL } }; -/* this is used by hw/events_device.c to send the charmap name to the system */ -const char* android_skin_keycharmap = NULL; - void parse_skin_files(const char* skinDirPath, const char* skinName, @@ -563,8 +560,6 @@ init_sdl_ui(AConfig* skinConfig, exit(1); } - android_skin_keycharmap = skin_keyboard_charmap_name(qemulator_get()->keyboard); - /* add an onion overlay image if needed */ if (opts->onion) { SkinImage* onion = skin_image_find_simple( opts->onion ); diff --git a/android/main.c b/android/main.c index 814d2ec..f20ea7b 100644 --- a/android/main.c +++ b/android/main.c @@ -1032,9 +1032,30 @@ int main(int argc, char **argv) args[n++] = opts->http_proxy; } + if (!opts->charmap) { + /* Try to find a valid charmap name */ + char* charmap = avdInfo_getCharmapFile(avd, hw->hw_keyboard_charmap); + if (charmap != NULL) { + D("autoconfig: -charmap %s", charmap); + opts->charmap = charmap; + } + } + if (opts->charmap) { - args[n++] = "-charmap"; - args[n++] = opts->charmap; + char charmap_name[AKEYCHARMAP_NAME_SIZE]; + + if (!path_exists(opts->charmap)) { + derror("Charmap file does not exist: %s", opts->charmap); + exit(1); + } + /* We need to store the charmap name in the hardware configuration. + * However, the charmap file itself is only used by the UI component + * and doesn't need to be set to the emulation engine. + */ + kcm_extract_charmap_name(opts->charmap, charmap_name, + sizeof(charmap_name)); + AFREE(hw->hw_keyboard_charmap); + hw->hw_keyboard_charmap = ASTRDUP(charmap_name); } if (opts->memcheck) { diff --git a/android/qemulator.c b/android/qemulator.c index 9e88356..35587ff 100644 --- a/android/qemulator.c +++ b/android/qemulator.c @@ -137,17 +137,7 @@ qemulator_init( QEmulator* emulator, emulator->aconfig = aconfig; emulator->layout_file = skin_file_create_from_aconfig(aconfig, basepath); emulator->layout = emulator->layout_file->layouts; - // If we have a custom charmap use it to initialize keyboard. - // Otherwise initialize keyboard from configuration settings. - // Another way to configure keyboard to use a custom charmap would - // be saving a custom charmap name into AConfig's keyboard->charmap - // property, and calling single skin_keyboard_create_from_aconfig - // routine to initialize keyboard. - if (NULL != opts->charmap) { - emulator->keyboard = skin_keyboard_create_from_kcm(opts->charmap, opts->raw_keys); - } else { - emulator->keyboard = skin_keyboard_create_from_aconfig(aconfig, opts->raw_keys); - } + emulator->keyboard = skin_keyboard_create(opts->charmap, opts->raw_keys); emulator->window = NULL; emulator->win_x = x; emulator->win_y = y; diff --git a/android/skin/keyboard.c b/android/skin/keyboard.c index 3ee3366..3371799 100644 --- a/android/skin/keyboard.c +++ b/android/skin/keyboard.c @@ -72,15 +72,6 @@ skin_keyboard_set_keyset( SkinKeyboard* keyboard, SkinKeyset* kset ) } -const char* -skin_keyboard_charmap_name( SkinKeyboard* keyboard ) -{ - if (keyboard && keyboard->charmap) - return keyboard->charmap->name; - - return DEFAULT_ANDROID_CHARMAP; -} - void skin_keyboard_set_rotation( SkinKeyboard* keyboard, SkinRotation rotation ) @@ -539,22 +530,15 @@ skin_keyboard_create_from_charmap_name(const char* charmap_name, } SkinKeyboard* -skin_keyboard_create_from_aconfig( AConfig* aconfig, int use_raw_keys ) +skin_keyboard_create( const char* kcm_file_path, int use_raw_keys ) { - const char* charmap_name = DEFAULT_ANDROID_CHARMAP; - AConfig* node = aconfig_find( aconfig, "keyboard" ); - if (node != NULL) { - charmap_name = aconfig_str(node, "charmap", charmap_name); - } - return skin_keyboard_create_from_charmap_name(charmap_name, use_raw_keys); -} + const char* charmap_name = DEFAULT_ANDROID_CHARMAP; + char cmap_buff[AKEYCHARMAP_NAME_SIZE]; -SkinKeyboard* -skin_keyboard_create_from_kcm( const char* kcm_file_path, int use_raw_keys ) -{ - char charmap_name[AKEYCHARMAP_NAME_SIZE]; - kcm_extract_charmap_name(kcm_file_path, charmap_name, - sizeof(charmap_name)); + if (kcm_file_path != NULL) { + kcm_extract_charmap_name(kcm_file_path, cmap_buff, sizeof cmap_buff); + charmap_name = cmap_buff; + } return skin_keyboard_create_from_charmap_name(charmap_name, use_raw_keys); } diff --git a/android/skin/keyboard.h b/android/skin/keyboard.h index a86b132..1c3b088 100644 --- a/android/skin/keyboard.h +++ b/android/skin/keyboard.h @@ -24,9 +24,8 @@ typedef void (*SkinKeyCommandFunc)( void* opaque, SkinKeyCommand command, int typedef void (*SkinKeyEventFunc)( void* opaque, AndroidKeyCode code, int down ); -extern SkinKeyboard* skin_keyboard_create_from_aconfig( AConfig* aconfig, int use_raw_keys ); - -extern SkinKeyboard* skin_keyboard_create_from_kcm( const char* kcm_file_path, int use_raw_keys ); +/* If kcm_file_path is NULL, create a keyboard using the default built-in qwerty2 charmap */ +extern SkinKeyboard* skin_keyboard_create( const char* kcm_file_path, int use_raw_keys ); extern void skin_keyboard_set_keyset( SkinKeyboard* keyboard, SkinKeyset* kset ); |