Mac OS 8 での改良
アップルでは、Mac OS 8 において、これらの問題を解決するために以下の改良を行いました。
- 新しいキーリマップリソース
接続されているキーボードの種別に応じて、キーボードコントロールパネルの設定を必要とする代わりに、Mac OS 8 では JIS キーボードをサポートするためのキーリマップリソース(リソースタイプ 'itlk')が追加されました。キーボード種別の違いをキーリマップリソースで吸収するため、JIS キーボード用のキーボードレイアウトリソースはすべて必要なくなり、Mac OS 8 からは削除されています。
| 名称 |
スクリプト |
入力方法 |
キーボード配列 |
| カナ | 日本語 | かな入力 | 特定しない |
| ローマ字 | 日本語 | ローマ字入力 | 特定しない |
| U.S. | ローマン | N/A | 特定しない |
表2: Mac OS 8 に実装されているキーボードレイアウトリソース (リソースタイプ 'KCHR')
キーボードレイアウトリソースとキーボード種別の関係を切り離すことで、上記の3リソースのみで JIS と US キーボードがサポートできるようになりました。
- KBGetLayoutType
Mac OS 8 では、インプットメソッドやアプリケーションがキーボード種別を知る必要のある場合、KBGetLayoutType を利用して判断することができます。KBGetLayoutType を利用することによって、JIS キーボードの ID を内部で維持する必要がなくなり、アップルが新しいキーボードを導入した場合でも正しく動作します。なお、KBGetLayoutType を使用するには、KeyboardsLib ライブラリが必要です。
- キーボードコントロールパネルの改良
アップルは Mac OS 8.0 で新しいキーボードコントロールパネルを導入しました。ユーザインタフェースの統合と改良に加えて、新しいコントロールパネルは2バイトスクリプトのキーボードレイアウトリソースを全く表示しません。キーボード種別の選択はキーリマップリソースによって必要なくなりました。また、入力方法の設定もインプットメソッド側で行われるため、コントロールパネルでは機能が必要なくなりました。
以下に、上記の変更の各々について詳しく説明いたします。
新しいキーリマップリソース
キーボードのキーが押された時、そのキーボードと同じリソース ID を持つキーマップリソース(リソースタイプ 'KMAP')を経由して、仮想キーコードが発生します。Event Manager はこの仮想キーコードを使いやすいキャラクタコードに変換し、その後 keyDown イベントとしてアプリケーションに渡します。キーリマップリソース(リソースタイプ 'itlk')は KeyTranslate 関数内で仮想キーコードを別の新しい仮想キーコードにマップします。詳しくは Inside Macintosh: Text, Appendix C, C-16 をご覧下さい。

図5: キーリマップリソースによる仮想キーコードのリマップの仕組み
キーリマップリソースが存在しない場合はどうなるでしょうか?
例えば、JIS の Apple Keyboard II(キーボード ID 22)の“@”キーが押された時、仮想キーコード 0x21 が発生します。その時に選択されているキーボードレイアウトリソースが“Roman - JIS”の場合、KeyTranslate は 0x21 を 0x40 にマップします。これは“@”記号の正しいキャラクタコードです。

