MonaでJava (6)
gcjサポート第二段はサーバーをJavaで再実装します。手始めに Shell サーバーをいじってみました。以下実装途中のコードです。
import org.monaos.*; public class Main { public static final int KEY_MODIFIER_DOWN = 0x01; public static final int KEY_MODIFIER_UP = 0x02; public static final int KEY_MODIFIER_SHIFT = 0x04; public static final int KEY_MODIFIER_ALT = 0x08; public static final int KEY_MODIFIER_CTRL = 0x10; public static final int KEY_MODIFIER_WIN = 0x20; public static final int KEY_MODIFIER_MENU = 0x40; public static final int KEY_MODIFIER_CHAR = 0x80; public static final int MSG_KEY_REGIST_TO_SERVER = 0x0200; public static final int MSG_KEY_UNREGIST_FROM_SERVER = 0x0201; public static final int MSG_KEY_VIRTUAL_CODE = 0x0202; public static void main(String[] args) { if (Message.registerToServer(Message.ID_KEYBOARD_SERVER, 1) == 0) return; if (Message.registerToServer(Message.ID_PROCESS_SERVER, 1) == 0) return; int processID = Message.getServerThreadId(Message.ID_PROCESS_SERVER); int moniterID = Message.getServerThreadId(Message.ID_MONITOR_SERVER); if (moniterID != Message.THREAD_UNKNOWN && Message.send(moniterID, Message.MSG_SERVER_START_OK, 0, 0, 0) != 0) { System.out.print("SHELL: MSG_SERVER_START_NG\n"); } else { MessageInfo info = new MessageInfo(); while (true) { if (Message.receive(info) != 0) continue; switch (info.header) { case MSG_KEY_VIRTUAL_CODE: if ((info.arg2 & KEY_MODIFIER_DOWN) != 0) { char c = (char)info.arg1; System.out.print(c + ""); } break; } } } Message.registerToServer(Message.ID_KEYBOARD_SERVER, 0); Message.registerToServer(Message.ID_PROCESS_SERVER, 0); } }
とりあえず文字をタイプするとそれが画面に表示されるようになりました。Monaプログラマから見るとなんとも不思議なコードです。