図6: JIS キーボードで“Roman - JIS”が選択されている時に“@”キーを押す
この時、誤って“U.S.”キーボードレイアウトリソースが選択されていると、KeyTranslate は“U.S.”の 'KCHR' を経由して、キャラクタコード 0x5B(“[”)を発生させてしまい、キートップにプリントされている“@”と異なるキャラクタを生成してしまうことになります。

図7: JIS キーボードで“U.S.”が選択されている時に“@”キーを押す
US キーボードで“U.S.”キーボードレイアウトリソースを経由して、キャラクタコード 0x40(“@”)を発生させるには、修飾キーとして shift キーが押されており、仮想キーコードとして 0x13 が渡される必要があります。

図8: US キーボードで“U.S.”が選択されている時に“@”を生成する
JIS キーボードで“Roman - JIS”ではなく“U.S.”キーボードレイアウトリソースを経由して、キャラクタコード 0x40(“@”)を発生させるには、修飾キーとして shift キーが押されたのと同じ状況をキーリマップリソースが作りだし、仮想キーコードとして 0x13 が渡される必要があります。

図9: JIS キーボードで“U.S.”が選択されている時に“@”を生成する
このように、適切なキーリマップリソースを作成することにより、“U.S.”、“ローマ字”、“カナ”のキーボードレイアウトリソースだけで JIS キーボードと US キーボードの2種類のキーボードをサポートすることができるようになります。
Mac OS 8.5.1 でサポートされている JIS キーボード
Mac OS 8.5.1 現在、以下のキーボード ID が JIS キーボードとして認識されます。今後新たな JIS キーボードが登場すれば、そのキーボード ID も Mac OS に追加されます。
| キーボード ID |
JIS キーボード |
| 18 | Apple Adjustable Keyboard |
| 21 | PowerBook 500 シリーズ
PowerBook 1400 シリーズ
PowerBook 3400 シリーズ
PowerBook G3(オリジナル)
|
| 22 | Apple Keyboard II |
| 23 | Reserved |
| 26 | Reserved |
| 30 | PowerBook 2400 シリーズ |
| 194 | Reserved |
| 197 | PowerBook G3 シリーズ |
| 200 | iMac
Power Macintosh G3(Blue & White) |
| 201 | PowerBook G3(1999) |
キーリマップリソースによって変更されるキー
Mac OS 8 のキーリマップリソースによって変更される個々のキーは下記の通りです。(下記のキーの数字はキーコードを表しています。)
各キーリマップリソース('itlk')によって、 キーボードレイアウトリソース('KCHR')の処理の前にリマップされるキー
|
| カナ |
ローマ字 |
U.S. |
0x18 0x5D 0x21 0x1E 0x27 0x2A 0x5E 0x5F 0x66 0x68 |
0x13 0x16 0x1A 0x1C 0x19
0x1D 0x1B 0x18 0x5D 0x21
0x1E 0x29 0x27 0x2A 0x5E
0x5F 0x66 0x68 |
0x13 0x16 0x1A 0x1C 0x19
0x1D 0x1B 0x18 0x5D 0x21
0x1E 0x29 0x27 0x2A 0x5E
0x5F 0x66 0x68 |
KBGetLayoutType
コンピュータに接続されているキーボードの種別(JIS また非 JIS)を知る必要のあるインプットメソッドやアプリケーションはキーボードライブラリの KBGetLayoutType をご使用下さい。
キーボードライブラリは Mac OS 8.x 日本語版のみに含まれていることや、Mac OS 8.5 のバグのため、API を利用する前の存在の確認は不可欠です。確認方法や、存在しない場合の対処方法については以下のサンプルコードをご覧下さい。
キーボードライブラリはダウンロードの上、リンクしてご使用下さい。.
|
注意:
Mac OS 8.5 日本語版に含まれている KeyboardsLib 1.1 はバグにより KBGetLayoutType がクラッシュすることがあります。(Mac OS 8.5 アップデートや Mac OS 8.6 では解決されています。)
不幸中の幸いにも、キーボードライブラリは Mac OS 8.5 のタイミングで PowerPC のみの共有ライブラリになったため、非公開だった 'kbds' Gestalt セレクタが外されました。KeyboardsLib 1.1.1 以後では 'kbds' Gestalt セレクタが復活しています。'kbds' セレクタはここで公開するとともに、Mac OS のすべてのバージョンで、キーボードライブラリの有無を確認する方法として推奨します。
キーボードの種別を確認する場合、アップルの推奨する方法は、以下のサンプルコードのように、わかっているキーボードデバイスを内部で持ち、わからないデバイスについて KBGetLayoutType を利用することです。
|
/* KBLayout.h */
#ifndef __MACTYPES__
#include
#endif
#ifdef __cplusplus
extern "C" {
#endif
#if ! defined (__KEYBOARDS__)
enum {
gestaltKeyboardsLib = FOUR_CHAR_CODE('kbds') /* キーボードライブラリ */
};
enum
{
kKeyboardJIS = 'JIS ',
kKeyboardANSI = 'ANSI',
kKeyboardISO = 'ISO ',
kKeyboardUnknown = '????'
};
enum
{
_KeyboardDispatch = 0xAA7A
};
#pragma import on
extern pascal OSType KBGetLayoutType (short deviceID)
THREEWORDINLINE(0x303C, 0x0007, _KeyboardDispatch);
#pragma import off
#endif
OSType GetKeyboardLayoutType (short deviceID);
#ifdef __cplusplus
}
#endif
/* KBLayout.c */
#include
#include
#include
#include "KBLayout.h"
Boolean IsKBGetLayoutTypeAvailable (void);
/* キーボード配列を返します */
OSType GetKeyboardLayoutType (short deviceID)
{
OSType keyboardLayoutType;
switch (deviceID) {
case 0x01:
case 0x02:
case 0x03:
case 0x06:
case 0x08:
case 0x0C:
case 0x10:
case 0x18:
case 0x1B:
case 0x1C:
case 0xC0:
case 0xC3:
case 0xC6:
keyboardLayoutType = kKeyboardANSI;
break;
case 0x12:
case 0x15:
case 0x16:
case 0x17:
case 0x1A:
case 0x1E:
case 0xC2:
case 0xC5:
case 0xC8:
case 0xC9:
keyboardLayoutType = kKeyboardJIS;
break;
case 0x04:
case 0x05:
case 0x07:
case 0x09:
case 0x0D:
case 0x11:
case 0x14:
case 0x19:
case 0x1D:
case 0xC1:
case 0xC4:
case 0xC7:
keyboardLayoutType = kKeyboardISO;
break;
default:
if (IsKBGetLayoutTypeAvailable ())
keyboardLayoutType = KBGetLayoutType (deviceID);
else
keyboardLayoutType = kKeyboardUnknown;
break;
}
return keyboardLayoutType;
}
/* KBGetLayoutType が使用可能な場合のみ、true を返します */
Boolean IsKBGetLayoutTypeAvailable (void)
{
long response;
if (Gestalt (gestaltKeyboardsLib, &response) == noErr)
return true;
else
return false;
}
|
キーボードコントロールパネルの改良
キーボードコントロールパネルの“スクリプト”ポップアップメニューには、日本語を含む任意の2バイトスクリプトは表示されません。キーボードコントロールパネルがいままで提供していた機能は必要なくなったか、インプットメソッド側に委ねられています。

図10: Mac OS 8.5 のキーボードコントロールパネル
インプットメソッドやアプリケーションの互換性の注意点
多くのインプットメソッドは、インプットメソッド自身が内部に各キーボードに対するキーボードレイアウトリソース(リソースタイプ 'KCHR')を持ち、接続されているキーボードに応じてリソースを切り替えて使用し、キャラクタコードを得ています。この方法は Mac OS 8 でも使用できますが、互換性に関して以下の問題が発生する可能性があるので注意が必要です。
キーリマップリソースの導入により下記のキーボードレイアウトリソースは必要なくなり、Mac OS 8 から削除されています。以前 Mac OS に組み込まれていた下記のリソースに依存しているアプリケーションやインプットメソッドは変更が必要となります。
| 名称 |
スクリプト |
入力方法 |
キーボード配列 |
| かな - JIS | 日本語 | かな入力 | JIS |
| ローマ字 - JIS | 日本語 | ローマ字入力 | JIS |
| Roman - JIS | ローマン | N/A | JIS |
表3: Mac OS 8 で削除されたキーボードレイアウトリソース (リソースタイプ 'KCHR')
キーリマップリソースの構造上の制限により、以下の4つの場合に限り、JIS キーボードを使って正しいキャラクタコードが発生しません。従って、これらのショートカットを利用しているインプットメソッドやアプリケーションでは問題が発生する場合があります。
- “¥”と修飾キー
option + “¥”
option + shift + “¥”
option + shift + コマンド + “¥”
option + shift + caps lock + “¥”
option + shift + コマンド + caps lock + “¥”
は“|”記号(0x7C)を生成しません。
- “@”と修飾キー
コマンド + “@”
コマンド + shift + “@”
コマンド + caps lock + “@”
コマンド + shift + caps lock + “@”
option + “@”
option + コマンド + “@”
option + コマンド + caps lock + “@”
control + 任意の修飾キー + “@”
は“@”記号(0x40)を生成しません。
- “:”と修飾キー
コマンド + “:”
コマンド + Shift + “:”
コマンド + caps lock + “:”
コマンド + Shift + caps lock + “:”
option + shift + “:”
option + shift + コマンド + “:”
option + shift + caps lock + “:”
option + shift + コマンド + caps lock + “:”
option + “:”
control + 任意の修飾キー + “:”
は“:”記号(0x3A)を生成しません。
- “_” と修飾キー
コマンド + “_”
コマンド + caps lock + “_”
コマンド + shift + “_”
コマンド + shift + caps lock + “_”
option + “_”
option + コマンド + “_”
option + コマンド + caps lock + “_”
option + shift + “_”
option + shift + コマンド + “_”
option + shift + caps lock + “_”
option + shift + コマンド + caps lock + “_”
は“_”記号(0x5F)を生成しません。
|