OSDN Git Service

change EOL style to CRLF to adjust to default setting of Visual Studio
authorU-i7\gimy <gimy@users.sourceforge.jp>
Sat, 11 Jul 2009 14:05:57 +0000 (23:05 +0900)
committerU-i7\gimy <gimy@users.sourceforge.jp>
Sat, 11 Jul 2009 14:05:57 +0000 (23:05 +0900)
82 files changed:
104.mayu
104on109.mayu
109.mayu
109on104.mayu
array.h
compiler_specific.h
compiler_specific_func.cpp
compiler_specific_func.h
contrib/109onAX.mayu
contrib/98x1.mayu
contrib/DVORAKon109.mayu
contrib/ax.mayu
contrib/dvorak.mayu
contrib/dvorak109.mayu
contrib/keitai.mayu
contrib/mayu-settings.txt
d/README.txt
d/SOURCES
d/keyque.c
d/mayud.c
d/nt4/SOURCES
d/nt4/mayudnt4.c
d/rescue/SOURCES
d/rescue/mayudrsc.c
d/test.reg
default.mayu
dlgeditsetting.cpp
dlgeditsetting.h
dlginvestigate.cpp
dlginvestigate.h
dlglog.cpp
dlglog.h
dlgsetting.cpp
dlgsetting.h
dlgversion.cpp
dlgversion.h
dot.mayu
driver.h
emacsedit.mayu
engine.cpp
engine.h
errormessage.h
focus.cpp
focus.h
function.cpp
hook.cpp
hook.h
keyboard.cpp
keyboard.h
keymap.cpp
keymap.h
layoutmanager.h
mayu.cpp
mayu.h
mayuipc.h
misc.h
msgstream.h
multithread.h
parser.cpp
parser.h
registry.cpp
registry.h
s/afxres.h
s/installer.cpp
s/installer.h
s/setup.cpp
setting.cpp
setting.h
stringtool.cpp
stringtool.h
target.cpp
target.h
ts4mayu/thumbsense.mayu
ts4mayu/ts4mayu.cpp
ts4mayu/ts4mayu.def
vk2tchar.h
vkeytable.cpp
vkeytable.h
windowstool.cpp
windowstool.h
yamy.cpp
yamyd.cpp

index ae37146..f215ddd 100755 (executable)
--- a/104.mayu
+++ b/104.mayu
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# MADO TSUKAI NO YUUTSU - 104.mayu
-# Copyright (C) 1999-2005, TAGA Nayuta <nayuta@users.sourceforge.net>
-#
-
-define KBD101
-define KBD102
-define KBD104
-define KBD105
-define KBD107
-define KBD108
-
-
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# 101/102/104/105/107/108 US keyboard definition
-#
-
-def key Esc Escape                     =    0x01
-def key _1                             =    0x02 # 1!
-def key _2                             =    0x03 # 2@
-def key _3                             =    0x04 # 3#
-def key _4                             =    0x05 # 4$
-def key _5                             =    0x06 # 5%
-def key _6                             =    0x07 # 6^
-def key _7                             =    0x08 # 7&
-def key _8                             =    0x09 # 8*
-def key _9                             =    0x0a # 9(
-def key _0                             =    0x0b # 0)
-def key HyphenMinus Hyphen Minus       =    0x0c # -_
-def key EqualsSign Equal               =    0x0d # =+
-def key BackSpace BS Back              =    0x0e
-def key Tab                            =    0x0f
-def key Q                              =    0x10
-def key ScanPreviousTrack PreviousTrack        = E0-0x10 # (Media Player)
-def key W                              =    0x11
-def key E                              =    0x12
-def key R                              =    0x13
-def key T                              =    0x14
-def key Y                              =    0x15
-def key U                              =    0x16
-def key I                              =    0x17
-def key O                              =    0x18
-def key P                              =    0x19
-def key ScanNextTrack NextTrack                = E0-0x19 # (Media Player)
-def key LeftSquareBracket OpenBracket  =    0x1a # [{
-def key RightSquareBracket CloseBracket        =    0x1b # ]}
-def key Enter Return                   =    0x1c
-def key NumEnter NumReturn             = E0-0x1c
-def key LeftControl LControl LCtrl     =    0x1d
-def key RightControl RControl RCtrl    = E0-0x1d
-def key Pause                          = E1-0x1d 0x45 # Pause
-def key A                              =    0x1e
-def key S                              =    0x1f
-def key D                              =    0x20
-def key Mute                           = E0-0x20 # (Media Player)
-def key F                              =    0x21
-def key ALCalculator                   = E0-0x21 # (N/A) Calculator 
-def key G                              =    0x22
-def key Play/Pause                     = E0-0x22 # (Media Player)
-def key H                              =    0x23
-def key J                              =    0x24
-def key Stop                           = E0-0x24 # (Media Player)
-def key K                              =    0x25
-def key L                              =    0x26
-def key Semicolon                      =    0x27 # ;:
-def key Apostrophe Quote               =    0x28 # '"
-def key GraveAccent BackQuote          =    0x29 # `~
-def key LeftShift LShift               =    0x2a
-# def ignore                           = E0-0x2a # what is this? (ignore)
-def key ReverseSolidus BackSlash       =    0x2b # \|
-def key Z                              =    0x2c
-def key X                              =    0x2d
-def key C                              =    0x2e
-def key VolumeDecrement VolumeDown     = E0-0x2e
-def key V                              =    0x2f
-def key B                              =    0x30
-def key VolumeIncrement VolumeUp       = E0-0x30
-def key N                              =    0x31
-def key M                              =    0x32
-def key ACHome Internet                        = E0-0x32 # (Internet Explorer)
-def key Comma                          =    0x33 # ,<
-def key FullStop Period                        =    0x34 # .>
-def key Solidus Slash                  =    0x35 # /?
-def key NumSolidus NumSlash            = E0-0x35 # Numpad /
-def key RightShift RShift              =    0x36
-def key E0RightShift E0RShift          = E0-0x36
-def key NumAsterisk NumMultiply                =    0x37 # Numpad *
-def key PrintScreen Snapshot           = E0-0x37
-def key LeftAlt LAlt LMenu             =    0x38
-def key RightAlt RAlt RMenu            = E0-0x38
-def key Space                          =    0x39
-def key CapsLock Capital Caps          =    0x3a # CapsLock
-def key F1                             =    0x3b
-def key F2                             =    0x3c
-def key F3                             =    0x3d
-def key F4                             =    0x3e
-def key F5                             =    0x3f
-def key F6                             =    0x40
-def key F7                             =    0x41
-def key F8                             =    0x42
-def key F9                             =    0x43
-def key F10                            =    0x44
-def key NumLock                                =    0x45
-def key ScrollLock Scroll              =    0x46
-def key Break                          = E0-0x46 # Break
-def key Num7                           =    0x47 # Numpad 7
-def key Home                           = E0-0x47
-def key Num8                           =    0x48 # Numpad 8
-def key Up                             = E0-0x48
-def key Num9                           =    0x49 # Numpad 9
-def key PageUp Prior                   = E0-0x49
-def key NumHyphenMinus NumMinus                =    0x4a # Numpad -
-def key Num4                           =    0x4b # Numpad 4
-def key Left                           = E0-0x4b
-def key Num5                           =    0x4c # Numpad 5
-def key Num6                           =    0x4d # Numpad 6
-def key Right                          = E0-0x4d
-def key NumPlusSign NumPlus            =    0x4e # Numpad +
-def key Num1                           =    0x4f # Numpad 1
-def key End                            = E0-0x4f
-def key Num2                           =    0x50
-def key Down                           = E0-0x50
-def key Num3                           =    0x51
-def key PageDown Next                  = E0-0x51
-def key Num0                           =    0x52
-def key Insert                         = E0-0x52
-def key NumFullStop NumPeriod          =    0x53 # Numpad .
-def key Delete Del                     = E0-0x53
-def key SysRq                          =    0x54
-def key Less                           =    0x56 # < >
-def key F11                            =    0x57
-def key F12                            =    0x58
-def key LeftWindows LWindows LWin      = E0-0x5b
-def key RightWindows RWindows RWin     = E0-0x5c
-def key Applications Apps              = E0-0x5d
-def key PowerOff                       = E0-0x5e # Power off    (107 keyboard)
-def key Sleep                          = E0-0x5f # Sleep        (107 keyboard)
-def key WakeUp                         = E0-0x63 # Wake up      (107 keyboard)
-def key ACSearch                       = E0-0x65 # (Internet Explorer)
-def key ACBookmarks                    = E0-0x66 # (Internet Explorer)
-def key ACRefresh                      = E0-0x67 # (Internet Explorer)
-def key ACStop                         = E0-0x68 # (Internet Explorer)
-def key ACForward                      = E0-0x69 # (Internet Explorer)
-def key ACBack                         = E0-0x6a # (Internet Explorer)
-def key ALLocalBrowser                 = E0-0x6b # (N/A) My Computer 
-def key ALEmailReader Email            = E0-0x6c
-def key ALConsumerControlConfiguration = E0-0x6d # (N/A) Media Player
-
-
-
-
-
-# def overflow                         =    0xff # overflow (ignore)
-
-def sync                               =    0x7e # scan code used by &Sync
-
-def mod Shift  = LShift RShift
-def mod Alt    = LAlt RAlt
-def mod Control        = LControl RControl
-def mod Windows        = LWindows RWindows
-mod shift += E0RShift
-key *E0RShift = *RShift
-
-
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# define some key sequence
-#
-
-keyseq $ToggleIME              = A-BackQuote
-keyseq $CapsLock               = CapsLock
-
-keyseq $SPACE                  = ~S-*Space                     #  
-keyseq $EXCLAMATION_MARK       =  S-*_1                        # !
-keyseq $QUOTATION_MARK         =  S-*Apostrophe                # "
-keyseq $NUMBER_SIGN            =  S-*_3                        # #
-keyseq $DOLLAR_SIGN            =  S-*_4                        # $
-keyseq $PERCENT_SIGN           =  S-*_5                        # %
-keyseq $AMPERSAND              =  S-*_7                        # &
-keyseq $APOSTROPHE             = ~S-*Apostrophe                # '
-keyseq $LEFT_PARENTHESIS       =  S-*_9                        # (
-keyseq $RIGHT_PARENTHESIS      =  S-*_0                        # )
-keyseq $ASTERISK               =  S-*_8                        # *
-keyseq $PLUS_SIGN              =  S-*EqualsSign                # +
-keyseq $COMMA                  = ~S-*Comma                     # ,
-keyseq $HYPHEN-MINUS           = ~S-*HyphenMinus               # -
-keyseq $FULL_STOP              = ~S-*FullStop                  # .
-keyseq $SOLIDUS                        = ~S-*Solidus                   # /
-keyseq $DIGIT_ZERO             = ~S-*_0                        # 0
-keyseq $DIGIT_ONE              = ~S-*_1                        # 1
-keyseq $DIGIT_TWO              = ~S-*_2                        # 2
-keyseq $DIGIT_THREE            = ~S-*_3                        # 3
-keyseq $DIGIT_FOUR             = ~S-*_4                        # 4
-keyseq $DIGIT_FIVE             = ~S-*_5                        # 5
-keyseq $DIGIT_SIX              = ~S-*_6                        # 6
-keyseq $DIGIT_SEVEN            = ~S-*_7                        # 7
-keyseq $DIGIT_EIGHT            = ~S-*_8                        # 8
-keyseq $DIGIT_NINE             = ~S-*_9                        # 9
-keyseq $COLON                  =  S-*Semicolon                 # :
-keyseq $SEMICOLON              = ~S-*Semicolon                 # ;
-keyseq $LESS-THAN_SIGN         =  S-*Comma                     # <
-keyseq $EQUALS_SIGN            = ~S-*EqualsSign                # =
-keyseq $GREATER-THAN_SIGN      =  S-*FullStop                  # >
-keyseq $QUESTION_MARK          =  S-*Solidus                   # ?
-keyseq $COMMERCIAL_AT          =  S-*_2                        # @
-keyseq $LATIN_CAPITAL_LETTER_A =  S-*A                         # A
-keyseq $LATIN_CAPITAL_LETTER_B =  S-*B                         # B
-keyseq $LATIN_CAPITAL_LETTER_C =  S-*C                         # C
-keyseq $LATIN_CAPITAL_LETTER_D =  S-*D                         # D
-keyseq $LATIN_CAPITAL_LETTER_E =  S-*E                         # E
-keyseq $LATIN_CAPITAL_LETTER_F =  S-*F                         # F
-keyseq $LATIN_CAPITAL_LETTER_G =  S-*G                         # G
-keyseq $LATIN_CAPITAL_LETTER_H =  S-*H                         # H
-keyseq $LATIN_CAPITAL_LETTER_I =  S-*I                         # I
-keyseq $LATIN_CAPITAL_LETTER_J =  S-*J                         # J
-keyseq $LATIN_CAPITAL_LETTER_K =  S-*K                         # K
-keyseq $LATIN_CAPITAL_LETTER_L =  S-*L                         # L
-keyseq $LATIN_CAPITAL_LETTER_M =  S-*M                         # M
-keyseq $LATIN_CAPITAL_LETTER_N =  S-*N                         # N
-keyseq $LATIN_CAPITAL_LETTER_O =  S-*O                         # O
-keyseq $LATIN_CAPITAL_LETTER_P =  S-*P                         # P
-keyseq $LATIN_CAPITAL_LETTER_Q =  S-*Q                         # Q
-keyseq $LATIN_CAPITAL_LETTER_R =  S-*R                         # R
-keyseq $LATIN_CAPITAL_LETTER_S =  S-*S                         # S
-keyseq $LATIN_CAPITAL_LETTER_T =  S-*T                         # T
-keyseq $LATIN_CAPITAL_LETTER_U =  S-*U                         # U
-keyseq $LATIN_CAPITAL_LETTER_V =  S-*V                         # V
-keyseq $LATIN_CAPITAL_LETTER_W =  S-*W                         # W
-keyseq $LATIN_CAPITAL_LETTER_X =  S-*X                         # X
-keyseq $LATIN_CAPITAL_LETTER_Y =  S-*Y                         # Y
-keyseq $LATIN_CAPITAL_LETTER_Z =  S-*Z                         # Z
-keyseq $LEFT_SQUARE_BRACKET    = ~S-*LeftSquareBracket         # [
-keyseq $REVERSE_SOLIDUS                = ~S-*ReverseSolidus            # \
-keyseq $RIGHT_SQUARE_BRACKET   = ~S-*RightSquareBracket        # ]
-keyseq $CIRCUMFLEX_ACCENT      =  S-*_6                        # ^
-keyseq $LOW_LINE               =  S-*HyphenMinus               # _
-keyseq $GRAVE_ACCENT           = ~S-*GraveAccent               # `
-keyseq $LATIN_SMALL_LETTER_A   = ~S-*A                         # a
-keyseq $LATIN_SMALL_LETTER_B   = ~S-*B                         # b
-keyseq $LATIN_SMALL_LETTER_C   = ~S-*C                         # c
-keyseq $LATIN_SMALL_LETTER_D   = ~S-*D                         # d
-keyseq $LATIN_SMALL_LETTER_E   = ~S-*E                         # e
-keyseq $LATIN_SMALL_LETTER_F   = ~S-*F                         # f
-keyseq $LATIN_SMALL_LETTER_G   = ~S-*G                         # g
-keyseq $LATIN_SMALL_LETTER_H   = ~S-*H                         # h
-keyseq $LATIN_SMALL_LETTER_I   = ~S-*I                         # i
-keyseq $LATIN_SMALL_LETTER_J   = ~S-*J                         # j
-keyseq $LATIN_SMALL_LETTER_K   = ~S-*K                         # k
-keyseq $LATIN_SMALL_LETTER_L   = ~S-*L                         # l
-keyseq $LATIN_SMALL_LETTER_M   = ~S-*M                         # m
-keyseq $LATIN_SMALL_LETTER_N   = ~S-*N                         # n
-keyseq $LATIN_SMALL_LETTER_O   = ~S-*O                         # o
-keyseq $LATIN_SMALL_LETTER_P   = ~S-*P                         # p
-keyseq $LATIN_SMALL_LETTER_Q   = ~S-*Q                         # q
-keyseq $LATIN_SMALL_LETTER_R   = ~S-*R                         # r
-keyseq $LATIN_SMALL_LETTER_S   = ~S-*S                         # s
-keyseq $LATIN_SMALL_LETTER_T   = ~S-*T                         # t
-keyseq $LATIN_SMALL_LETTER_U   = ~S-*U                         # u
-keyseq $LATIN_SMALL_LETTER_V   = ~S-*V                         # v
-keyseq $LATIN_SMALL_LETTER_W   = ~S-*W                         # w
-keyseq $LATIN_SMALL_LETTER_X   = ~S-*X                         # x
-keyseq $LATIN_SMALL_LETTER_Y   = ~S-*Y                         # y
-keyseq $LATIN_SMALL_LETTER_Z   = ~S-*Z                         # z
-keyseq $LEFT_CURLY_BRACKET     =  S-*LeftSquareBracket         # {
-keyseq $VERTICAL_LINE          =  S-*ReverseSolidus            # |
-keyseq $RIGHT_CURLY_BRACKET    =  S-*RightSquareBracket        # }
-keyseq $TILDE                  =  S-*GraveAccent               # ~
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# MADO TSUKAI NO YUUTSU - 104.mayu\r
+# Copyright (C) 1999-2005, TAGA Nayuta <nayuta@users.sourceforge.net>\r
+#\r
+\r
+define KBD101\r
+define KBD102\r
+define KBD104\r
+define KBD105\r
+define KBD107\r
+define KBD108\r
+\r
+\r
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# 101/102/104/105/107/108 US keyboard definition\r
+#\r
+\r
+def key Esc Escape                     =    0x01\r
+def key _1                             =    0x02 # 1!\r
+def key _2                             =    0x03 # 2@\r
+def key _3                             =    0x04 # 3#\r
+def key _4                             =    0x05 # 4$\r
+def key _5                             =    0x06 # 5%\r
+def key _6                             =    0x07 # 6^\r
+def key _7                             =    0x08 # 7&\r
+def key _8                             =    0x09 # 8*\r
+def key _9                             =    0x0a # 9(\r
+def key _0                             =    0x0b # 0)\r
+def key HyphenMinus Hyphen Minus       =    0x0c # -_\r
+def key EqualsSign Equal               =    0x0d # =+\r
+def key BackSpace BS Back              =    0x0e\r
+def key Tab                            =    0x0f\r
+def key Q                              =    0x10\r
+def key ScanPreviousTrack PreviousTrack        = E0-0x10 # (Media Player)\r
+def key W                              =    0x11\r
+def key E                              =    0x12\r
+def key R                              =    0x13\r
+def key T                              =    0x14\r
+def key Y                              =    0x15\r
+def key U                              =    0x16\r
+def key I                              =    0x17\r
+def key O                              =    0x18\r
+def key P                              =    0x19\r
+def key ScanNextTrack NextTrack                = E0-0x19 # (Media Player)\r
+def key LeftSquareBracket OpenBracket  =    0x1a # [{\r
+def key RightSquareBracket CloseBracket        =    0x1b # ]}\r
+def key Enter Return                   =    0x1c\r
+def key NumEnter NumReturn             = E0-0x1c\r
+def key LeftControl LControl LCtrl     =    0x1d\r
+def key RightControl RControl RCtrl    = E0-0x1d\r
+def key Pause                          = E1-0x1d 0x45 # Pause\r
+def key A                              =    0x1e\r
+def key S                              =    0x1f\r
+def key D                              =    0x20\r
+def key Mute                           = E0-0x20 # (Media Player)\r
+def key F                              =    0x21\r
+def key ALCalculator                   = E0-0x21 # (N/A) Calculator \r
+def key G                              =    0x22\r
+def key Play/Pause                     = E0-0x22 # (Media Player)\r
+def key H                              =    0x23\r
+def key J                              =    0x24\r
+def key Stop                           = E0-0x24 # (Media Player)\r
+def key K                              =    0x25\r
+def key L                              =    0x26\r
+def key Semicolon                      =    0x27 # ;:\r
+def key Apostrophe Quote               =    0x28 # '"\r
+def key GraveAccent BackQuote          =    0x29 # `~\r
+def key LeftShift LShift               =    0x2a\r
+# def ignore                           = E0-0x2a # what is this? (ignore)\r
+def key ReverseSolidus BackSlash       =    0x2b # \|\r
+def key Z                              =    0x2c\r
+def key X                              =    0x2d\r
+def key C                              =    0x2e\r
+def key VolumeDecrement VolumeDown     = E0-0x2e\r
+def key V                              =    0x2f\r
+def key B                              =    0x30\r
+def key VolumeIncrement VolumeUp       = E0-0x30\r
+def key N                              =    0x31\r
+def key M                              =    0x32\r
+def key ACHome Internet                        = E0-0x32 # (Internet Explorer)\r
+def key Comma                          =    0x33 # ,<\r
+def key FullStop Period                        =    0x34 # .>\r
+def key Solidus Slash                  =    0x35 # /?\r
+def key NumSolidus NumSlash            = E0-0x35 # Numpad /\r
+def key RightShift RShift              =    0x36\r
+def key E0RightShift E0RShift          = E0-0x36\r
+def key NumAsterisk NumMultiply                =    0x37 # Numpad *\r
+def key PrintScreen Snapshot           = E0-0x37\r
+def key LeftAlt LAlt LMenu             =    0x38\r
+def key RightAlt RAlt RMenu            = E0-0x38\r
+def key Space                          =    0x39\r
+def key CapsLock Capital Caps          =    0x3a # CapsLock\r
+def key F1                             =    0x3b\r
+def key F2                             =    0x3c\r
+def key F3                             =    0x3d\r
+def key F4                             =    0x3e\r
+def key F5                             =    0x3f\r
+def key F6                             =    0x40\r
+def key F7                             =    0x41\r
+def key F8                             =    0x42\r
+def key F9                             =    0x43\r
+def key F10                            =    0x44\r
+def key NumLock                                =    0x45\r
+def key ScrollLock Scroll              =    0x46\r
+def key Break                          = E0-0x46 # Break\r
+def key Num7                           =    0x47 # Numpad 7\r
+def key Home                           = E0-0x47\r
+def key Num8                           =    0x48 # Numpad 8\r
+def key Up                             = E0-0x48\r
+def key Num9                           =    0x49 # Numpad 9\r
+def key PageUp Prior                   = E0-0x49\r
+def key NumHyphenMinus NumMinus                =    0x4a # Numpad -\r
+def key Num4                           =    0x4b # Numpad 4\r
+def key Left                           = E0-0x4b\r
+def key Num5                           =    0x4c # Numpad 5\r
+def key Num6                           =    0x4d # Numpad 6\r
+def key Right                          = E0-0x4d\r
+def key NumPlusSign NumPlus            =    0x4e # Numpad +\r
+def key Num1                           =    0x4f # Numpad 1\r
+def key End                            = E0-0x4f\r
+def key Num2                           =    0x50\r
+def key Down                           = E0-0x50\r
+def key Num3                           =    0x51\r
+def key PageDown Next                  = E0-0x51\r
+def key Num0                           =    0x52\r
+def key Insert                         = E0-0x52\r
+def key NumFullStop NumPeriod          =    0x53 # Numpad .\r
+def key Delete Del                     = E0-0x53\r
+def key SysRq                          =    0x54\r
+def key Less                           =    0x56 # < >\r
+def key F11                            =    0x57\r
+def key F12                            =    0x58\r
+def key LeftWindows LWindows LWin      = E0-0x5b\r
+def key RightWindows RWindows RWin     = E0-0x5c\r
+def key Applications Apps              = E0-0x5d\r
+def key PowerOff                       = E0-0x5e # Power off    (107 keyboard)\r
+def key Sleep                          = E0-0x5f # Sleep        (107 keyboard)\r
+def key WakeUp                         = E0-0x63 # Wake up      (107 keyboard)\r
+def key ACSearch                       = E0-0x65 # (Internet Explorer)\r
+def key ACBookmarks                    = E0-0x66 # (Internet Explorer)\r
+def key ACRefresh                      = E0-0x67 # (Internet Explorer)\r
+def key ACStop                         = E0-0x68 # (Internet Explorer)\r
+def key ACForward                      = E0-0x69 # (Internet Explorer)\r
+def key ACBack                         = E0-0x6a # (Internet Explorer)\r
+def key ALLocalBrowser                 = E0-0x6b # (N/A) My Computer \r
+def key ALEmailReader Email            = E0-0x6c\r
+def key ALConsumerControlConfiguration = E0-0x6d # (N/A) Media Player\r
+\r
+\r
+\r
+\r
+\r
+# def overflow                         =    0xff # overflow (ignore)\r
+\r
+def sync                               =    0x7e # scan code used by &Sync\r
+\r
+def mod Shift  = LShift RShift\r
+def mod Alt    = LAlt RAlt\r
+def mod Control        = LControl RControl\r
+def mod Windows        = LWindows RWindows\r
+mod shift += E0RShift\r
+key *E0RShift = *RShift\r
+\r
+\r
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# define some key sequence\r
+#\r
+\r
+keyseq $ToggleIME              = A-BackQuote\r
+keyseq $CapsLock               = CapsLock\r
+\r
+keyseq $SPACE                  = ~S-*Space                     #  \r
+keyseq $EXCLAMATION_MARK       =  S-*_1                        # !\r
+keyseq $QUOTATION_MARK         =  S-*Apostrophe                # "\r
+keyseq $NUMBER_SIGN            =  S-*_3                        # #\r
+keyseq $DOLLAR_SIGN            =  S-*_4                        # $\r
+keyseq $PERCENT_SIGN           =  S-*_5                        # %\r
+keyseq $AMPERSAND              =  S-*_7                        # &\r
+keyseq $APOSTROPHE             = ~S-*Apostrophe                # '\r
+keyseq $LEFT_PARENTHESIS       =  S-*_9                        # (\r
+keyseq $RIGHT_PARENTHESIS      =  S-*_0                        # )\r
+keyseq $ASTERISK               =  S-*_8                        # *\r
+keyseq $PLUS_SIGN              =  S-*EqualsSign                # +\r
+keyseq $COMMA                  = ~S-*Comma                     # ,\r
+keyseq $HYPHEN-MINUS           = ~S-*HyphenMinus               # -\r
+keyseq $FULL_STOP              = ~S-*FullStop                  # .\r
+keyseq $SOLIDUS                        = ~S-*Solidus                   # /\r
+keyseq $DIGIT_ZERO             = ~S-*_0                        # 0\r
+keyseq $DIGIT_ONE              = ~S-*_1                        # 1\r
+keyseq $DIGIT_TWO              = ~S-*_2                        # 2\r
+keyseq $DIGIT_THREE            = ~S-*_3                        # 3\r
+keyseq $DIGIT_FOUR             = ~S-*_4                        # 4\r
+keyseq $DIGIT_FIVE             = ~S-*_5                        # 5\r
+keyseq $DIGIT_SIX              = ~S-*_6                        # 6\r
+keyseq $DIGIT_SEVEN            = ~S-*_7                        # 7\r
+keyseq $DIGIT_EIGHT            = ~S-*_8                        # 8\r
+keyseq $DIGIT_NINE             = ~S-*_9                        # 9\r
+keyseq $COLON                  =  S-*Semicolon                 # :\r
+keyseq $SEMICOLON              = ~S-*Semicolon                 # ;\r
+keyseq $LESS-THAN_SIGN         =  S-*Comma                     # <\r
+keyseq $EQUALS_SIGN            = ~S-*EqualsSign                # =\r
+keyseq $GREATER-THAN_SIGN      =  S-*FullStop                  # >\r
+keyseq $QUESTION_MARK          =  S-*Solidus                   # ?\r
+keyseq $COMMERCIAL_AT          =  S-*_2                        # @\r
+keyseq $LATIN_CAPITAL_LETTER_A =  S-*A                         # A\r
+keyseq $LATIN_CAPITAL_LETTER_B =  S-*B                         # B\r
+keyseq $LATIN_CAPITAL_LETTER_C =  S-*C                         # C\r
+keyseq $LATIN_CAPITAL_LETTER_D =  S-*D                         # D\r
+keyseq $LATIN_CAPITAL_LETTER_E =  S-*E                         # E\r
+keyseq $LATIN_CAPITAL_LETTER_F =  S-*F                         # F\r
+keyseq $LATIN_CAPITAL_LETTER_G =  S-*G                         # G\r
+keyseq $LATIN_CAPITAL_LETTER_H =  S-*H                         # H\r
+keyseq $LATIN_CAPITAL_LETTER_I =  S-*I                         # I\r
+keyseq $LATIN_CAPITAL_LETTER_J =  S-*J                         # J\r
+keyseq $LATIN_CAPITAL_LETTER_K =  S-*K                         # K\r
+keyseq $LATIN_CAPITAL_LETTER_L =  S-*L                         # L\r
+keyseq $LATIN_CAPITAL_LETTER_M =  S-*M                         # M\r
+keyseq $LATIN_CAPITAL_LETTER_N =  S-*N                         # N\r
+keyseq $LATIN_CAPITAL_LETTER_O =  S-*O                         # O\r
+keyseq $LATIN_CAPITAL_LETTER_P =  S-*P                         # P\r
+keyseq $LATIN_CAPITAL_LETTER_Q =  S-*Q                         # Q\r
+keyseq $LATIN_CAPITAL_LETTER_R =  S-*R                         # R\r
+keyseq $LATIN_CAPITAL_LETTER_S =  S-*S                         # S\r
+keyseq $LATIN_CAPITAL_LETTER_T =  S-*T                         # T\r
+keyseq $LATIN_CAPITAL_LETTER_U =  S-*U                         # U\r
+keyseq $LATIN_CAPITAL_LETTER_V =  S-*V                         # V\r
+keyseq $LATIN_CAPITAL_LETTER_W =  S-*W                         # W\r
+keyseq $LATIN_CAPITAL_LETTER_X =  S-*X                         # X\r
+keyseq $LATIN_CAPITAL_LETTER_Y =  S-*Y                         # Y\r
+keyseq $LATIN_CAPITAL_LETTER_Z =  S-*Z                         # Z\r
+keyseq $LEFT_SQUARE_BRACKET    = ~S-*LeftSquareBracket         # [\r
+keyseq $REVERSE_SOLIDUS                = ~S-*ReverseSolidus            # \\r
+keyseq $RIGHT_SQUARE_BRACKET   = ~S-*RightSquareBracket        # ]\r
+keyseq $CIRCUMFLEX_ACCENT      =  S-*_6                        # ^\r
+keyseq $LOW_LINE               =  S-*HyphenMinus               # _\r
+keyseq $GRAVE_ACCENT           = ~S-*GraveAccent               # `\r
+keyseq $LATIN_SMALL_LETTER_A   = ~S-*A                         # a\r
+keyseq $LATIN_SMALL_LETTER_B   = ~S-*B                         # b\r
+keyseq $LATIN_SMALL_LETTER_C   = ~S-*C                         # c\r
+keyseq $LATIN_SMALL_LETTER_D   = ~S-*D                         # d\r
+keyseq $LATIN_SMALL_LETTER_E   = ~S-*E                         # e\r
+keyseq $LATIN_SMALL_LETTER_F   = ~S-*F                         # f\r
+keyseq $LATIN_SMALL_LETTER_G   = ~S-*G                         # g\r
+keyseq $LATIN_SMALL_LETTER_H   = ~S-*H                         # h\r
+keyseq $LATIN_SMALL_LETTER_I   = ~S-*I                         # i\r
+keyseq $LATIN_SMALL_LETTER_J   = ~S-*J                         # j\r
+keyseq $LATIN_SMALL_LETTER_K   = ~S-*K                         # k\r
+keyseq $LATIN_SMALL_LETTER_L   = ~S-*L                         # l\r
+keyseq $LATIN_SMALL_LETTER_M   = ~S-*M                         # m\r
+keyseq $LATIN_SMALL_LETTER_N   = ~S-*N                         # n\r
+keyseq $LATIN_SMALL_LETTER_O   = ~S-*O                         # o\r
+keyseq $LATIN_SMALL_LETTER_P   = ~S-*P                         # p\r
+keyseq $LATIN_SMALL_LETTER_Q   = ~S-*Q                         # q\r
+keyseq $LATIN_SMALL_LETTER_R   = ~S-*R                         # r\r
+keyseq $LATIN_SMALL_LETTER_S   = ~S-*S                         # s\r
+keyseq $LATIN_SMALL_LETTER_T   = ~S-*T                         # t\r
+keyseq $LATIN_SMALL_LETTER_U   = ~S-*U                         # u\r
+keyseq $LATIN_SMALL_LETTER_V   = ~S-*V                         # v\r
+keyseq $LATIN_SMALL_LETTER_W   = ~S-*W                         # w\r
+keyseq $LATIN_SMALL_LETTER_X   = ~S-*X                         # x\r
+keyseq $LATIN_SMALL_LETTER_Y   = ~S-*Y                         # y\r
+keyseq $LATIN_SMALL_LETTER_Z   = ~S-*Z                         # z\r
+keyseq $LEFT_CURLY_BRACKET     =  S-*LeftSquareBracket         # {\r
+keyseq $VERTICAL_LINE          =  S-*ReverseSolidus            # |\r
+keyseq $RIGHT_CURLY_BRACKET    =  S-*RightSquareBracket        # }\r
+keyseq $TILDE                  =  S-*GraveAccent               # ~\r
index ad9479a..ce2416b 100755 (executable)
@@ -1,41 +1,41 @@
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \91\8b\8eg\82¢\82Ì\97J\9fT - 104on109.mayu
-# Copyright (C) 1999-2005, TAGA Nayuta <nayuta@users.sourceforge.net>
-#
-
-define KBD104on109
-
-def subst ~S-*\94¼\8ap/\91S\8ap                = $GRAVE_ACCENT
-def subst  S-*\94¼\8ap/\91S\8ap                = $TILDE
-def subst  A-\94¼\8ap/\91S\8ap         = $ToggleIME
-def subst ~S-*E0\94¼\8ap/\91S\8ap      = $GRAVE_ACCENT
-def subst  S-*E0\94¼\8ap/\91S\8ap      = $TILDE
-def subst  A-E0\94¼\8ap/\91S\8ap       = $ToggleIME
-def subst  S-*_2               = $COMMERCIAL_AT
-def subst  S-*_6               = $CIRCUMFLEX_ACCENT
-def subst  S-*_7               = $AMPERSAND
-def subst  S-*_8               = $ASTERISK
-def subst  S-*_9               = $LEFT_PARENTHESIS
-def subst  S-*_0               = $RIGHT_PARENTHESIS
-def subst  S-*Hyphen           = $LOW_LINE
-def subst ~S-*Caret            = $EQUALS_SIGN
-def subst  S-*Caret            = $PLUS_SIGN
-def subst ~S-*Atmark           = $LEFT_SQUARE_BRACKET
-def subst  S-*Atmark           = $LEFT_CURLY_BRACKET
-def subst ~S-*OpenBracket      = $RIGHT_SQUARE_BRACKET
-def subst  S-*OpenBracket      = $RIGHT_CURLY_BRACKET
-def subst ~S-*CloseBracket     = $REVERSE_SOLIDUS
-def subst  S-*CloseBracket     = $VERTICAL_LINE
-def subst  S-*Semicolon                = $COLON
-def subst ~S-*Colon            = $APOSTROPHE
-def subst  S-*Colon            = $QUOTATION_MARK
-def subst    *\96³\95Ï\8a·           = *Space
-def subst    *\95Ï\8a·             = *Space
-def subst    *\82Ð\82ç\82ª\82È         = *Space
-def subst    *\89p\90\94             = S-*\89p\90\94
-def subst    *E0\82Ð\82ç\82ª\82È       = *Space
-def subst    *E0\89p\90\94           = S-*\89p\90\94
-def subst *ReverseSolidus      = *RightShift
-
-keymap Global
- mod shift += ReverseSolidus
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# \91\8b\8eg\82¢\82Ì\97J\9fT - 104on109.mayu\r
+# Copyright (C) 1999-2005, TAGA Nayuta <nayuta@users.sourceforge.net>\r
+#\r
+\r
+define KBD104on109\r
+\r
+def subst ~S-*\94¼\8ap/\91S\8ap                = $GRAVE_ACCENT\r
+def subst  S-*\94¼\8ap/\91S\8ap                = $TILDE\r
+def subst  A-\94¼\8ap/\91S\8ap         = $ToggleIME\r
+def subst ~S-*E0\94¼\8ap/\91S\8ap      = $GRAVE_ACCENT\r
+def subst  S-*E0\94¼\8ap/\91S\8ap      = $TILDE\r
+def subst  A-E0\94¼\8ap/\91S\8ap       = $ToggleIME\r
+def subst  S-*_2               = $COMMERCIAL_AT\r
+def subst  S-*_6               = $CIRCUMFLEX_ACCENT\r
+def subst  S-*_7               = $AMPERSAND\r
+def subst  S-*_8               = $ASTERISK\r
+def subst  S-*_9               = $LEFT_PARENTHESIS\r
+def subst  S-*_0               = $RIGHT_PARENTHESIS\r
+def subst  S-*Hyphen           = $LOW_LINE\r
+def subst ~S-*Caret            = $EQUALS_SIGN\r
+def subst  S-*Caret            = $PLUS_SIGN\r
+def subst ~S-*Atmark           = $LEFT_SQUARE_BRACKET\r
+def subst  S-*Atmark           = $LEFT_CURLY_BRACKET\r
+def subst ~S-*OpenBracket      = $RIGHT_SQUARE_BRACKET\r
+def subst  S-*OpenBracket      = $RIGHT_CURLY_BRACKET\r
+def subst ~S-*CloseBracket     = $REVERSE_SOLIDUS\r
+def subst  S-*CloseBracket     = $VERTICAL_LINE\r
+def subst  S-*Semicolon                = $COLON\r
+def subst ~S-*Colon            = $APOSTROPHE\r
+def subst  S-*Colon            = $QUOTATION_MARK\r
+def subst    *\96³\95Ï\8a·           = *Space\r
+def subst    *\95Ï\8a·             = *Space\r
+def subst    *\82Ð\82ç\82ª\82È         = *Space\r
+def subst    *\89p\90\94             = S-*\89p\90\94\r
+def subst    *E0\82Ð\82ç\82ª\82È       = *Space\r
+def subst    *E0\89p\90\94           = S-*\89p\90\94\r
+def subst *ReverseSolidus      = *RightShift\r
+\r
+keymap Global\r
+ mod shift += ReverseSolidus\r
index 89ab1fb..031b153 100755 (executable)
--- a/109.mayu
+++ b/109.mayu
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \91\8b\8eg\82¢\82Ì\97J\9fT - 109.mayu
-# Copyright (C) 1999-2005, TAGA Nayuta <nayuta@users.sourceforge.net>
-#
-
-define KBD106
-define KBD109
-define KBD112
-
-
-
-
-
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# 109 \93ú\96{\8cê\83L\81[\83{\81[\83h\92è\8b`
-#
-
-def key Esc Escape                     =    0x01
-def key _1                             =    0x02 # 1!
-def key _2                             =    0x03 # 2"
-def key _3                             =    0x04 # 3#
-def key _4                             =    0x05 # 4$
-def key _5                             =    0x06 # 5%
-def key _6                             =    0x07 # 6&
-def key _7                             =    0x08 # 7'
-def key _8                             =    0x09 # 8(
-def key _9                             =    0x0a # 9)
-def key _0                             =    0x0b # 0
-def key HyphenMinus Hyphen Minus       =    0x0c # -=
-def key CircumflexAccent Caret         =    0x0d # ^~
-def key BackSpace BS Back              =    0x0e
-def key Tab                            =    0x0f
-def key Q                              =    0x10
-def key W                              =    0x11
-def key E                              =    0x12
-def key R                              =    0x13
-def key T                              =    0x14
-def key Y                              =    0x15
-def key U                              =    0x16
-def key I                              =    0x17
-def key O                              =    0x18
-def key P                              =    0x19
-def key CommercialAt Atmark            =    0x1a # @`
-def key LeftSquareBracket OpenBracket  =    0x1b # [{
-def key Enter Return                   =    0x1c
-def key LeftControl LControl LCtrl     =    0x1d
-def key A                              =    0x1e
-def key S                              =    0x1f
-def key D                              =    0x20
-def key F                              =    0x21
-def key G                              =    0x22
-def key H                              =    0x23
-def key J                              =    0x24
-def key K                              =    0x25
-def key L                              =    0x26
-def key Semicolon                      =    0x27 # ;+
-def key Colon                          =    0x28 # :*
-def key \94¼\8ap/\91S\8a\8a¿\8e\9a Kanji           =    0x29 # \94¼\8ap/\91S\8a\8a¿\8e\9a
-def key E0\94¼\8ap/\91S\8ap E0\8a¿\8e\9a E0Kanji     = E0-0x29 # \94¼\8ap/\91S\8a\8a¿\8e\9a
-def key LeftShift LShift               =    0x2a
-def key RightSquareBracket CloseBracket        =    0x2b # ]}
-def key Z                              =    0x2c
-def key X                              =    0x2d
-def key C                              =    0x2e
-def key V                              =    0x2f
-def key B                              =    0x30
-def key N                              =    0x31
-def key M                              =    0x32
-def key Comma                          =    0x33 # ,<
-def key FullStop Period                        =    0x34 # .>
-def key Solidus Slash                  =    0x35 # /?
-def key RightShift RShift              =    0x36
-def key E0RightShift E0RShift          = E0-0x36
-def key NumAsterisk NumMultiply                =    0x37 # \83e\83\93\83L\81[ *
-def key LeftAlt LAlt LMenu             =    0x38
-def key Space                          =    0x39
-def key \89p\90\94 Eisuu                     =    0x3a # \89p\90\94 CapsLock \8a¿\8e\9a\94Ô\8d\86
-def key E0\89p\90\94 E0Eisuu                 = E0-0x3a # \89p\90\94 CapsLock \8a¿\8e\9a\94Ô\8d\86
-def key F1                             =    0x3b
-def key F2                             =    0x3c
-def key F3                             =    0x3d
-def key F4                             =    0x3e
-def key F5                             =    0x3f
-def key F6                             =    0x40
-def key F7                             =    0x41
-def key F8                             =    0x42
-def key F9                             =    0x43
-def key F10                            =    0x44
-def key NumLock                                =    0x45
-def key ScrollLock Scroll              =    0x46
-def key Num7                           =    0x47 # \83e\83\93\83L\81[ 7
-def key Num8                           =    0x48 # \83e\83\93\83L\81[ 8
-def key Num9                           =    0x49 # \83e\83\93\83L\81[ 9
-
-def key NumHyphenMinus NumMinus                =    0x4a # \83e\83\93\83L\81[ -
-def key Num4                           =    0x4b # \83e\83\93\83L\81[ 4
-def key Num5                           =    0x4c # \83e\83\93\83L\81[ 5
-def key Num6                           =    0x4d # \83e\83\93\83L\81[ 6
-def key NumPlusSign NumPlus            =    0x4e # \83e\83\93\83L\81[ +
-def key Num1                           =    0x4f # \83e\83\93\83L\81[ 1
-def key Num2                           =    0x50
-def key Num3                           =    0x51
-def key Num0                           =    0x52
-def key NumFullStop NumPeriod          =    0x53 # \83e\83\93\83L\81[ .
-def key SysRq                          =    0x54
-
-def key F11                            =    0x57
-def key F12                            =    0x58
-
-def key \82Ð\82ç\82ª\82È Hiragana              =    0x70 # \82Ð\82ç\82ª\82È \83J\83^\83J\83\83\8d\81[\83}\8e\9a
-def key E0\82Ð\82ç\82ª\82È E0Hiragana          = E0-0x70 # \82Ð\82ç\82ª\82È \83J\83^\83J\83\83\8d\81[\83}\8e\9a
-
-def key ReverseSolidus BackSlash       =    0x73 # \81__
-
-def key \95Ï\8a· Convert                   =    0x79 # \95Ï\8a·(\8e\9f\8có\95â) \91O\8có\95â \91S\8có\95â
-
-def key \96³\95Ï\8a· NonConvert              =    0x7b # \96³\95Ï\8a·
-
-def key YenSign Yen                    =    0x7d # \|
-
-def key MM/Messanger                   = E0-0x05 # (MultiMedia Keyboard) \83\81\83b\83Z\83\93\83W\83\83\81[
-
-def key MM/Undo        MM/F2                   = E0-0x08 # (MultiMedia Keyboard) F2 \8c³\82É\96ß\82·
-def key MM/Redo        MM/F3                   = E0-0x07 # (MultiMedia Keyboard) F3 \82â\82è\92¼\82µ
-
-def key MediaPrevTrack ScanPreviousTrack PreviousTrack \
-                                       = E0-0x10 # (MultiMedia Keyboard) |<<
-def key VAIO/TV/VIDEO                  = E0-0x11 # (Vaio) TV/VIDEO
-def key VAIO/TIMER-REC                 = E0-0x12 # (Vaio) TIMER REC
-def key VAIO/DV-CAPTURE                        = E0-0x13 # (Vaio) DV CAPTURE
-def key VAIO/VIDEO-EDIT                        = E0-0x14 # (Vaio) VIDEO EDIT
-def key VAIO/MAIL                      = E0-0x15 # (Vaio) MAIL
-def key VAIO/INTERNET                  = E0-0x16 # (Vaio) INTERNET
-def key MediaNextTrack ScanNextTrack NextTrack \
-                                       = E0-0x19 # (MultiMedia Keyboard) >>|
-
-def key NumEnter NumReturn             = E0-0x1c
-def key RightControl RControl RCtrl    = E0-0x1d
-
-def key VolumeMute Mute                        = E0-0x20 # (MultiMedia Keyboard)
-def key MM/Calculator ALCalculator     = E0-0x21 # (MultiMedia Keyboard) \93d\91ì
-
-def key MediaPlayPause Play/Pause      = E0-0x22 # (MultiMedia Keyboard) > / ||
-def key MM/SpellCheck  MM/F10          = E0-0x23 # (MultiMedia Keyboard) F10 \83X\83y\83\8b\83`\83F\83b\83N
-def key MediaStop Stop                 = E0-0x24 # (MultiMedia Keyboard) \81¡
-
-# def ignore                           = E0-0x2a # \82È\82É\82±\82ê (\96³\8e\8b)
-
-def key VolumeDown VolumeDecrement     = E0-0x2e # (MultiMedia Keyboard) -
-
-def key VolumeUp VolumeIncrement       = E0-0x30 # (MultiMedia Keyboard) +
-
-def key BrowserHome ACHome Internet    = E0-0x32 # (MultiMedia Keyboard) \83z\81[\83\80
-
-def key NumSolidus NumSlash            = E0-0x35 # \83e\83\93\83L\81[ /
-
-def key PrintScreen Snapshot           = E0-0x37
-def key RightAlt RAlt RMenu            = E0-0x38
-
-def key MM/Help                MM/F1           = E0-0x3b # (MultiMedia Keyboard) F1 \83w\83\8b\83v
-def key MM/MyMusic                     = E0-0x3c # (MultiMedia Keyboard) \83}\83C\83~\83\85\81[\83W\83b\83N
-
-def key MM/New         MM/F4           = E0-0x3e # (MultiMedia Keyboard) F4 \90V\8bK\8dì\90¬
-def key MM/Open                MM/F5           = E0-0x3f # (MultiMedia Keyboard) F5 \8aJ\82­
-def key MM/Close       MM/F6           = E0-0x40 # (MultiMedia Keyboard) F6 \95Â\82\82é
-def key MM/Reply       MM/F7           = E0-0x41 # (MultiMedia Keyboard) F7 \95Ô\90M
-def key MM/Forward     MM/F8           = E0-0x42 # (MultiMedia Keyboard) F8 \93]\91\97
-def key MM/Send                MM/F9           = E0-0x43 # (MultiMedia Keyboard) F9 \91\97\90M
-
-def key Break                          = E0-0x46 # Break
-def key Home                           = E0-0x47
-def key \81ª Up                          = E0-0x48
-def key PageUp Prior                   = E0-0x49
-
-def key \81© Left                                = E0-0x4b
-def key MM/MyDocument                  = E0-0x4c # (MultiMedia Keyboard) \83}\83C\83h\83L\83\85\83\81\83\93\83g
-def key \81¨ Right                       = E0-0x4d
-
-def key End                            = E0-0x4f
-def key \81« Down                                = E0-0x50
-def key PageDown Next                  = E0-0x51
-def key Insert                         = E0-0x52
-def key Delete Del                     = E0-0x53
-
-def key MM/Save                MM/F11          = E0-0x57 # (MultiMedia Keyboard) F11 \8fã\8f\91\82«\95Û\91
-def key MM/Print       MM/F12          = E0-0x58 # (MultiMedia Keyboard) F12 \88ó\8dü
-# def ignore                           = E0-0x59 # (Wireless Keyboard) Unknown
-
-def key LeftWindows LWindows LWin      = E0-0x5b
-def key RightWindows RWindows RWin     = E0-0x5c
-def key Applications Apps              = E0-0x5d
-def key PowerOff                       = E0-0x5e # Power off  (112 \83L\81[\83{\81[\83h)
-def key Sleep                          = E0-0x5f # Sleep      (112 \83L\81[\83{\81[\83h)
-
-def key WakeUp                         = E0-0x63 # Wake up    (112 \83L\81[\83{\81[\83h)
-def key MM/MyPicture                   = E0-0x64 # (MultiMedia Keyboard) \83}\83C\83s\83N\83`\83\83
-def key BrowserSearch ACSearch         = E0-0x65 # (Internet Explorer)
-def key BrowserFavorites ACBookmarks   = E0-0x66 # (Internet Explorer)
-def key BrowserRefresh ACRefresh       = E0-0x67 # (Internet Explorer)
-def key BrowserStop ACStop             = E0-0x68 # (Internet Explorer)
-def key BrowserForward ACForward       = E0-0x69 # (Internet Explorer)
-def key BrowserBack ACBack             = E0-0x6a # (Internet Explorer)
-def key ALLocalBrowser                 = E0-0x6b # (N/A) My Computer 
-def key LaunchMail ALEmailReader Email = E0-0x6c # (MultiMedia Keyboard) \83\81\81[\83\8b
-def key LaunchMediaSelect ALConsumerControlConfiguration \
-                                       = E0-0x6d # (MultiMedia Keyboard) \83\81\83f\83B\83A
-
-def key Pause                          = E1-0x1d 0x45 # Pause
-
-# def overflow                         =    0xff # \83I\81[\83o\81[\83t\83\8d\81[ (\96³\8e\8b)
-def sync                               =    0x7e # &Sync \82Å\8eg\82¤\83X\83L\83\83\83\93\83R\81[\83h
-
-def mod Shift  = LShift RShift
-def mod Alt    = LAlt RAlt
-def mod Control        = LControl RControl
-def mod Windows        = LWindows RWindows
-mod shift += E0RShift
-key *E0RShift = *RShift
-
-
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \83L\81[\83V\81[\83P\83\93\83X\92è\8b`
-#
-
-keyseq $ToggleIME              = A-\94¼\8ap/\91S\8ap
-keyseq $CapsLock               = S-\89p\90\94
-
-keyseq $SPACE                  = ~S-*Space                     #  
-keyseq $EXCLAMATION_MARK       =  S-*_1                        # !
-keyseq $QUOTATION_MARK         =  S-*_2                        # "
-keyseq $NUMBER_SIGN            =  S-*_3                        # #
-keyseq $DOLLAR_SIGN            =  S-*_4                        # $
-keyseq $PERCENT_SIGN           =  S-*_5                        # %
-keyseq $AMPERSAND              =  S-*_6                        # &
-keyseq $APOSTROPHE             =  S-*_7                        # '
-keyseq $LEFT_PARENTHESIS       =  S-*_8                        # (
-keyseq $RIGHT_PARENTHESIS      =  S-*_9                        # )
-keyseq $ASTERISK               =  S-*Colon                     # *
-keyseq $PLUS_SIGN              =  S-*Semicolon                 # +
-keyseq $COMMA                  = ~S-*Comma                     # ,
-keyseq $HYPHEN-MINUS           = ~S-*HyphenMinus               # -
-keyseq $FULL_STOP              = ~S-*FullStop                  # .
-keyseq $SOLIDUS                        = ~S-*Solidus                   # /
-keyseq $DIGIT_ZERO             = ~S-*_0                        # 0
-keyseq $DIGIT_ONE              = ~S-*_1                        # 1
-keyseq $DIGIT_TWO              = ~S-*_2                        # 2
-keyseq $DIGIT_THREE            = ~S-*_3                        # 3
-keyseq $DIGIT_FOUR             = ~S-*_4                        # 4
-keyseq $DIGIT_FIVE             = ~S-*_5                        # 5
-keyseq $DIGIT_SIX              = ~S-*_6                        # 6
-keyseq $DIGIT_SEVEN            = ~S-*_7                        # 7
-keyseq $DIGIT_EIGHT            = ~S-*_8                        # 8
-keyseq $DIGIT_NINE             = ~S-*_9                        # 9
-keyseq $COLON                  = ~S-*Colon                     # :
-keyseq $SEMICOLON              = ~S-*Semicolon                 # ;
-keyseq $LESS-THAN_SIGN         =  S-*Comma                     # <
-keyseq $EQUALS_SIGN            =  S-*HyphenMinus               # =
-keyseq $GREATER-THAN_SIGN      =  S-*FullStop                  # >
-keyseq $QUESTION_MARK          =  S-*Solidus                   # ?
-keyseq $COMMERCIAL_AT          = ~S-*CommercialAt              # @
-keyseq $LATIN_CAPITAL_LETTER_A =  S-*A                         # A
-keyseq $LATIN_CAPITAL_LETTER_B =  S-*B                         # B
-keyseq $LATIN_CAPITAL_LETTER_C =  S-*C                         # C
-keyseq $LATIN_CAPITAL_LETTER_D =  S-*D                         # D
-keyseq $LATIN_CAPITAL_LETTER_E =  S-*E                         # E
-keyseq $LATIN_CAPITAL_LETTER_F =  S-*F                         # F
-keyseq $LATIN_CAPITAL_LETTER_G =  S-*G                         # G
-keyseq $LATIN_CAPITAL_LETTER_H =  S-*H                         # H
-keyseq $LATIN_CAPITAL_LETTER_I =  S-*I                         # I
-keyseq $LATIN_CAPITAL_LETTER_J =  S-*J                         # J
-keyseq $LATIN_CAPITAL_LETTER_K =  S-*K                         # K
-keyseq $LATIN_CAPITAL_LETTER_L =  S-*L                         # L
-keyseq $LATIN_CAPITAL_LETTER_M =  S-*M                         # M
-keyseq $LATIN_CAPITAL_LETTER_N =  S-*N                         # N
-keyseq $LATIN_CAPITAL_LETTER_O =  S-*O                         # O
-keyseq $LATIN_CAPITAL_LETTER_P =  S-*P                         # P
-keyseq $LATIN_CAPITAL_LETTER_Q =  S-*Q                         # Q
-keyseq $LATIN_CAPITAL_LETTER_R =  S-*R                         # R
-keyseq $LATIN_CAPITAL_LETTER_S =  S-*S                         # S
-keyseq $LATIN_CAPITAL_LETTER_T =  S-*T                         # T
-keyseq $LATIN_CAPITAL_LETTER_U =  S-*U                         # U
-keyseq $LATIN_CAPITAL_LETTER_V =  S-*V                         # V
-keyseq $LATIN_CAPITAL_LETTER_W =  S-*W                         # W
-keyseq $LATIN_CAPITAL_LETTER_X =  S-*X                         # X
-keyseq $LATIN_CAPITAL_LETTER_Y =  S-*Y                         # Y
-keyseq $LATIN_CAPITAL_LETTER_Z =  S-*Z                         # Z
-keyseq $LEFT_SQUARE_BRACKET    = ~S-*LeftSquareBracket         # [
-keyseq $REVERSE_SOLIDUS                = ~S-*ReverseSolidus            # \
-keyseq $RIGHT_SQUARE_BRACKET   = ~S-*RightSquareBracket        # ]
-keyseq $CIRCUMFLEX_ACCENT      = ~S-*CircumflexAccent          # ^
-keyseq $LOW_LINE               =  S-*ReverseSolidus            # _
-keyseq $GRAVE_ACCENT           =  S-*CommercialAt              # `
-keyseq $LATIN_SMALL_LETTER_A   = ~S-*A                         # a
-keyseq $LATIN_SMALL_LETTER_B   = ~S-*B                         # b
-keyseq $LATIN_SMALL_LETTER_C   = ~S-*C                         # c
-keyseq $LATIN_SMALL_LETTER_D   = ~S-*D                         # d
-keyseq $LATIN_SMALL_LETTER_E   = ~S-*E                         # e
-keyseq $LATIN_SMALL_LETTER_F   = ~S-*F                         # f
-keyseq $LATIN_SMALL_LETTER_G   = ~S-*G                         # g
-keyseq $LATIN_SMALL_LETTER_H   = ~S-*H                         # h
-keyseq $LATIN_SMALL_LETTER_I   = ~S-*I                         # i
-keyseq $LATIN_SMALL_LETTER_J   = ~S-*J                         # j
-keyseq $LATIN_SMALL_LETTER_K   = ~S-*K                         # k
-keyseq $LATIN_SMALL_LETTER_L   = ~S-*L                         # l
-keyseq $LATIN_SMALL_LETTER_M   = ~S-*M                         # m
-keyseq $LATIN_SMALL_LETTER_N   = ~S-*N                         # n
-keyseq $LATIN_SMALL_LETTER_O   = ~S-*O                         # o
-keyseq $LATIN_SMALL_LETTER_P   = ~S-*P                         # p
-keyseq $LATIN_SMALL_LETTER_Q   = ~S-*Q                         # q
-keyseq $LATIN_SMALL_LETTER_R   = ~S-*R                         # r
-keyseq $LATIN_SMALL_LETTER_S   = ~S-*S                         # s
-keyseq $LATIN_SMALL_LETTER_T   = ~S-*T                         # t
-keyseq $LATIN_SMALL_LETTER_U   = ~S-*U                         # u
-keyseq $LATIN_SMALL_LETTER_V   = ~S-*V                         # v
-keyseq $LATIN_SMALL_LETTER_W   = ~S-*W                         # w
-keyseq $LATIN_SMALL_LETTER_X   = ~S-*X                         # x
-keyseq $LATIN_SMALL_LETTER_Y   = ~S-*Y                         # y
-keyseq $LATIN_SMALL_LETTER_Z   = ~S-*Z                         # z
-keyseq $LEFT_CURLY_BRACKET     =  S-*LeftSquareBracket         # {
-keyseq $VERTICAL_LINE          =  S-*YenSign                   # |
-keyseq $RIGHT_CURLY_BRACKET    =  S-*RightSquareBracket        # }
-keyseq $TILDE                  =  S-*CircumflexAccent          # ~
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# \91\8b\8eg\82¢\82Ì\97J\9fT - 109.mayu\r
+# Copyright (C) 1999-2005, TAGA Nayuta <nayuta@users.sourceforge.net>\r
+#\r
+\r
+define KBD106\r
+define KBD109\r
+define KBD112\r
+\r
+\r
+\r
+\r
+\r
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# 109 \93ú\96{\8cê\83L\81[\83{\81[\83h\92è\8b`\r
+#\r
+\r
+def key Esc Escape                     =    0x01\r
+def key _1                             =    0x02 # 1!\r
+def key _2                             =    0x03 # 2"\r
+def key _3                             =    0x04 # 3#\r
+def key _4                             =    0x05 # 4$\r
+def key _5                             =    0x06 # 5%\r
+def key _6                             =    0x07 # 6&\r
+def key _7                             =    0x08 # 7'\r
+def key _8                             =    0x09 # 8(\r
+def key _9                             =    0x0a # 9)\r
+def key _0                             =    0x0b # 0\r
+def key HyphenMinus Hyphen Minus       =    0x0c # -=\r
+def key CircumflexAccent Caret         =    0x0d # ^~\r
+def key BackSpace BS Back              =    0x0e\r
+def key Tab                            =    0x0f\r
+def key Q                              =    0x10\r
+def key W                              =    0x11\r
+def key E                              =    0x12\r
+def key R                              =    0x13\r
+def key T                              =    0x14\r
+def key Y                              =    0x15\r
+def key U                              =    0x16\r
+def key I                              =    0x17\r
+def key O                              =    0x18\r
+def key P                              =    0x19\r
+def key CommercialAt Atmark            =    0x1a # @`\r
+def key LeftSquareBracket OpenBracket  =    0x1b # [{\r
+def key Enter Return                   =    0x1c\r
+def key LeftControl LControl LCtrl     =    0x1d\r
+def key A                              =    0x1e\r
+def key S                              =    0x1f\r
+def key D                              =    0x20\r
+def key F                              =    0x21\r
+def key G                              =    0x22\r
+def key H                              =    0x23\r
+def key J                              =    0x24\r
+def key K                              =    0x25\r
+def key L                              =    0x26\r
+def key Semicolon                      =    0x27 # ;+\r
+def key Colon                          =    0x28 # :*\r
+def key \94¼\8ap/\91S\8a\8a¿\8e\9a Kanji           =    0x29 # \94¼\8ap/\91S\8a\8a¿\8e\9a\r
+def key E0\94¼\8ap/\91S\8ap E0\8a¿\8e\9a E0Kanji     = E0-0x29 # \94¼\8ap/\91S\8a\8a¿\8e\9a\r
+def key LeftShift LShift               =    0x2a\r
+def key RightSquareBracket CloseBracket        =    0x2b # ]}\r
+def key Z                              =    0x2c\r
+def key X                              =    0x2d\r
+def key C                              =    0x2e\r
+def key V                              =    0x2f\r
+def key B                              =    0x30\r
+def key N                              =    0x31\r
+def key M                              =    0x32\r
+def key Comma                          =    0x33 # ,<\r
+def key FullStop Period                        =    0x34 # .>\r
+def key Solidus Slash                  =    0x35 # /?\r
+def key RightShift RShift              =    0x36\r
+def key E0RightShift E0RShift          = E0-0x36\r
+def key NumAsterisk NumMultiply                =    0x37 # \83e\83\93\83L\81[ *\r
+def key LeftAlt LAlt LMenu             =    0x38\r
+def key Space                          =    0x39\r
+def key \89p\90\94 Eisuu                     =    0x3a # \89p\90\94 CapsLock \8a¿\8e\9a\94Ô\8d\86\r
+def key E0\89p\90\94 E0Eisuu                 = E0-0x3a # \89p\90\94 CapsLock \8a¿\8e\9a\94Ô\8d\86\r
+def key F1                             =    0x3b\r
+def key F2                             =    0x3c\r
+def key F3                             =    0x3d\r
+def key F4                             =    0x3e\r
+def key F5                             =    0x3f\r
+def key F6                             =    0x40\r
+def key F7                             =    0x41\r
+def key F8                             =    0x42\r
+def key F9                             =    0x43\r
+def key F10                            =    0x44\r
+def key NumLock                                =    0x45\r
+def key ScrollLock Scroll              =    0x46\r
+def key Num7                           =    0x47 # \83e\83\93\83L\81[ 7\r
+def key Num8                           =    0x48 # \83e\83\93\83L\81[ 8\r
+def key Num9                           =    0x49 # \83e\83\93\83L\81[ 9\r
+\r
+def key NumHyphenMinus NumMinus                =    0x4a # \83e\83\93\83L\81[ -\r
+def key Num4                           =    0x4b # \83e\83\93\83L\81[ 4\r
+def key Num5                           =    0x4c # \83e\83\93\83L\81[ 5\r
+def key Num6                           =    0x4d # \83e\83\93\83L\81[ 6\r
+def key NumPlusSign NumPlus            =    0x4e # \83e\83\93\83L\81[ +\r
+def key Num1                           =    0x4f # \83e\83\93\83L\81[ 1\r
+def key Num2                           =    0x50\r
+def key Num3                           =    0x51\r
+def key Num0                           =    0x52\r
+def key NumFullStop NumPeriod          =    0x53 # \83e\83\93\83L\81[ .\r
+def key SysRq                          =    0x54\r
+\r
+def key F11                            =    0x57\r
+def key F12                            =    0x58\r
+\r
+def key \82Ð\82ç\82ª\82È Hiragana              =    0x70 # \82Ð\82ç\82ª\82È \83J\83^\83J\83\83\8d\81[\83}\8e\9a\r
+def key E0\82Ð\82ç\82ª\82È E0Hiragana          = E0-0x70 # \82Ð\82ç\82ª\82È \83J\83^\83J\83\83\8d\81[\83}\8e\9a\r
+\r
+def key ReverseSolidus BackSlash       =    0x73 # \81__\r
+\r
+def key \95Ï\8a· Convert                   =    0x79 # \95Ï\8a·(\8e\9f\8có\95â) \91O\8có\95â \91S\8có\95â\r
+\r
+def key \96³\95Ï\8a· NonConvert              =    0x7b # \96³\95Ï\8a·\r
+\r
+def key YenSign Yen                    =    0x7d # \|\r
+\r
+def key MM/Messanger                   = E0-0x05 # (MultiMedia Keyboard) \83\81\83b\83Z\83\93\83W\83\83\81[\r
+\r
+def key MM/Undo        MM/F2                   = E0-0x08 # (MultiMedia Keyboard) F2 \8c³\82É\96ß\82·\r
+def key MM/Redo        MM/F3                   = E0-0x07 # (MultiMedia Keyboard) F3 \82â\82è\92¼\82µ\r
+\r
+def key MediaPrevTrack ScanPreviousTrack PreviousTrack \\r
+                                       = E0-0x10 # (MultiMedia Keyboard) |<<\r
+def key VAIO/TV/VIDEO                  = E0-0x11 # (Vaio) TV/VIDEO\r
+def key VAIO/TIMER-REC                 = E0-0x12 # (Vaio) TIMER REC\r
+def key VAIO/DV-CAPTURE                        = E0-0x13 # (Vaio) DV CAPTURE\r
+def key VAIO/VIDEO-EDIT                        = E0-0x14 # (Vaio) VIDEO EDIT\r
+def key VAIO/MAIL                      = E0-0x15 # (Vaio) MAIL\r
+def key VAIO/INTERNET                  = E0-0x16 # (Vaio) INTERNET\r
+def key MediaNextTrack ScanNextTrack NextTrack \\r
+                                       = E0-0x19 # (MultiMedia Keyboard) >>|\r
+\r
+def key NumEnter NumReturn             = E0-0x1c\r
+def key RightControl RControl RCtrl    = E0-0x1d\r
+\r
+def key VolumeMute Mute                        = E0-0x20 # (MultiMedia Keyboard)\r
+def key MM/Calculator ALCalculator     = E0-0x21 # (MultiMedia Keyboard) \93d\91ì\r
+\r
+def key MediaPlayPause Play/Pause      = E0-0x22 # (MultiMedia Keyboard) > / ||\r
+def key MM/SpellCheck  MM/F10          = E0-0x23 # (MultiMedia Keyboard) F10 \83X\83y\83\8b\83`\83F\83b\83N\r
+def key MediaStop Stop                 = E0-0x24 # (MultiMedia Keyboard) \81¡\r
+\r
+# def ignore                           = E0-0x2a # \82È\82É\82±\82ê (\96³\8e\8b)\r
+\r
+def key VolumeDown VolumeDecrement     = E0-0x2e # (MultiMedia Keyboard) -\r
+\r
+def key VolumeUp VolumeIncrement       = E0-0x30 # (MultiMedia Keyboard) +\r
+\r
+def key BrowserHome ACHome Internet    = E0-0x32 # (MultiMedia Keyboard) \83z\81[\83\80\r
+\r
+def key NumSolidus NumSlash            = E0-0x35 # \83e\83\93\83L\81[ /\r
+\r
+def key PrintScreen Snapshot           = E0-0x37\r
+def key RightAlt RAlt RMenu            = E0-0x38\r
+\r
+def key MM/Help                MM/F1           = E0-0x3b # (MultiMedia Keyboard) F1 \83w\83\8b\83v\r
+def key MM/MyMusic                     = E0-0x3c # (MultiMedia Keyboard) \83}\83C\83~\83\85\81[\83W\83b\83N\r
+\r
+def key MM/New         MM/F4           = E0-0x3e # (MultiMedia Keyboard) F4 \90V\8bK\8dì\90¬\r
+def key MM/Open                MM/F5           = E0-0x3f # (MultiMedia Keyboard) F5 \8aJ\82­\r
+def key MM/Close       MM/F6           = E0-0x40 # (MultiMedia Keyboard) F6 \95Â\82\82é\r
+def key MM/Reply       MM/F7           = E0-0x41 # (MultiMedia Keyboard) F7 \95Ô\90M\r
+def key MM/Forward     MM/F8           = E0-0x42 # (MultiMedia Keyboard) F8 \93]\91\97\r
+def key MM/Send                MM/F9           = E0-0x43 # (MultiMedia Keyboard) F9 \91\97\90M\r
+\r
+def key Break                          = E0-0x46 # Break\r
+def key Home                           = E0-0x47\r
+def key \81ª Up                          = E0-0x48\r
+def key PageUp Prior                   = E0-0x49\r
+\r
+def key \81© Left                                = E0-0x4b\r
+def key MM/MyDocument                  = E0-0x4c # (MultiMedia Keyboard) \83}\83C\83h\83L\83\85\83\81\83\93\83g\r
+def key \81¨ Right                       = E0-0x4d\r
+\r
+def key End                            = E0-0x4f\r
+def key \81« Down                                = E0-0x50\r
+def key PageDown Next                  = E0-0x51\r
+def key Insert                         = E0-0x52\r
+def key Delete Del                     = E0-0x53\r
+\r
+def key MM/Save                MM/F11          = E0-0x57 # (MultiMedia Keyboard) F11 \8fã\8f\91\82«\95Û\91\r
+def key MM/Print       MM/F12          = E0-0x58 # (MultiMedia Keyboard) F12 \88ó\8dü\r
+# def ignore                           = E0-0x59 # (Wireless Keyboard) Unknown\r
+\r
+def key LeftWindows LWindows LWin      = E0-0x5b\r
+def key RightWindows RWindows RWin     = E0-0x5c\r
+def key Applications Apps              = E0-0x5d\r
+def key PowerOff                       = E0-0x5e # Power off  (112 \83L\81[\83{\81[\83h)\r
+def key Sleep                          = E0-0x5f # Sleep      (112 \83L\81[\83{\81[\83h)\r
+\r
+def key WakeUp                         = E0-0x63 # Wake up    (112 \83L\81[\83{\81[\83h)\r
+def key MM/MyPicture                   = E0-0x64 # (MultiMedia Keyboard) \83}\83C\83s\83N\83`\83\83\r
+def key BrowserSearch ACSearch         = E0-0x65 # (Internet Explorer)\r
+def key BrowserFavorites ACBookmarks   = E0-0x66 # (Internet Explorer)\r
+def key BrowserRefresh ACRefresh       = E0-0x67 # (Internet Explorer)\r
+def key BrowserStop ACStop             = E0-0x68 # (Internet Explorer)\r
+def key BrowserForward ACForward       = E0-0x69 # (Internet Explorer)\r
+def key BrowserBack ACBack             = E0-0x6a # (Internet Explorer)\r
+def key ALLocalBrowser                 = E0-0x6b # (N/A) My Computer \r
+def key LaunchMail ALEmailReader Email = E0-0x6c # (MultiMedia Keyboard) \83\81\81[\83\8b\r
+def key LaunchMediaSelect ALConsumerControlConfiguration \\r
+                                       = E0-0x6d # (MultiMedia Keyboard) \83\81\83f\83B\83A\r
+\r
+def key Pause                          = E1-0x1d 0x45 # Pause\r
+\r
+# def overflow                         =    0xff # \83I\81[\83o\81[\83t\83\8d\81[ (\96³\8e\8b)\r
+def sync                               =    0x7e # &Sync \82Å\8eg\82¤\83X\83L\83\83\83\93\83R\81[\83h\r
+\r
+def mod Shift  = LShift RShift\r
+def mod Alt    = LAlt RAlt\r
+def mod Control        = LControl RControl\r
+def mod Windows        = LWindows RWindows\r
+mod shift += E0RShift\r
+key *E0RShift = *RShift\r
+\r
+\r
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# \83L\81[\83V\81[\83P\83\93\83X\92è\8b`\r
+#\r
+\r
+keyseq $ToggleIME              = A-\94¼\8ap/\91S\8ap\r
+keyseq $CapsLock               = S-\89p\90\94\r
+\r
+keyseq $SPACE                  = ~S-*Space                     #  \r
+keyseq $EXCLAMATION_MARK       =  S-*_1                        # !\r
+keyseq $QUOTATION_MARK         =  S-*_2                        # "\r
+keyseq $NUMBER_SIGN            =  S-*_3                        # #\r
+keyseq $DOLLAR_SIGN            =  S-*_4                        # $\r
+keyseq $PERCENT_SIGN           =  S-*_5                        # %\r
+keyseq $AMPERSAND              =  S-*_6                        # &\r
+keyseq $APOSTROPHE             =  S-*_7                        # '\r
+keyseq $LEFT_PARENTHESIS       =  S-*_8                        # (\r
+keyseq $RIGHT_PARENTHESIS      =  S-*_9                        # )\r
+keyseq $ASTERISK               =  S-*Colon                     # *\r
+keyseq $PLUS_SIGN              =  S-*Semicolon                 # +\r
+keyseq $COMMA                  = ~S-*Comma                     # ,\r
+keyseq $HYPHEN-MINUS           = ~S-*HyphenMinus               # -\r
+keyseq $FULL_STOP              = ~S-*FullStop                  # .\r
+keyseq $SOLIDUS                        = ~S-*Solidus                   # /\r
+keyseq $DIGIT_ZERO             = ~S-*_0                        # 0\r
+keyseq $DIGIT_ONE              = ~S-*_1                        # 1\r
+keyseq $DIGIT_TWO              = ~S-*_2                        # 2\r
+keyseq $DIGIT_THREE            = ~S-*_3                        # 3\r
+keyseq $DIGIT_FOUR             = ~S-*_4                        # 4\r
+keyseq $DIGIT_FIVE             = ~S-*_5                        # 5\r
+keyseq $DIGIT_SIX              = ~S-*_6                        # 6\r
+keyseq $DIGIT_SEVEN            = ~S-*_7                        # 7\r
+keyseq $DIGIT_EIGHT            = ~S-*_8                        # 8\r
+keyseq $DIGIT_NINE             = ~S-*_9                        # 9\r
+keyseq $COLON                  = ~S-*Colon                     # :\r
+keyseq $SEMICOLON              = ~S-*Semicolon                 # ;\r
+keyseq $LESS-THAN_SIGN         =  S-*Comma                     # <\r
+keyseq $EQUALS_SIGN            =  S-*HyphenMinus               # =\r
+keyseq $GREATER-THAN_SIGN      =  S-*FullStop                  # >\r
+keyseq $QUESTION_MARK          =  S-*Solidus                   # ?\r
+keyseq $COMMERCIAL_AT          = ~S-*CommercialAt              # @\r
+keyseq $LATIN_CAPITAL_LETTER_A =  S-*A                         # A\r
+keyseq $LATIN_CAPITAL_LETTER_B =  S-*B                         # B\r
+keyseq $LATIN_CAPITAL_LETTER_C =  S-*C                         # C\r
+keyseq $LATIN_CAPITAL_LETTER_D =  S-*D                         # D\r
+keyseq $LATIN_CAPITAL_LETTER_E =  S-*E                         # E\r
+keyseq $LATIN_CAPITAL_LETTER_F =  S-*F                         # F\r
+keyseq $LATIN_CAPITAL_LETTER_G =  S-*G                         # G\r
+keyseq $LATIN_CAPITAL_LETTER_H =  S-*H                         # H\r
+keyseq $LATIN_CAPITAL_LETTER_I =  S-*I                         # I\r
+keyseq $LATIN_CAPITAL_LETTER_J =  S-*J                         # J\r
+keyseq $LATIN_CAPITAL_LETTER_K =  S-*K                         # K\r
+keyseq $LATIN_CAPITAL_LETTER_L =  S-*L                         # L\r
+keyseq $LATIN_CAPITAL_LETTER_M =  S-*M                         # M\r
+keyseq $LATIN_CAPITAL_LETTER_N =  S-*N                         # N\r
+keyseq $LATIN_CAPITAL_LETTER_O =  S-*O                         # O\r
+keyseq $LATIN_CAPITAL_LETTER_P =  S-*P                         # P\r
+keyseq $LATIN_CAPITAL_LETTER_Q =  S-*Q                         # Q\r
+keyseq $LATIN_CAPITAL_LETTER_R =  S-*R                         # R\r
+keyseq $LATIN_CAPITAL_LETTER_S =  S-*S                         # S\r
+keyseq $LATIN_CAPITAL_LETTER_T =  S-*T                         # T\r
+keyseq $LATIN_CAPITAL_LETTER_U =  S-*U                         # U\r
+keyseq $LATIN_CAPITAL_LETTER_V =  S-*V                         # V\r
+keyseq $LATIN_CAPITAL_LETTER_W =  S-*W                         # W\r
+keyseq $LATIN_CAPITAL_LETTER_X =  S-*X                         # X\r
+keyseq $LATIN_CAPITAL_LETTER_Y =  S-*Y                         # Y\r
+keyseq $LATIN_CAPITAL_LETTER_Z =  S-*Z                         # Z\r
+keyseq $LEFT_SQUARE_BRACKET    = ~S-*LeftSquareBracket         # [\r
+keyseq $REVERSE_SOLIDUS                = ~S-*ReverseSolidus            # \\r
+keyseq $RIGHT_SQUARE_BRACKET   = ~S-*RightSquareBracket        # ]\r
+keyseq $CIRCUMFLEX_ACCENT      = ~S-*CircumflexAccent          # ^\r
+keyseq $LOW_LINE               =  S-*ReverseSolidus            # _\r
+keyseq $GRAVE_ACCENT           =  S-*CommercialAt              # `\r
+keyseq $LATIN_SMALL_LETTER_A   = ~S-*A                         # a\r
+keyseq $LATIN_SMALL_LETTER_B   = ~S-*B                         # b\r
+keyseq $LATIN_SMALL_LETTER_C   = ~S-*C                         # c\r
+keyseq $LATIN_SMALL_LETTER_D   = ~S-*D                         # d\r
+keyseq $LATIN_SMALL_LETTER_E   = ~S-*E                         # e\r
+keyseq $LATIN_SMALL_LETTER_F   = ~S-*F                         # f\r
+keyseq $LATIN_SMALL_LETTER_G   = ~S-*G                         # g\r
+keyseq $LATIN_SMALL_LETTER_H   = ~S-*H                         # h\r
+keyseq $LATIN_SMALL_LETTER_I   = ~S-*I                         # i\r
+keyseq $LATIN_SMALL_LETTER_J   = ~S-*J                         # j\r
+keyseq $LATIN_SMALL_LETTER_K   = ~S-*K                         # k\r
+keyseq $LATIN_SMALL_LETTER_L   = ~S-*L                         # l\r
+keyseq $LATIN_SMALL_LETTER_M   = ~S-*M                         # m\r
+keyseq $LATIN_SMALL_LETTER_N   = ~S-*N                         # n\r
+keyseq $LATIN_SMALL_LETTER_O   = ~S-*O                         # o\r
+keyseq $LATIN_SMALL_LETTER_P   = ~S-*P                         # p\r
+keyseq $LATIN_SMALL_LETTER_Q   = ~S-*Q                         # q\r
+keyseq $LATIN_SMALL_LETTER_R   = ~S-*R                         # r\r
+keyseq $LATIN_SMALL_LETTER_S   = ~S-*S                         # s\r
+keyseq $LATIN_SMALL_LETTER_T   = ~S-*T                         # t\r
+keyseq $LATIN_SMALL_LETTER_U   = ~S-*U                         # u\r
+keyseq $LATIN_SMALL_LETTER_V   = ~S-*V                         # v\r
+keyseq $LATIN_SMALL_LETTER_W   = ~S-*W                         # w\r
+keyseq $LATIN_SMALL_LETTER_X   = ~S-*X                         # x\r
+keyseq $LATIN_SMALL_LETTER_Y   = ~S-*Y                         # y\r
+keyseq $LATIN_SMALL_LETTER_Z   = ~S-*Z                         # z\r
+keyseq $LEFT_CURLY_BRACKET     =  S-*LeftSquareBracket         # {\r
+keyseq $VERTICAL_LINE          =  S-*YenSign                   # |\r
+keyseq $RIGHT_CURLY_BRACKET    =  S-*RightSquareBracket        # }\r
+keyseq $TILDE                  =  S-*CircumflexAccent          # ~\r
index 1a0ac95..8a1e99c 100644 (file)
@@ -1,24 +1,24 @@
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# MADO TSUKAI NO YUUTSU - 109on104.mayu
-# Copyright (C) 1999-2005, TAGA Nayuta <nayuta@users.sourceforge.net>
-#
-
-define KBD109on104
-
-def subst  S-*_2               = $QUOTATION_MARK
-def subst  S-*_6               = $AMPERSAND
-def subst  S-*_7               = $APOSTROPHE
-def subst  S-*_8               = $LEFT_PARENTHESIS
-def subst  S-*_9               = $RIGHT_PARENTHESIS
-def subst  S-*_0               = $LOW_LINE             # for lack of key
-def subst  S-*Hyphen           = $EQUALS_SIGN
-def subst ~S-*Equal            = $CIRCUMFLEX_ACCENT
-def subst  S-*Equal            = $TILDE
-def subst ~S-*OpenBracket      = $COMMERCIAL_AT
-def subst  S-*OpenBracket      = $GRAVE_ACCENT
-def subst    *CloseBracket     = $LEFT_SQUARE_BRACKET
-def subst  S-*Semicolon                = $PLUS_SIGN
-def subst ~S-*Quote            = $COLON
-def subst  S-*Quote            = $ASTERISK
-# def subst ~S-*               = $RIGHT_SQUARE_BRACKET # for lack of key
-# def subst  S-*               = $RIGHT_CURLY_BRACKET   # for lack of key
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# MADO TSUKAI NO YUUTSU - 109on104.mayu\r
+# Copyright (C) 1999-2005, TAGA Nayuta <nayuta@users.sourceforge.net>\r
+#\r
+\r
+define KBD109on104\r
+\r
+def subst  S-*_2               = $QUOTATION_MARK\r
+def subst  S-*_6               = $AMPERSAND\r
+def subst  S-*_7               = $APOSTROPHE\r
+def subst  S-*_8               = $LEFT_PARENTHESIS\r
+def subst  S-*_9               = $RIGHT_PARENTHESIS\r
+def subst  S-*_0               = $LOW_LINE             # for lack of key\r
+def subst  S-*Hyphen           = $EQUALS_SIGN\r
+def subst ~S-*Equal            = $CIRCUMFLEX_ACCENT\r
+def subst  S-*Equal            = $TILDE\r
+def subst ~S-*OpenBracket      = $COMMERCIAL_AT\r
+def subst  S-*OpenBracket      = $GRAVE_ACCENT\r
+def subst    *CloseBracket     = $LEFT_SQUARE_BRACKET\r
+def subst  S-*Semicolon                = $PLUS_SIGN\r
+def subst ~S-*Quote            = $COLON\r
+def subst  S-*Quote            = $ASTERISK\r
+# def subst ~S-*               = $RIGHT_SQUARE_BRACKET # for lack of key\r
+# def subst  S-*               = $RIGHT_CURLY_BRACKET   # for lack of key\r
diff --git a/array.h b/array.h
index 6e840a4..a595d59 100644 (file)
--- a/array.h
+++ b/array.h
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// array.h
-
-
-#ifndef _ARRAY_H
-#  define _ARRAY_H
-
-#  include <memory>
-
-
-///
-template <class T, class Allocator = std::allocator<T> >
-class Array
-{
-public:
-  typedef typename Allocator::reference         reference; ///
-  typedef typename Allocator::const_reference   const_reference; ///
-  typedef typename Allocator::pointer           iterator; ///
-  typedef typename Allocator::const_pointer     const_iterator;        ///
-  typedef typename Allocator::size_type         size_type; ///
-  typedef typename Allocator::difference_type   difference_type; ///
-  typedef T                                     value_type;    ///
-  typedef Allocator                             allocator_type;        ///
-  typedef typename Allocator::pointer           pointer; ///
-  typedef typename Allocator::const_pointer     const_pointer; ///
-#if 0
-  typedef std::reverse_iterator<iterator>       reverse_iterator; ///
-  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;        ///
-#endif   
-private:
-  Allocator m_allocator;                       /// 
-  size_type m_size;                            /// 
-  pointer m_buf;                               /// array buffer
-
-public:
-  /// constructor
-  explicit Array(const Allocator& i_allocator = Allocator())
-    : m_allocator(i_allocator), m_size(0), m_buf(NULL)  { }
-         
-  /// constructor
-  explicit Array(size_type i_size, const T& i_value = T(),
-                const Allocator& i_allocator = Allocator())
-    : m_allocator(i_allocator), m_size(i_size),
-      m_buf(m_allocator.allocate(m_size, 0))
-  {
-    std::uninitialized_fill_n(m_buf, i_size, i_value);
-  }
-         
-  /// constructor
-  template <class InputIterator>
-  Array(InputIterator i_begin, InputIterator i_end,
-       const Allocator& i_allocator = Allocator())
-    : m_allocator(i_allocator), m_size(distance(i_begin, i_end)),
-      m_buf(Allocator::allocate(m_size, 0))
-  {
-    std::uninitialized_copy(i_begin, i_end, m_buf);
-  }
-         
-  /// copy constructor
-  Array(const Array& i_o) : m_size(0), m_buf(NULL) { operator=(i_o); }
-
-  /// destractor
-  ~Array() { clear(); }
-
-  ///
-  Array& operator=(const Array& i_o)
-  {
-    if (&i_o != this)
-    {
-      clear();
-      m_size = i_o.m_size;
-      m_buf = m_allocator.allocate(m_size, 0);
-      std::uninitialized_copy(i_o.m_buf, i_o.m_buf + m_size, m_buf);
-    }
-    return *this;
-  }
-  ///
-  allocator_type get_allocator() const { return Allocator(); }
-  /// return pointer to the array buffer
-  typename allocator_type::pointer get() { return m_buf; }
-  /// return pointer to the array buffer
-  typename allocator_type::const_pointer get() const { return m_buf; }
-  ///
-  iterator begin() { return m_buf; }
-  ///
-  const_iterator begin() const { return m_buf; }
-  ///
-  iterator end() { return m_buf + m_size; }
-  ///
-  const_iterator end() const { return m_buf + m_size; }
-#if 0
-  ///
-  reverse_iterator rbegin() { reverse_iterator(end()); }
-  ///
-  const_reverse_iterator rbegin() const { const_reverse_iterator(end()); }
-  ///
-  reverse_iterator rend() { reverse_iterator(begin()); }
-  ///
-  const_reverse_iterator rend() const { const_reverse_iterator(begin()); }
-#endif
-  ///
-  size_type size() const { return m_size; }
-  ///
-  size_type max_size() const { return -1; }
-  /// resize the array buffer.  NOTE: the original contents are cleared.
-  void resize(size_type i_size, const T& i_value = T())
-  {
-    clear();
-    m_size = i_size;
-    m_buf = m_allocator.allocate(m_size, 0);
-    std::uninitialized_fill_n(m_buf, i_size, i_value);
-  }
-  /// resize the array buffer.  
-  template <class InputIterator>
-  void resize(InputIterator i_begin, InputIterator i_end)
-  {
-    clear();
-    m_size = distance(i_begin, i_end);
-    m_buf = m_allocator.allocate(m_size, 0);
-    std::uninitialized_copy(i_begin, i_end, m_buf);
-  }
-  /// expand the array buffer. the contents of it are copied to the new one
-  void expand(size_type i_size, const T& i_value = T())
-  {
-    ASSERT( m_size <= i_size );
-    if (!m_buf)
-      resize(i_size, i_value);
-    else
-    {
-      pointer buf = m_allocator.allocate(i_size, 0);
-      std::uninitialized_copy(m_buf, m_buf + m_size, buf);
-      std::uninitialized_fill_n(buf + m_size, i_size - m_size, i_value);
-      clear();
-      m_size = i_size;
-      m_buf = buf;
-    }
-  }
-  ///
-  bool empty() const { return !m_buf; }
-  ///
-  reference operator[](size_type i_n) { return *(m_buf + i_n); }
-  ///
-  const_reference operator[](size_type i_n) const
-  { return *(m_buf + i_n); }
-  ///
-  const_reference at(size_type i_n) const
-  { return *(m_buf + i_n); }
-  ///
-  reference at(size_type i_n)
-  { return *(m_buf + i_n); }
-  ///
-  reference front() { return *m_buf; }
-  ///
-  const_reference front() const { return *m_buf; }
-  ///
-  reference back() { return *(m_buf + m_size - 1); }
-  ///
-  const_reference back() const { return *(m_buf + m_size - 1); }
-  ///
-  void swap(Array &i_o)
-  {
-    if (&i_o != this)
-    {
-      pointer buf = m_buf;
-      size_type size = m_size;
-      m_buf = i_o.m_buf;
-      m_size = i_o.m_size;
-      i_o.m_buf = buf;
-      i_o.m_size = size;
-    }
-  }
-  ///
-  void clear()
-  {
-    if (m_buf)
-    {
-      for (size_type i = 0; i < m_size; i ++)
-       m_allocator.destroy(&m_buf[i]);
-      m_allocator.deallocate(m_buf, m_size);
-      m_buf = 0;
-      m_size = 0;
-    }
-  }
-};
-
-#endif // _ARRAY_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// array.h\r
+\r
+\r
+#ifndef _ARRAY_H\r
+#  define _ARRAY_H\r
+\r
+#  include <memory>\r
+\r
+\r
+///\r
+template <class T, class Allocator = std::allocator<T> >\r
+class Array\r
+{\r
+public:\r
+  typedef typename Allocator::reference         reference; ///\r
+  typedef typename Allocator::const_reference   const_reference; ///\r
+  typedef typename Allocator::pointer           iterator; ///\r
+  typedef typename Allocator::const_pointer     const_iterator;        ///\r
+  typedef typename Allocator::size_type         size_type; ///\r
+  typedef typename Allocator::difference_type   difference_type; ///\r
+  typedef T                                     value_type;    ///\r
+  typedef Allocator                             allocator_type;        ///\r
+  typedef typename Allocator::pointer           pointer; ///\r
+  typedef typename Allocator::const_pointer     const_pointer; ///\r
+#if 0\r
+  typedef std::reverse_iterator<iterator>       reverse_iterator; ///\r
+  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;        ///\r
+#endif   \r
+private:\r
+  Allocator m_allocator;                       /// \r
+  size_type m_size;                            /// \r
+  pointer m_buf;                               /// array buffer\r
+\r
+public:\r
+  /// constructor\r
+  explicit Array(const Allocator& i_allocator = Allocator())\r
+    : m_allocator(i_allocator), m_size(0), m_buf(NULL)  { }\r
+         \r
+  /// constructor\r
+  explicit Array(size_type i_size, const T& i_value = T(),\r
+                const Allocator& i_allocator = Allocator())\r
+    : m_allocator(i_allocator), m_size(i_size),\r
+      m_buf(m_allocator.allocate(m_size, 0))\r
+  {\r
+    std::uninitialized_fill_n(m_buf, i_size, i_value);\r
+  }\r
+         \r
+  /// constructor\r
+  template <class InputIterator>\r
+  Array(InputIterator i_begin, InputIterator i_end,\r
+       const Allocator& i_allocator = Allocator())\r
+    : m_allocator(i_allocator), m_size(distance(i_begin, i_end)),\r
+      m_buf(Allocator::allocate(m_size, 0))\r
+  {\r
+    std::uninitialized_copy(i_begin, i_end, m_buf);\r
+  }\r
+         \r
+  /// copy constructor\r
+  Array(const Array& i_o) : m_size(0), m_buf(NULL) { operator=(i_o); }\r
+\r
+  /// destractor\r
+  ~Array() { clear(); }\r
+\r
+  ///\r
+  Array& operator=(const Array& i_o)\r
+  {\r
+    if (&i_o != this)\r
+    {\r
+      clear();\r
+      m_size = i_o.m_size;\r
+      m_buf = m_allocator.allocate(m_size, 0);\r
+      std::uninitialized_copy(i_o.m_buf, i_o.m_buf + m_size, m_buf);\r
+    }\r
+    return *this;\r
+  }\r
+  ///\r
+  allocator_type get_allocator() const { return Allocator(); }\r
+  /// return pointer to the array buffer\r
+  typename allocator_type::pointer get() { return m_buf; }\r
+  /// return pointer to the array buffer\r
+  typename allocator_type::const_pointer get() const { return m_buf; }\r
+  ///\r
+  iterator begin() { return m_buf; }\r
+  ///\r
+  const_iterator begin() const { return m_buf; }\r
+  ///\r
+  iterator end() { return m_buf + m_size; }\r
+  ///\r
+  const_iterator end() const { return m_buf + m_size; }\r
+#if 0\r
+  ///\r
+  reverse_iterator rbegin() { reverse_iterator(end()); }\r
+  ///\r
+  const_reverse_iterator rbegin() const { const_reverse_iterator(end()); }\r
+  ///\r
+  reverse_iterator rend() { reverse_iterator(begin()); }\r
+  ///\r
+  const_reverse_iterator rend() const { const_reverse_iterator(begin()); }\r
+#endif\r
+  ///\r
+  size_type size() const { return m_size; }\r
+  ///\r
+  size_type max_size() const { return -1; }\r
+  /// resize the array buffer.  NOTE: the original contents are cleared.\r
+  void resize(size_type i_size, const T& i_value = T())\r
+  {\r
+    clear();\r
+    m_size = i_size;\r
+    m_buf = m_allocator.allocate(m_size, 0);\r
+    std::uninitialized_fill_n(m_buf, i_size, i_value);\r
+  }\r
+  /// resize the array buffer.  \r
+  template <class InputIterator>\r
+  void resize(InputIterator i_begin, InputIterator i_end)\r
+  {\r
+    clear();\r
+    m_size = distance(i_begin, i_end);\r
+    m_buf = m_allocator.allocate(m_size, 0);\r
+    std::uninitialized_copy(i_begin, i_end, m_buf);\r
+  }\r
+  /// expand the array buffer. the contents of it are copied to the new one\r
+  void expand(size_type i_size, const T& i_value = T())\r
+  {\r
+    ASSERT( m_size <= i_size );\r
+    if (!m_buf)\r
+      resize(i_size, i_value);\r
+    else\r
+    {\r
+      pointer buf = m_allocator.allocate(i_size, 0);\r
+      std::uninitialized_copy(m_buf, m_buf + m_size, buf);\r
+      std::uninitialized_fill_n(buf + m_size, i_size - m_size, i_value);\r
+      clear();\r
+      m_size = i_size;\r
+      m_buf = buf;\r
+    }\r
+  }\r
+  ///\r
+  bool empty() const { return !m_buf; }\r
+  ///\r
+  reference operator[](size_type i_n) { return *(m_buf + i_n); }\r
+  ///\r
+  const_reference operator[](size_type i_n) const\r
+  { return *(m_buf + i_n); }\r
+  ///\r
+  const_reference at(size_type i_n) const\r
+  { return *(m_buf + i_n); }\r
+  ///\r
+  reference at(size_type i_n)\r
+  { return *(m_buf + i_n); }\r
+  ///\r
+  reference front() { return *m_buf; }\r
+  ///\r
+  const_reference front() const { return *m_buf; }\r
+  ///\r
+  reference back() { return *(m_buf + m_size - 1); }\r
+  ///\r
+  const_reference back() const { return *(m_buf + m_size - 1); }\r
+  ///\r
+  void swap(Array &i_o)\r
+  {\r
+    if (&i_o != this)\r
+    {\r
+      pointer buf = m_buf;\r
+      size_type size = m_size;\r
+      m_buf = i_o.m_buf;\r
+      m_size = i_o.m_size;\r
+      i_o.m_buf = buf;\r
+      i_o.m_size = size;\r
+    }\r
+  }\r
+  ///\r
+  void clear()\r
+  {\r
+    if (m_buf)\r
+    {\r
+      for (size_type i = 0; i < m_size; i ++)\r
+       m_allocator.destroy(&m_buf[i]);\r
+      m_allocator.deallocate(m_buf, m_size);\r
+      m_buf = 0;\r
+      m_size = 0;\r
+    }\r
+  }\r
+};\r
+\r
+#endif // _ARRAY_H\r
index b6253c1..9fd5780 100644 (file)
@@ -1,93 +1,93 @@
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// compiler_specific.h
-
-
-#ifndef _COMPILER_SPECIFIC_H
-#  define _COMPILER_SPECIFIC_H
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Microsoft Visual C++ 6.0
-
-#  if defined(_MSC_VER)
-
-// C4061 enum 'identifier' is not handled by case label
-// C4100 argument 'identifier' is not used
-// C4132 const 'object' must be initialized
-// C4552 'operator' : operator has no effect
-// C4701 local variable 'name' may be uninitialized
-// C4706 condition is a result of a assign
-// C4786 identifier is truncated into 255 chars (in debug information)
-#    pragma warning(disable : 4061 4100 4132 4552 4701 4706 4786)
-
-#    define setmode _setmode
-#    define for if (false) ; else for
-
-#    define stati64_t _stati64
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Borland C++ 5.5.1
-
-#  elif defined(__BORLANDC__)
-
-// W8004 'identifier' is assigned a value that is never used in function
-// W8022 'identifier' hides virtual function 'function'
-// W8027 Functions containing ... are not expanded inline
-// W8030 Temporary used for parameter 'identifier'
-//       in call to 'function' in function
-// W8060 Possibly incorrect assignment in function
-// W8070 Function should return a value in function
-// W8084 Suggest parentheses to clarify precedence in function
-#    pragma warn -8004
-#    pragma warn -8022
-#    pragma warn -8027
-#    pragma warn -8030
-#    pragma warn -8060
-#    pragma warn -8070
-#    pragma warn -8084
-
-#    ifdef _UNICODE
-extern wchar_t **_wargv;
-#    endif
-
-#    ifdef _MBCS
-#      define _istcntrl iscntrl
-#    endif
-
-#    include <windows.h>
-#    include <tchar.h>
-
-extern "C"
-{
-  int WINAPI _tWinMain(HINSTANCE i_hInstance, HINSTANCE i_hPrevInstance,
-                      LPTSTR i_lpszCmdLine, int i_nCmdShow);
-}
-
-#    define stati64_t stati64
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Cygwin 1.1 (gcc 2.95.2)
-
-#  elif defined(__CYGWIN__)
-#    error "I don't know the details of this compiler... Plz hack."
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Watcom C++
-
-#  elif defined(__WATCOMC__)
-#    error "I don't know the details of this compiler... Plz hack."
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// unknown
-
-#  else
-#    error "I don't know the details of this compiler... Plz hack."
-
-#  endif
-
-
-#endif // _COMPILER_SPECIFIC_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// compiler_specific.h\r
+\r
+\r
+#ifndef _COMPILER_SPECIFIC_H\r
+#  define _COMPILER_SPECIFIC_H\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Microsoft Visual C++ 6.0\r
+\r
+#  if defined(_MSC_VER)\r
+\r
+// C4061 enum 'identifier' is not handled by case label\r
+// C4100 argument 'identifier' is not used\r
+// C4132 const 'object' must be initialized\r
+// C4552 'operator' : operator has no effect\r
+// C4701 local variable 'name' may be uninitialized\r
+// C4706 condition is a result of a assign\r
+// C4786 identifier is truncated into 255 chars (in debug information)\r
+#    pragma warning(disable : 4061 4100 4132 4552 4701 4706 4786)\r
+\r
+#    define setmode _setmode\r
+#    define for if (false) ; else for\r
+\r
+#    define stati64_t _stati64\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Borland C++ 5.5.1\r
+\r
+#  elif defined(__BORLANDC__)\r
+\r
+// W8004 'identifier' is assigned a value that is never used in function\r
+// W8022 'identifier' hides virtual function 'function'\r
+// W8027 Functions containing ... are not expanded inline\r
+// W8030 Temporary used for parameter 'identifier'\r
+//       in call to 'function' in function\r
+// W8060 Possibly incorrect assignment in function\r
+// W8070 Function should return a value in function\r
+// W8084 Suggest parentheses to clarify precedence in function\r
+#    pragma warn -8004\r
+#    pragma warn -8022\r
+#    pragma warn -8027\r
+#    pragma warn -8030\r
+#    pragma warn -8060\r
+#    pragma warn -8070\r
+#    pragma warn -8084\r
+\r
+#    ifdef _UNICODE\r
+extern wchar_t **_wargv;\r
+#    endif\r
+\r
+#    ifdef _MBCS\r
+#      define _istcntrl iscntrl\r
+#    endif\r
+\r
+#    include <windows.h>\r
+#    include <tchar.h>\r
+\r
+extern "C"\r
+{\r
+  int WINAPI _tWinMain(HINSTANCE i_hInstance, HINSTANCE i_hPrevInstance,\r
+                      LPTSTR i_lpszCmdLine, int i_nCmdShow);\r
+}\r
+\r
+#    define stati64_t stati64\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Cygwin 1.1 (gcc 2.95.2)\r
+\r
+#  elif defined(__CYGWIN__)\r
+#    error "I don't know the details of this compiler... Plz hack."\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Watcom C++\r
+\r
+#  elif defined(__WATCOMC__)\r
+#    error "I don't know the details of this compiler... Plz hack."\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// unknown\r
+\r
+#  else\r
+#    error "I don't know the details of this compiler... Plz hack."\r
+\r
+#  endif\r
+\r
+\r
+#endif // _COMPILER_SPECIFIC_H\r
index 7370ce2..4fec730 100644 (file)
@@ -1,48 +1,48 @@
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// compiler_specific_func.cpp
-
-
-#include "compiler_specific_func.h"
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Microsoft Visual C++ 6.0
-
-#if defined(_MSC_VER)
-
-// get compiler version string
-tstring getCompilerVersionString()
-{
-  TCHAR buf[200];
-  _sntprintf(buf, NUMBER_OF(buf),
-            _T("Microsoft (R) 32-bit C/C++ Optimizing Compiler Version %d.%02d"),
-            _MSC_VER / 100,
-            _MSC_VER % 100);
-  return tstring(buf);
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Borland C++ 5.5.1
-
-#elif defined(__BORLANDC__)
-
-// get compiler version string
-tstring getCompilerVersionString()
-{
-  TCHAR buf[100];
-  _sntprintf(buf, NUMBER_OF(buf), _T("Borland C++ %d.%d.%d"),
-            __BORLANDC__ / 0x100,
-            __BORLANDC__ / 0x10 % 0x10,
-            __BORLANDC__ % 0x10);
-  return tstring(buf);
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// unknown
-
-#else
-#  error "I don't know the details of this compiler... Plz hack."
-
-#endif
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// compiler_specific_func.cpp\r
+\r
+\r
+#include "compiler_specific_func.h"\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Microsoft Visual C++ 6.0\r
+\r
+#if defined(_MSC_VER)\r
+\r
+// get compiler version string\r
+tstring getCompilerVersionString()\r
+{\r
+  TCHAR buf[200];\r
+  _sntprintf(buf, NUMBER_OF(buf),\r
+            _T("Microsoft (R) 32-bit C/C++ Optimizing Compiler Version %d.%02d"),\r
+            _MSC_VER / 100,\r
+            _MSC_VER % 100);\r
+  return tstring(buf);\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Borland C++ 5.5.1\r
+\r
+#elif defined(__BORLANDC__)\r
+\r
+// get compiler version string\r
+tstring getCompilerVersionString()\r
+{\r
+  TCHAR buf[100];\r
+  _sntprintf(buf, NUMBER_OF(buf), _T("Borland C++ %d.%d.%d"),\r
+            __BORLANDC__ / 0x100,\r
+            __BORLANDC__ / 0x10 % 0x10,\r
+            __BORLANDC__ % 0x10);\r
+  return tstring(buf);\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// unknown\r
+\r
+#else\r
+#  error "I don't know the details of this compiler... Plz hack."\r
+\r
+#endif\r
index 7919866..e0c64a9 100644 (file)
@@ -1,16 +1,16 @@
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// compiler_specific_func.h
-
-
-#ifndef _COMPILER_SPECIFIC_FUNC_H
-#  define _COMPILER_SPECIFIC_FUNC_H
-
-#include "misc.h"
-#include "stringtool.h"
-
-
-/// get compiler version string
-tstring getCompilerVersionString();
-
-
-#endif // !_COMPILER_SPECIFIC_FUNC_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// compiler_specific_func.h\r
+\r
+\r
+#ifndef _COMPILER_SPECIFIC_FUNC_H\r
+#  define _COMPILER_SPECIFIC_FUNC_H\r
+\r
+#include "misc.h"\r
+#include "stringtool.h"\r
+\r
+\r
+/// get compiler version string\r
+tstring getCompilerVersionString();\r
+\r
+\r
+#endif // !_COMPILER_SPECIFIC_FUNC_H\r
index ccd5829..8bcc747 100644 (file)
@@ -1,31 +1,31 @@
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \91\8b\8eg\82¢\82Ì\97J\9fT - AX.mayu
-# Copyright (C) 2002, \8f¼\96\94\8e\8bI <matsumoto678@oki.com>
-#
-
-define KBD109onAX
-
-def subst  S-*_2               = $QUOTATION_MARK
-def subst  S-*_6               = $AMPERSAND
-def subst  S-*_7               = $APOSTROPHE
-def subst  S-*_8               = $LEFT_PARENTHESIS
-def subst  S-*_9               = $RIGHT_PARENTHESIS
-
-def subst  S-*BackSlash                = $LOW_LINE
-def subst  S-*_0               = $TILDE # \82±\82ê\82Í\82È\82­\82Ä\82à\82¢\82¢
-
-def subst  S-*Hyphen           = $EQUALS_SIGN
-def subst ~S-*Equal            = $CIRCUMFLEX_ACCENT
-def subst  S-*Equal            = $TILDE
-def subst ~S-*OpenBracket      = $COMMERCIAL_AT
-def subst  S-*OpenBracket      = $GRAVE_ACCENT
-
-def subst ~S-*CloseBracket     = $LEFT_SQUARE_BRACKET
-def subst  S-*CloseBracket     = $LEFT_CURLY_BRACKET
-
-def subst  S-*Semicolon                = $PLUS_SIGN
-def subst ~S-*Quote            = $COLON
-def subst  S-*Quote            = $ASTERISK
-
-def subst ~S-*GraveAccent      = $RIGHT_SQUARE_BRACKET
-def subst  S-*GraveAccent      = $RIGHT_CURLY_BRACKET
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# \91\8b\8eg\82¢\82Ì\97J\9fT - AX.mayu\r
+# Copyright (C) 2002, \8f¼\96\94\8e\8bI <matsumoto678@oki.com>\r
+#\r
+\r
+define KBD109onAX\r
+\r
+def subst  S-*_2               = $QUOTATION_MARK\r
+def subst  S-*_6               = $AMPERSAND\r
+def subst  S-*_7               = $APOSTROPHE\r
+def subst  S-*_8               = $LEFT_PARENTHESIS\r
+def subst  S-*_9               = $RIGHT_PARENTHESIS\r
+\r
+def subst  S-*BackSlash                = $LOW_LINE\r
+def subst  S-*_0               = $TILDE # \82±\82ê\82Í\82È\82­\82Ä\82à\82¢\82¢\r
+\r
+def subst  S-*Hyphen           = $EQUALS_SIGN\r
+def subst ~S-*Equal            = $CIRCUMFLEX_ACCENT\r
+def subst  S-*Equal            = $TILDE\r
+def subst ~S-*OpenBracket      = $COMMERCIAL_AT\r
+def subst  S-*OpenBracket      = $GRAVE_ACCENT\r
+\r
+def subst ~S-*CloseBracket     = $LEFT_SQUARE_BRACKET\r
+def subst  S-*CloseBracket     = $LEFT_CURLY_BRACKET\r
+\r
+def subst  S-*Semicolon                = $PLUS_SIGN\r
+def subst ~S-*Quote            = $COLON\r
+def subst  S-*Quote            = $ASTERISK\r
+\r
+def subst ~S-*GraveAccent      = $RIGHT_SQUARE_BRACKET\r
+def subst  S-*GraveAccent      = $RIGHT_CURLY_BRACKET\r
index f56b0a0..362e25c 100644 (file)
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \91\8b\8eg\82¢\82Ì\97J\9fT - 98x1.mayu
-#
-# derived from 104.mayu, 109.mayu and AX.mayu
-# Copyright (C) 2001, HAJANO Nao`qui <Tory@sneering.104.net>
-#
-
-
-define KBD9801
-define KBD9821
-define KBDRBoard98
-
-
-
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# PC-98x1 \97p\95W\8f\80\83L\81[\83{\81[\83h\81i\81\95\8cÝ\8a·\83L\81[\83{\81[\83h\81j\92è\8b`
-#
-
-def key Esc Escape                     =    0x00
-def key _1                             =    0x01 # 1!
-def key _2                             =    0x02 # 2"
-def key _3                             =    0x03 # 3#
-def key _4                             =    0x04 # 4$
-def key _5                             =    0x05 # 5%
-def key _6                             =    0x06 # 6&
-def key _7                             =    0x07 # 7'
-def key _8                             =    0x08 # 8(
-def key _9                             =    0x09 # 9)
-def key _0                             =    0x0a # 0
-def key HyphenMinus Hyphen Minus       =    0x0b # -=
-def key Caret CircumflexAccent                 =    0x0c # ^`
-def key YenSign Yen                    =    0x0d # \|
-def key BS BackSpace Back              =    0x0e
-def key Tab                            =    0x0f
-def key Q                              =    0x10
-def key W                              =    0x11
-def key E                              =    0x12
-def key R                              =    0x13
-def key T                              =    0x14
-def key Y                              =    0x15
-def key U                              =    0x16
-def key I                              =    0x17
-def key O                              =    0x18
-def key P                              =    0x19
-def key Atmark CommercialAt            =    0x1a # @~
-def key LeftSquareBracket OpenBracket  =    0x1b # [{
-def key Enter Return                   =    0x1c
-def key A                              =    0x1d
-def key S                              =    0x1e
-def key D                              =    0x1f
-def key F                              =    0x20
-def key G                              =    0x21
-def key H                              =    0x22
-def key J                              =    0x23
-def key K                              =    0x24
-def key L                              =    0x25
-def key Semicolon                      =    0x26 # ;+
-def key Colon                          =    0x27 # :*
-def key RightSquareBracket CloseBracket =    0x28 # ]}
-def key Z                              =    0x29
-def key X                              =    0x2a
-def key C                              =    0x2b
-def key V                              =    0x2c
-def key B                              =    0x2d
-def key N                              =    0x2e
-def key M                              =    0x2f
-def key Comma                          =    0x30 # ,<
-def key FullStop Period                =    0x31 # .>
-def key Solidus Slash                  =    0x32 # /?
-def key _0xdf UNDERBAR                         =    0x33 #  _
-def key Space \83X\83y\81[\83X                 =    0x34
-def key XFER Kanji                     =    0x35
-def key ROLLUP PageDown Next           =    0x36
-def key ROLLDOWN PageUp Prior          =    0x37
-def key INS Insert                     =    0x38
-def key DEL Delete                     =    0x39
-def key \81ª Up                          =    0x3a
-def key \81© Left                                =    0x3b
-def key \81¨ Right                       =    0x3c
-def key \81« Down                                =    0x3d
-def key CLR Home Clear                 =    0x3e
-def key HELP End                       =    0x3f
-def key Subtract NumHyphenMinus NumMinus       =    0x40 # \83e\83\93\83L\81[ -
-def key Divide NumSolidus NumSlash     =    0x41 # \83e\83\93\83L\81[ /
-def key Numpad7 Num7                   =    0x42 # \83e\83\93\83L\81[ 7
-def key Numpad8 Num8                   =    0x43 # \83e\83\93\83L\81[ 8
-def key Numpad9 Num9                   =    0x44 # \83e\83\93\83L\81[ 9
-def key Multiply NumAsterisk NumMultiply       =    0x45 # \83e\83\93\83L\81[ *
-def key Numpad4 Num4                   =    0x46 # \83e\83\93\83L\81[ 4
-def key Numpad5 Num5                   =    0x47 # \83e\83\93\83L\81[ 5
-def key Numpad6 Num6                   =    0x48 # \83e\83\93\83L\81[ 6
-def key Add NumPlusSign NumPlus                =    0x49 # \83e\83\93\83L\81[ +
-def key Numpad1 Num1                   =    0x4a # \83e\83\93\83L\81[ 1
-def key Numpad2 Num2                   =    0x4b # \83e\83\93\83L\81[ 2
-def key Numpad3 Num3                   =    0x4c # \83e\83\93\83L\81[ 3
-def key TYLOR NumEqualsSign NumEquals  =    0x4d # \83e\83\93\83L\81[ =
-def key Numpad0 Num0                   =    0x4e # \83e\83\93\83L\81[ 0
-def key Separator NumComma             =    0x4f # \83e\83\93\83L\81[ ,
-def key Decimal NumFullStop NumPeriod  =    0x50 # \83e\83\93\83L\81[ .
-def key NFER NonConvert                        =    0x51
-def key vf1 F11                                =    0x52
-def key vf2 F12                                =    0x53
-def key vf3 F13                                =    0x54
-def key vf4 F14                                =    0x55
-def key vf5 F15                                =    0x56
-
-def key STOP Pause                     =    0x60
-def key COPY Snapshot PrintScreen      =    0x61
-def key F1                             =    0x62
-def key F2                             =    0x63
-def key F3                             =    0x64
-def key F4                             =    0x65
-def key F5                             =    0x66
-def key F6                             =    0x67
-def key F7                             =    0x68
-def key F8                             =    0x69
-def key F9                             =    0x6a
-def key F10                            =    0x6b
-
-def key SHIFT                          =    0x70
-def key CAPS Capital CapsLock          =    0x71
-def key \82©\82È \83J\83i Kana                 =    0x72
-def key GRPH Menu Alt Meta             =    0x73
-def key CTRL Control                   =    0x74
-
-def key LWin LWindows LeftWindows      =    0x77
-def key RWin RWindows RightWindows     =    0x78
-def key Apps Applications              =    0x79
-
-def sync                               =    0x7a # &Sync \82Å\8eg\82¤\83X\83L\83\83\83\93\83R\81[\83h
-
-def mod Shift  = SHIFT
-def mod Alt    = GRPH
-def mod Control        = CTRL
-def mod Windows        = LWindows RWindows
-
-
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \83L\81[\83V\81[\83P\83\93\83X\92è\8b`
-#
-
-keyseq $ToggleIME              = C-XFER
-keyseq $CapsLock               = CAPS
-
-keyseq $SPACE                  = ~S-*Space                     #  
-keyseq $EXCLAMATION_MARK       =  S-*_1                        # !
-keyseq $QUOTATION_MARK         =  S-*_2                        # "
-keyseq $NUMBER_SIGN            =  S-*_3                        # #
-keyseq $DOLLAR_SIGN            =  S-*_4                        # $
-keyseq $PERCENT_SIGN           =  S-*_5                        # %
-keyseq $AMPERSAND              =  S-*_6                        # &
-keyseq $APOSTROPHE             =  S-*_7                        # '
-keyseq $LEFT_PARENTHESIS       =  S-*_8                        # (
-keyseq $RIGHT_PARENTHESIS      =  S-*_9                        # )
-keyseq $ASTERISK               =  S-*Colon                     # *
-keyseq $PLUS_SIGN              =  S-*Semicolon                 # +
-keyseq $COMMA                  = ~S-*Comma                     # ,
-keyseq $HYPHEN-MINUS           = ~S-*HyphenMinus               # -
-keyseq $FULL_STOP              = ~S-*FullStop                  # .
-keyseq $SOLIDUS                        = ~S-*Solidus                   # /
-keyseq $DIGIT_ZERO             = ~S-*_0                        # 0
-keyseq $DIGIT_ONE              = ~S-*_1                        # 1
-keyseq $DIGIT_TWO              = ~S-*_2                        # 2
-keyseq $DIGIT_THREE            = ~S-*_3                        # 3
-keyseq $DIGIT_FOUR             = ~S-*_4                        # 4
-keyseq $DIGIT_FIVE             = ~S-*_5                        # 5
-keyseq $DIGIT_SIX              = ~S-*_6                        # 6
-keyseq $DIGIT_SEVEN            = ~S-*_7                        # 7
-keyseq $DIGIT_EIGHT            = ~S-*_8                        # 8
-keyseq $DIGIT_NINE             = ~S-*_9                        # 9
-keyseq $COLON                  = ~S-*Colon                     # :
-keyseq $SEMICOLON              = ~S-*Semicolon                 # ;
-keyseq $LESS-THAN_SIGN         =  S-*Comma                     # <
-keyseq $EQUALS_SIGN            =  S-*HyphenMinus               # =
-keyseq $GREATER-THAN_SIGN      =  S-*FullStop                  # >
-keyseq $QUESTION_MARK          =  S-*Solidus                   # ?
-keyseq $COMMERCIAL_AT          = ~S-*CommercialAt              # @
-keyseq $LATIN_CAPITAL_LETTER_A =  S-*A                         # A
-keyseq $LATIN_CAPITAL_LETTER_B =  S-*B                         # B
-keyseq $LATIN_CAPITAL_LETTER_C =  S-*C                         # C
-keyseq $LATIN_CAPITAL_LETTER_D =  S-*D                         # D
-keyseq $LATIN_CAPITAL_LETTER_E =  S-*E                         # E
-keyseq $LATIN_CAPITAL_LETTER_F =  S-*F                         # F
-keyseq $LATIN_CAPITAL_LETTER_G =  S-*G                         # G
-keyseq $LATIN_CAPITAL_LETTER_H =  S-*H                         # H
-keyseq $LATIN_CAPITAL_LETTER_I =  S-*I                         # I
-keyseq $LATIN_CAPITAL_LETTER_J =  S-*J                         # J
-keyseq $LATIN_CAPITAL_LETTER_K =  S-*K                         # K
-keyseq $LATIN_CAPITAL_LETTER_L =  S-*L                         # L
-keyseq $LATIN_CAPITAL_LETTER_M =  S-*M                         # M
-keyseq $LATIN_CAPITAL_LETTER_N =  S-*N                         # N
-keyseq $LATIN_CAPITAL_LETTER_O =  S-*O                         # O
-keyseq $LATIN_CAPITAL_LETTER_P =  S-*P                         # P
-keyseq $LATIN_CAPITAL_LETTER_Q =  S-*Q                         # Q
-keyseq $LATIN_CAPITAL_LETTER_R =  S-*R                         # R
-keyseq $LATIN_CAPITAL_LETTER_S =  S-*S                         # S
-keyseq $LATIN_CAPITAL_LETTER_T =  S-*T                         # T
-keyseq $LATIN_CAPITAL_LETTER_U =  S-*U                         # U
-keyseq $LATIN_CAPITAL_LETTER_V =  S-*V                         # V
-keyseq $LATIN_CAPITAL_LETTER_W =  S-*W                         # W
-keyseq $LATIN_CAPITAL_LETTER_X =  S-*X                         # X
-keyseq $LATIN_CAPITAL_LETTER_Y =  S-*Y                         # Y
-keyseq $LATIN_CAPITAL_LETTER_Z =  S-*Z                         # Z
-keyseq $LEFT_SQUARE_BRACKET    = ~S-*LeftSquareBracket         # [
-keyseq $REVERSE_SOLIDUS                = ~S-*YenSign                   # \
-keyseq $RIGHT_SQUARE_BRACKET   = ~S-*RightSquareBracket        # ]
-keyseq $CIRCUMFLEX_ACCENT      = ~S-*CircumflexAccent          # ^
-keyseq $LOW_LINE               =  S-*_0xdf                     # _
-keyseq $GRAVE_ACCENT           =  S-*CircumflexAccent          # `
-keyseq $LATIN_SMALL_LETTER_A   = ~S-*A                         # a
-keyseq $LATIN_SMALL_LETTER_B   = ~S-*B                         # b
-keyseq $LATIN_SMALL_LETTER_C   = ~S-*C                         # c
-keyseq $LATIN_SMALL_LETTER_D   = ~S-*D                         # d
-keyseq $LATIN_SMALL_LETTER_E   = ~S-*E                         # e
-keyseq $LATIN_SMALL_LETTER_F   = ~S-*F                         # f
-keyseq $LATIN_SMALL_LETTER_G   = ~S-*G                         # g
-keyseq $LATIN_SMALL_LETTER_H   = ~S-*H                         # h
-keyseq $LATIN_SMALL_LETTER_I   = ~S-*I                         # i
-keyseq $LATIN_SMALL_LETTER_J   = ~S-*J                         # j
-keyseq $LATIN_SMALL_LETTER_K   = ~S-*K                         # k
-keyseq $LATIN_SMALL_LETTER_L   = ~S-*L                         # l
-keyseq $LATIN_SMALL_LETTER_M   = ~S-*M                         # m
-keyseq $LATIN_SMALL_LETTER_N   = ~S-*N                         # n
-keyseq $LATIN_SMALL_LETTER_O   = ~S-*O                         # o
-keyseq $LATIN_SMALL_LETTER_P   = ~S-*P                         # p
-keyseq $LATIN_SMALL_LETTER_Q   = ~S-*Q                         # q
-keyseq $LATIN_SMALL_LETTER_R   = ~S-*R                         # r
-keyseq $LATIN_SMALL_LETTER_S   = ~S-*S                         # s
-keyseq $LATIN_SMALL_LETTER_T   = ~S-*T                         # t
-keyseq $LATIN_SMALL_LETTER_U   = ~S-*U                         # u
-keyseq $LATIN_SMALL_LETTER_V   = ~S-*V                         # v
-keyseq $LATIN_SMALL_LETTER_W   = ~S-*W                         # w
-keyseq $LATIN_SMALL_LETTER_X   = ~S-*X                         # x
-keyseq $LATIN_SMALL_LETTER_Y   = ~S-*Y                         # y
-keyseq $LATIN_SMALL_LETTER_Z   = ~S-*Z                         # z
-keyseq $LEFT_CURLY_BRACKET     =  S-*LeftSquareBracket         # {
-keyseq $VERTICAL_LINE          =  S-*YenSign                   # |
-keyseq $RIGHT_CURLY_BRACKET    =  S-*RightSquareBracket        # }
-keyseq $TILDE                  =  S-*CommercialAt              # ~
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# \91\8b\8eg\82¢\82Ì\97J\9fT - 98x1.mayu\r
+#\r
+# derived from 104.mayu, 109.mayu and AX.mayu\r
+# Copyright (C) 2001, HAJANO Nao`qui <Tory@sneering.104.net>\r
+#\r
+\r
+\r
+define KBD9801\r
+define KBD9821\r
+define KBDRBoard98\r
+\r
+\r
+\r
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# PC-98x1 \97p\95W\8f\80\83L\81[\83{\81[\83h\81i\81\95\8cÝ\8a·\83L\81[\83{\81[\83h\81j\92è\8b`\r
+#\r
+\r
+def key Esc Escape                     =    0x00\r
+def key _1                             =    0x01 # 1!\r
+def key _2                             =    0x02 # 2"\r
+def key _3                             =    0x03 # 3#\r
+def key _4                             =    0x04 # 4$\r
+def key _5                             =    0x05 # 5%\r
+def key _6                             =    0x06 # 6&\r
+def key _7                             =    0x07 # 7'\r
+def key _8                             =    0x08 # 8(\r
+def key _9                             =    0x09 # 9)\r
+def key _0                             =    0x0a # 0\r
+def key HyphenMinus Hyphen Minus       =    0x0b # -=\r
+def key Caret CircumflexAccent                 =    0x0c # ^`\r
+def key YenSign Yen                    =    0x0d # \|\r
+def key BS BackSpace Back              =    0x0e\r
+def key Tab                            =    0x0f\r
+def key Q                              =    0x10\r
+def key W                              =    0x11\r
+def key E                              =    0x12\r
+def key R                              =    0x13\r
+def key T                              =    0x14\r
+def key Y                              =    0x15\r
+def key U                              =    0x16\r
+def key I                              =    0x17\r
+def key O                              =    0x18\r
+def key P                              =    0x19\r
+def key Atmark CommercialAt            =    0x1a # @~\r
+def key LeftSquareBracket OpenBracket  =    0x1b # [{\r
+def key Enter Return                   =    0x1c\r
+def key A                              =    0x1d\r
+def key S                              =    0x1e\r
+def key D                              =    0x1f\r
+def key F                              =    0x20\r
+def key G                              =    0x21\r
+def key H                              =    0x22\r
+def key J                              =    0x23\r
+def key K                              =    0x24\r
+def key L                              =    0x25\r
+def key Semicolon                      =    0x26 # ;+\r
+def key Colon                          =    0x27 # :*\r
+def key RightSquareBracket CloseBracket =    0x28 # ]}\r
+def key Z                              =    0x29\r
+def key X                              =    0x2a\r
+def key C                              =    0x2b\r
+def key V                              =    0x2c\r
+def key B                              =    0x2d\r
+def key N                              =    0x2e\r
+def key M                              =    0x2f\r
+def key Comma                          =    0x30 # ,<\r
+def key FullStop Period                =    0x31 # .>\r
+def key Solidus Slash                  =    0x32 # /?\r
+def key _0xdf UNDERBAR                         =    0x33 #  _\r
+def key Space \83X\83y\81[\83X                 =    0x34\r
+def key XFER Kanji                     =    0x35\r
+def key ROLLUP PageDown Next           =    0x36\r
+def key ROLLDOWN PageUp Prior          =    0x37\r
+def key INS Insert                     =    0x38\r
+def key DEL Delete                     =    0x39\r
+def key \81ª Up                          =    0x3a\r
+def key \81© Left                                =    0x3b\r
+def key \81¨ Right                       =    0x3c\r
+def key \81« Down                                =    0x3d\r
+def key CLR Home Clear                 =    0x3e\r
+def key HELP End                       =    0x3f\r
+def key Subtract NumHyphenMinus NumMinus       =    0x40 # \83e\83\93\83L\81[ -\r
+def key Divide NumSolidus NumSlash     =    0x41 # \83e\83\93\83L\81[ /\r
+def key Numpad7 Num7                   =    0x42 # \83e\83\93\83L\81[ 7\r
+def key Numpad8 Num8                   =    0x43 # \83e\83\93\83L\81[ 8\r
+def key Numpad9 Num9                   =    0x44 # \83e\83\93\83L\81[ 9\r
+def key Multiply NumAsterisk NumMultiply       =    0x45 # \83e\83\93\83L\81[ *\r
+def key Numpad4 Num4                   =    0x46 # \83e\83\93\83L\81[ 4\r
+def key Numpad5 Num5                   =    0x47 # \83e\83\93\83L\81[ 5\r
+def key Numpad6 Num6                   =    0x48 # \83e\83\93\83L\81[ 6\r
+def key Add NumPlusSign NumPlus                =    0x49 # \83e\83\93\83L\81[ +\r
+def key Numpad1 Num1                   =    0x4a # \83e\83\93\83L\81[ 1\r
+def key Numpad2 Num2                   =    0x4b # \83e\83\93\83L\81[ 2\r
+def key Numpad3 Num3                   =    0x4c # \83e\83\93\83L\81[ 3\r
+def key TYLOR NumEqualsSign NumEquals  =    0x4d # \83e\83\93\83L\81[ =\r
+def key Numpad0 Num0                   =    0x4e # \83e\83\93\83L\81[ 0\r
+def key Separator NumComma             =    0x4f # \83e\83\93\83L\81[ ,\r
+def key Decimal NumFullStop NumPeriod  =    0x50 # \83e\83\93\83L\81[ .\r
+def key NFER NonConvert                        =    0x51\r
+def key vf1 F11                                =    0x52\r
+def key vf2 F12                                =    0x53\r
+def key vf3 F13                                =    0x54\r
+def key vf4 F14                                =    0x55\r
+def key vf5 F15                                =    0x56\r
+\r
+def key STOP Pause                     =    0x60\r
+def key COPY Snapshot PrintScreen      =    0x61\r
+def key F1                             =    0x62\r
+def key F2                             =    0x63\r
+def key F3                             =    0x64\r
+def key F4                             =    0x65\r
+def key F5                             =    0x66\r
+def key F6                             =    0x67\r
+def key F7                             =    0x68\r
+def key F8                             =    0x69\r
+def key F9                             =    0x6a\r
+def key F10                            =    0x6b\r
+\r
+def key SHIFT                          =    0x70\r
+def key CAPS Capital CapsLock          =    0x71\r
+def key \82©\82È \83J\83i Kana                 =    0x72\r
+def key GRPH Menu Alt Meta             =    0x73\r
+def key CTRL Control                   =    0x74\r
+\r
+def key LWin LWindows LeftWindows      =    0x77\r
+def key RWin RWindows RightWindows     =    0x78\r
+def key Apps Applications              =    0x79\r
+\r
+def sync                               =    0x7a # &Sync \82Å\8eg\82¤\83X\83L\83\83\83\93\83R\81[\83h\r
+\r
+def mod Shift  = SHIFT\r
+def mod Alt    = GRPH\r
+def mod Control        = CTRL\r
+def mod Windows        = LWindows RWindows\r
+\r
+\r
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# \83L\81[\83V\81[\83P\83\93\83X\92è\8b`\r
+#\r
+\r
+keyseq $ToggleIME              = C-XFER\r
+keyseq $CapsLock               = CAPS\r
+\r
+keyseq $SPACE                  = ~S-*Space                     #  \r
+keyseq $EXCLAMATION_MARK       =  S-*_1                        # !\r
+keyseq $QUOTATION_MARK         =  S-*_2                        # "\r
+keyseq $NUMBER_SIGN            =  S-*_3                        # #\r
+keyseq $DOLLAR_SIGN            =  S-*_4                        # $\r
+keyseq $PERCENT_SIGN           =  S-*_5                        # %\r
+keyseq $AMPERSAND              =  S-*_6                        # &\r
+keyseq $APOSTROPHE             =  S-*_7                        # '\r
+keyseq $LEFT_PARENTHESIS       =  S-*_8                        # (\r
+keyseq $RIGHT_PARENTHESIS      =  S-*_9                        # )\r
+keyseq $ASTERISK               =  S-*Colon                     # *\r
+keyseq $PLUS_SIGN              =  S-*Semicolon                 # +\r
+keyseq $COMMA                  = ~S-*Comma                     # ,\r
+keyseq $HYPHEN-MINUS           = ~S-*HyphenMinus               # -\r
+keyseq $FULL_STOP              = ~S-*FullStop                  # .\r
+keyseq $SOLIDUS                        = ~S-*Solidus                   # /\r
+keyseq $DIGIT_ZERO             = ~S-*_0                        # 0\r
+keyseq $DIGIT_ONE              = ~S-*_1                        # 1\r
+keyseq $DIGIT_TWO              = ~S-*_2                        # 2\r
+keyseq $DIGIT_THREE            = ~S-*_3                        # 3\r
+keyseq $DIGIT_FOUR             = ~S-*_4                        # 4\r
+keyseq $DIGIT_FIVE             = ~S-*_5                        # 5\r
+keyseq $DIGIT_SIX              = ~S-*_6                        # 6\r
+keyseq $DIGIT_SEVEN            = ~S-*_7                        # 7\r
+keyseq $DIGIT_EIGHT            = ~S-*_8                        # 8\r
+keyseq $DIGIT_NINE             = ~S-*_9                        # 9\r
+keyseq $COLON                  = ~S-*Colon                     # :\r
+keyseq $SEMICOLON              = ~S-*Semicolon                 # ;\r
+keyseq $LESS-THAN_SIGN         =  S-*Comma                     # <\r
+keyseq $EQUALS_SIGN            =  S-*HyphenMinus               # =\r
+keyseq $GREATER-THAN_SIGN      =  S-*FullStop                  # >\r
+keyseq $QUESTION_MARK          =  S-*Solidus                   # ?\r
+keyseq $COMMERCIAL_AT          = ~S-*CommercialAt              # @\r
+keyseq $LATIN_CAPITAL_LETTER_A =  S-*A                         # A\r
+keyseq $LATIN_CAPITAL_LETTER_B =  S-*B                         # B\r
+keyseq $LATIN_CAPITAL_LETTER_C =  S-*C                         # C\r
+keyseq $LATIN_CAPITAL_LETTER_D =  S-*D                         # D\r
+keyseq $LATIN_CAPITAL_LETTER_E =  S-*E                         # E\r
+keyseq $LATIN_CAPITAL_LETTER_F =  S-*F                         # F\r
+keyseq $LATIN_CAPITAL_LETTER_G =  S-*G                         # G\r
+keyseq $LATIN_CAPITAL_LETTER_H =  S-*H                         # H\r
+keyseq $LATIN_CAPITAL_LETTER_I =  S-*I                         # I\r
+keyseq $LATIN_CAPITAL_LETTER_J =  S-*J                         # J\r
+keyseq $LATIN_CAPITAL_LETTER_K =  S-*K                         # K\r
+keyseq $LATIN_CAPITAL_LETTER_L =  S-*L                         # L\r
+keyseq $LATIN_CAPITAL_LETTER_M =  S-*M                         # M\r
+keyseq $LATIN_CAPITAL_LETTER_N =  S-*N                         # N\r
+keyseq $LATIN_CAPITAL_LETTER_O =  S-*O                         # O\r
+keyseq $LATIN_CAPITAL_LETTER_P =  S-*P                         # P\r
+keyseq $LATIN_CAPITAL_LETTER_Q =  S-*Q                         # Q\r
+keyseq $LATIN_CAPITAL_LETTER_R =  S-*R                         # R\r
+keyseq $LATIN_CAPITAL_LETTER_S =  S-*S                         # S\r
+keyseq $LATIN_CAPITAL_LETTER_T =  S-*T                         # T\r
+keyseq $LATIN_CAPITAL_LETTER_U =  S-*U                         # U\r
+keyseq $LATIN_CAPITAL_LETTER_V =  S-*V                         # V\r
+keyseq $LATIN_CAPITAL_LETTER_W =  S-*W                         # W\r
+keyseq $LATIN_CAPITAL_LETTER_X =  S-*X                         # X\r
+keyseq $LATIN_CAPITAL_LETTER_Y =  S-*Y                         # Y\r
+keyseq $LATIN_CAPITAL_LETTER_Z =  S-*Z                         # Z\r
+keyseq $LEFT_SQUARE_BRACKET    = ~S-*LeftSquareBracket         # [\r
+keyseq $REVERSE_SOLIDUS                = ~S-*YenSign                   # \\r
+keyseq $RIGHT_SQUARE_BRACKET   = ~S-*RightSquareBracket        # ]\r
+keyseq $CIRCUMFLEX_ACCENT      = ~S-*CircumflexAccent          # ^\r
+keyseq $LOW_LINE               =  S-*_0xdf                     # _\r
+keyseq $GRAVE_ACCENT           =  S-*CircumflexAccent          # `\r
+keyseq $LATIN_SMALL_LETTER_A   = ~S-*A                         # a\r
+keyseq $LATIN_SMALL_LETTER_B   = ~S-*B                         # b\r
+keyseq $LATIN_SMALL_LETTER_C   = ~S-*C                         # c\r
+keyseq $LATIN_SMALL_LETTER_D   = ~S-*D                         # d\r
+keyseq $LATIN_SMALL_LETTER_E   = ~S-*E                         # e\r
+keyseq $LATIN_SMALL_LETTER_F   = ~S-*F                         # f\r
+keyseq $LATIN_SMALL_LETTER_G   = ~S-*G                         # g\r
+keyseq $LATIN_SMALL_LETTER_H   = ~S-*H                         # h\r
+keyseq $LATIN_SMALL_LETTER_I   = ~S-*I                         # i\r
+keyseq $LATIN_SMALL_LETTER_J   = ~S-*J                         # j\r
+keyseq $LATIN_SMALL_LETTER_K   = ~S-*K                         # k\r
+keyseq $LATIN_SMALL_LETTER_L   = ~S-*L                         # l\r
+keyseq $LATIN_SMALL_LETTER_M   = ~S-*M                         # m\r
+keyseq $LATIN_SMALL_LETTER_N   = ~S-*N                         # n\r
+keyseq $LATIN_SMALL_LETTER_O   = ~S-*O                         # o\r
+keyseq $LATIN_SMALL_LETTER_P   = ~S-*P                         # p\r
+keyseq $LATIN_SMALL_LETTER_Q   = ~S-*Q                         # q\r
+keyseq $LATIN_SMALL_LETTER_R   = ~S-*R                         # r\r
+keyseq $LATIN_SMALL_LETTER_S   = ~S-*S                         # s\r
+keyseq $LATIN_SMALL_LETTER_T   = ~S-*T                         # t\r
+keyseq $LATIN_SMALL_LETTER_U   = ~S-*U                         # u\r
+keyseq $LATIN_SMALL_LETTER_V   = ~S-*V                         # v\r
+keyseq $LATIN_SMALL_LETTER_W   = ~S-*W                         # w\r
+keyseq $LATIN_SMALL_LETTER_X   = ~S-*X                         # x\r
+keyseq $LATIN_SMALL_LETTER_Y   = ~S-*Y                         # y\r
+keyseq $LATIN_SMALL_LETTER_Z   = ~S-*Z                         # z\r
+keyseq $LEFT_CURLY_BRACKET     =  S-*LeftSquareBracket         # {\r
+keyseq $VERTICAL_LINE          =  S-*YenSign                   # |\r
+keyseq $RIGHT_CURLY_BRACKET    =  S-*RightSquareBracket        # }\r
+keyseq $TILDE                  =  S-*CommercialAt              # ~\r
index 2cd6c08..29a7d0e 100644 (file)
@@ -1,79 +1,79 @@
-#
-# DVORAKon109.mayu - dvorak layout on 109 layout for \91\8b\8eg\82¢\82Ì\97J\9fT
-#
-#
-# dvorak\83L\81[\94z\97ñ\82ð109\83L\81[\8fã\82É\8eÀ\8c»\82·\82é\81B
-# \83L\81[\94z\97ñ\82Í\81A\88È\89º\82Ì\82æ\82¤\82É\82È\82é\81B\8bó\94\92\82Ì\95\94\95ª\82Í\95Ï\8dX\82µ\82È\82¢\81B
-# S-0 \82ª ~ \82É\82È\82é\82±\82Æ\82Æ\81AS-^ \82ª _ \82É\82È\82é\82±\82Æ\82ð\8f\9c\82¯\82Î\81A\83L\81[\88Ê\92u\82ð\8cð\8a·\82µ\81A
-# ]} \82Å\82 \82Á\82½\88Ê\92u\82É Contol \82ð\92u\82¢\82½\82¾\82¯\81B(\_ \82Í\95s\97v\82É\82È\82é\82½\82ß\81B)
-#
-# ----------------------------------------------------------------------------
-# |    |  ! |  " |  # |  $ |  % |  & |  ' |  ( |  ) |  ~ |  { |  } |  ` |    |
-# |    | 1  | 2  | 3  | 4  | 5  | 6  | 7  | 8  | 9  | 0  | [  | ]  | @  |    |
-# ----------------------------------------------------------------------------
-# |       |  * |  < |  > |  P |  Y |  F |  G |  C |  R |  L |  ? |  _ |      |
-# |       | :  | ,  | .  |    |    |    |    |    |    |    | /  | ^  |      |
-# ----------------------------------------------------------------------     |
-# |        |  A |  O |  E |  U |  I |  D |  H |  T |  N |  S |  = |    |     |
-# |        |    |    |    |    |    |    |    |    |    |    | -  |Ctrl|     |
-# ----------------------------------------------------------------------------
-# |          |  + |  Q |  J |  K |  X |  B |  M |  W |  V |  Z |  | |        |
-# |          | ;  |    |    |    |    |    |    |    |    |    | \  |        |
-# ----------------------------------------------------------------------------
-#
-
-define KBDDVORAKon109
-
-
-# \88ê\92i\96Ú
-def subst S-*_0                                = $TILDE
-def subst *Minus                       = *LeftSquareBracket
-def subst *CircumflexAccent            = *RightSquareBracket
-def subst *YenSign                     = *Atmark
-
-# \93ñ\92i\96Ú
-def subst *Q                           = *Colon
-def subst *W                           = *Comma
-def subst *E                           = *Period
-def subst *R                           = *P
-def subst *T                           = *Y
-def subst *Y                           = *F
-def subst *U                           = *G
-def subst *I                           = *C
-def subst *O                           = *R
-def subst *P                           = *L
-def subst *Atmark                      = *Slash
-def subst ~S-*LeftSquareBracket                = $CIRCUMFLEX_ACCENT
-def subst  S-*LeftSquareBracket        = $LOW_LINE
-
-# \8eO\92i\96Ú
-def subst *A                           = *A
-def subst *S                           = *O
-def subst *D                           = *E
-def subst *F                           = *U
-def subst *G                           = *I
-def subst *H                           = *D
-def subst *J                           = *H
-def subst *K                           = *T
-def subst *L                           = *N
-def subst *Semicolon                   = *S
-def subst *Colon                       = *Minus
-def subst *RightSquareBracket          = ~S-*ReverseSolidus    # temporary
-
-# \8el\92i\96Ú
-def subst *Z                           = *Semicolon
-def subst *X                           = *Q
-def subst *C                           = *J
-def subst *V                           = *K
-def subst *B                           = *X
-def subst *N                           = *B
-def subst *M                           = *M
-def subst *Comma                       = *W
-def subst *Period                      = *V
-def subst *Slash                       = *Z
-def subst *BackSlash                   = *YenSign
-
-
-keymap Global
- mod control += RightSquareBracket
- key ~S-*ReverseSolidus                        = *RControl
+#\r
+# DVORAKon109.mayu - dvorak layout on 109 layout for \91\8b\8eg\82¢\82Ì\97J\9fT\r
+#\r
+#\r
+# dvorak\83L\81[\94z\97ñ\82ð109\83L\81[\8fã\82É\8eÀ\8c»\82·\82é\81B\r
+# \83L\81[\94z\97ñ\82Í\81A\88È\89º\82Ì\82æ\82¤\82É\82È\82é\81B\8bó\94\92\82Ì\95\94\95ª\82Í\95Ï\8dX\82µ\82È\82¢\81B\r
+# S-0 \82ª ~ \82É\82È\82é\82±\82Æ\82Æ\81AS-^ \82ª _ \82É\82È\82é\82±\82Æ\82ð\8f\9c\82¯\82Î\81A\83L\81[\88Ê\92u\82ð\8cð\8a·\82µ\81A\r
+# ]} \82Å\82 \82Á\82½\88Ê\92u\82É Contol \82ð\92u\82¢\82½\82¾\82¯\81B(\_ \82Í\95s\97v\82É\82È\82é\82½\82ß\81B)\r
+#\r
+# ----------------------------------------------------------------------------\r
+# |    |  ! |  " |  # |  $ |  % |  & |  ' |  ( |  ) |  ~ |  { |  } |  ` |    |\r
+# |    | 1  | 2  | 3  | 4  | 5  | 6  | 7  | 8  | 9  | 0  | [  | ]  | @  |    |\r
+# ----------------------------------------------------------------------------\r
+# |       |  * |  < |  > |  P |  Y |  F |  G |  C |  R |  L |  ? |  _ |      |\r
+# |       | :  | ,  | .  |    |    |    |    |    |    |    | /  | ^  |      |\r
+# ----------------------------------------------------------------------     |\r
+# |        |  A |  O |  E |  U |  I |  D |  H |  T |  N |  S |  = |    |     |\r
+# |        |    |    |    |    |    |    |    |    |    |    | -  |Ctrl|     |\r
+# ----------------------------------------------------------------------------\r
+# |          |  + |  Q |  J |  K |  X |  B |  M |  W |  V |  Z |  | |        |\r
+# |          | ;  |    |    |    |    |    |    |    |    |    | \  |        |\r
+# ----------------------------------------------------------------------------\r
+#\r
+\r
+define KBDDVORAKon109\r
+\r
+\r
+# \88ê\92i\96Ú\r
+def subst S-*_0                                = $TILDE\r
+def subst *Minus                       = *LeftSquareBracket\r
+def subst *CircumflexAccent            = *RightSquareBracket\r
+def subst *YenSign                     = *Atmark\r
+\r
+# \93ñ\92i\96Ú\r
+def subst *Q                           = *Colon\r
+def subst *W                           = *Comma\r
+def subst *E                           = *Period\r
+def subst *R                           = *P\r
+def subst *T                           = *Y\r
+def subst *Y                           = *F\r
+def subst *U                           = *G\r
+def subst *I                           = *C\r
+def subst *O                           = *R\r
+def subst *P                           = *L\r
+def subst *Atmark                      = *Slash\r
+def subst ~S-*LeftSquareBracket                = $CIRCUMFLEX_ACCENT\r
+def subst  S-*LeftSquareBracket        = $LOW_LINE\r
+\r
+# \8eO\92i\96Ú\r
+def subst *A                           = *A\r
+def subst *S                           = *O\r
+def subst *D                           = *E\r
+def subst *F                           = *U\r
+def subst *G                           = *I\r
+def subst *H                           = *D\r
+def subst *J                           = *H\r
+def subst *K                           = *T\r
+def subst *L                           = *N\r
+def subst *Semicolon                   = *S\r
+def subst *Colon                       = *Minus\r
+def subst *RightSquareBracket          = ~S-*ReverseSolidus    # temporary\r
+\r
+# \8el\92i\96Ú\r
+def subst *Z                           = *Semicolon\r
+def subst *X                           = *Q\r
+def subst *C                           = *J\r
+def subst *V                           = *K\r
+def subst *B                           = *X\r
+def subst *N                           = *B\r
+def subst *M                           = *M\r
+def subst *Comma                       = *W\r
+def subst *Period                      = *V\r
+def subst *Slash                       = *Z\r
+def subst *BackSlash                   = *YenSign\r
+\r
+\r
+keymap Global\r
+ mod control += RightSquareBracket\r
+ key ~S-*ReverseSolidus                        = *RControl\r
index 471a16d..d7518c2 100644 (file)
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \91\8b\8eg\82¢\82Ì\97J\9fT - AX.mayu
-#
-# derived from 104.mayu, and 109.mayu
-# Copyright (C) 1999-2000, TAGA Nayuta <nayuta@users.sourceforge.net>
-# 
-# AX.mayu
-# Copyright (C) 2000, KAWABE Nobukazu <nbk@imasy.or.jp>
-#
-
-define KBDAX
-
-
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# AX \93ú\96{\8cê\83L\81[\83{\81[\83h\92è\8b`
-#
-
-def key Esc Escape                     =    0x01
-def key _1                             =    0x02 # 1!
-def key _2                             =    0x03 # 2@
-def key _3                             =    0x04 # 3#
-def key _4                             =    0x05 # 4$
-def key _5                             =    0x06 # 5%
-def key _6                             =    0x07 # 6^
-def key _7                             =    0x08 # 7&
-def key _8                             =    0x09 # 8*
-def key _9                             =    0x0a # 9(
-def key _0                             =    0x0b # 0)
-def key HyphenMinus Hyphen Minus       =    0x0c # -_
-def key EqualsSign Equal               =    0x0d # =+
-def key BackSpace BS Back              =    0x0e
-def key Tab                            =    0x0f
-def key Q                              =    0x10
-def key W                              =    0x11
-def key E                              =    0x12
-def key R                              =    0x13
-def key T                              =    0x14
-def key Y                              =    0x15
-def key U                              =    0x16
-def key I                              =    0x17
-def key O                              =    0x18
-def key P                              =    0x19
-def key LeftSquareBracket OpenBracket  =    0x1a # [{
-def key RightSquareBracket CloseBracket        =    0x1b # ]}
-def key Enter Return                   =    0x1c
-def key NumEnter NumReturn             = E0-0x1c
-def key LeftControl LControl LCtrl     =    0x1d
-def key \89p\90\94/\83J\83i Eisuu                        = E0-0x1d # \89p\90\94 \83J\83i
-def key Pause                          = E1-0x1d 0x45 # Pause
-def key A                              =    0x1e
-def key S                              =    0x1f
-def key D                              =    0x20
-def key F                              =    0x21
-def key G                              =    0x22
-def key H                              =    0x23
-def key J                              =    0x24
-def key K                              =    0x25
-def key L                              =    0x26
-def key Semicolon                      =    0x27 # ;:
-def key Apostrophe Quote               =    0x28 # '"
-def key GraveAccent BackQuote          =    0x29 # `~
-def key LeftShift LShift               =    0x2a
-# def ignore                           = E0-0x2a # what is this? (ignore)
-def key YenSign Yen                    =    0x2b # \|
-def key Z                              =    0x2c
-def key X                              =    0x2d
-def key C                              =    0x2e
-def key V                              =    0x2f
-def key B                              =    0x30
-def key N                              =    0x31
-def key M                              =    0x32
-def key Comma                          =    0x33 # ,<
-def key FullStop Period                        =    0x34 # .>
-def key Solidus Slash                  =    0x35 # /?
-def key NumSolidus NumSlash            = E0-0x35 # Numpad /
-def key RightShift RShift              =    0x36
-def key NumAsterisk NumMultiply                =    0x37 # Numpad *
-def key PrintScreen Snapshot           = E0-0x37
-def key LeftAlt LAlt LMenu             =    0x38
-def key \8a¿\8e\9a Kanji                     = E0-0x38 # \8a¿\8e\9a
-def key Space                          =    0x39
-def key CapsLock Capital Caps          =    0x3a # CapsLock
-def key F1                             =    0x3b
-def key F2                             =    0x3c
-def key F3                             =    0x3d
-def key F4                             =    0x3e
-def key F5                             =    0x3f
-def key F6                             =    0x40
-def key F7                             =    0x41
-def key F8                             =    0x42
-def key F9                             =    0x43
-def key F10                            =    0x44
-def key NumLock                                =    0x45
-def key ScrollLock Scroll              =    0x46
-def key Break                          = E0-0x46 # Break
-def key Num7                           =    0x47 # Numpad 7
-def key Home                           = E0-0x47
-def key Num8                           =    0x48 # Numpad 8
-def key \81ª Up                          = E0-0x48
-def key Num9                           =    0x49 # Numpad 9
-def key PageUp Prior                   = E0-0x49
-def key NumHyphenMinus NumMinus                =    0x4a # Numpad -
-def key Num4                           =    0x4b # Numpad 4
-def key \81© Left                                = E0-0x4b
-def key Num5                           =    0x4c # Numpad 5
-def key Num6                           =    0x4d # Numpad 6
-def key \81¨ Right                       = E0-0x4d
-def key NumPlusSign NumPlus            =    0x4e # Numpad +
-def key Num1                           =    0x4f # Numpad 1
-def key End                            = E0-0x4f
-def key Num2                           =    0x50
-def key \81« Down                                = E0-0x50
-def key Num3                           =    0x51
-def key PageDown Next                  = E0-0x51
-def key Num0                           =    0x52
-def key Insert                         = E0-0x52
-def key NumFullStop NumPeriod          =    0x53 # Numpad .
-def key Delete Del                     = E0-0x53
-def key SysRq                          =    0x54
-def key ReverseSolidus BackSlash       =    0x56 # \|
-def key F11                            =    0x57
-def key F12                            =    0x58
-def key \96³\95Ï\8a· NonConvert              =    0x5a # \96³\95Ï\8a·
-def key \95Ï\8a· Convert                   =    0x5b # \95Ï\8a·
-def key AX                             =    0x5c # AX\83L\81[
-def key RightWindows RWindows RWin     = E0-0x5c # (\83L\81[\83{\81[\83h\8fã\82É\82Í\82È\82¢)
-def key Applications Apps              = E0-0x5d # (\83L\81[\83{\81[\83h\8fã\82É\82Í\82È\82¢)
-# def overflow                         =    0xff # overflow (ignore)
-
-def sync                               =    0x7e # scan code used by &Sync
-
-def mod Shift  = LShift RShift
-def mod Alt    = LAlt
-def mod Control        = LControl
-def mod Windows = RWindows
-
-
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# global keymap
-#
-
-keymap Global
- mod Windows += AX
- key *AX                       => *RWindows
-
-# \81EAX \83L\81[\83{\81[\83h\8fã\82É\82Í Windows \83L\81[\82Í\91\8dÝ\82µ\82È\82¢\81B
-# \81EWindows95 \82Å\82Í [AX] \83L\81[\82ª [Windows] \83L\81[\82Ì\96ð\96Ú\82ð\89Ê\82½\82µ\82Ä\82¢\82½\82ª\81A
-#   NT/2000 \82Å\82Í\96³\8e\8b\82³\82ê\82é\81B
-# \81EAX \83L\81[\83{\81[\83h\82Í RWindows \82â Applications \82Ì\83L\81[\83R\81[\83h\82ð\94­\90\82³\82¹\82é
-#   \82±\82Æ\82Í\82È\82¢\82ª\81ANT/2000 \82Ì\83h\83\89\83C\83o\82Í\82±\82ê\82ç\82Ì\83L\81[\83R\81[\83h\82ð\94F\8e¯\82·\82é\81B
-# \81E\82æ\82Á\82Ä\8fã\8bL\82Ì\82æ\82¤\82È\92è\8b`\82ð\82·\82é\82±\82Æ\82Å [AX] \83L\81[\82ð [Windows] \83L\81[\82Æ\82µ
-#   \82Ä\8eg\97p\82·\82é\82±\82Æ\82ª\82Å\82«\82é\81B
-
-
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# define some key sequence
-#
-
-keyseq $ToggleIME              = \8a¿\8e\9a
-keyseq $CapsLock               = CapsLock
-
-keyseq $SPACE                  = ~S-*Space                     #  
-keyseq $EXCLAMATION_MARK       =  S-*_1                        # !
-keyseq $QUOTATION_MARK         =  S-*Apostrophe                # "
-keyseq $NUMBER_SIGN            =  S-*_3                        # #
-keyseq $DOLLAR_SIGN            =  S-*_4                        # $
-keyseq $PERCENT_SIGN           =  S-*_5                        # %
-keyseq $AMPERSAND              =  S-*_7                        # &
-keyseq $APOSTROPHE             = ~S-*Apostrophe                # '
-keyseq $LEFT_PARENTHESIS       =  S-*_9                        # (
-keyseq $RIGHT_PARENTHESIS      =  S-*_0                        # )
-keyseq $ASTERISK               =  S-*_8                        # *
-keyseq $PLUS_SIGN              =  S-*EqualsSign                # +
-keyseq $COMMA                  = ~S-*Comma                     # ,
-keyseq $HYPHEN-MINUS           = ~S-*HyphenMinus               # -
-keyseq $FULL_STOP              = ~S-*FullStop                  # .
-keyseq $SOLIDUS                        = ~S-*Solidus                   # /
-keyseq $DIGIT_ZERO             = ~S-*_0                        # 0
-keyseq $DIGIT_ONE              = ~S-*_1                        # 1
-keyseq $DIGIT_TWO              = ~S-*_2                        # 2
-keyseq $DIGIT_THREE            = ~S-*_3                        # 3
-keyseq $DIGIT_FOUR             = ~S-*_4                        # 4
-keyseq $DIGIT_FIVE             = ~S-*_5                        # 5
-keyseq $DIGIT_SIX              = ~S-*_6                        # 6
-keyseq $DIGIT_SEVEN            = ~S-*_7                        # 7
-keyseq $DIGIT_EIGHT            = ~S-*_8                        # 8
-keyseq $DIGIT_NINE             = ~S-*_9                        # 9
-keyseq $COLON                  =  S-*Semicolon                 # :
-keyseq $SEMICOLON              = ~S-*Semicolon                 # ;
-keyseq $LESS-THAN_SIGN         =  S-*Comma                     # <
-keyseq $EQUALS_SIGN            = ~S-*EqualsSign                # =
-keyseq $GREATER-THAN_SIGN      =  S-*FullStop                  # >
-keyseq $QUESTION_MARK          =  S-*Solidus                   # ?
-keyseq $COMMERCIAL_AT          =  S-*_2                        # @
-keyseq $LATIN_CAPITAL_LETTER_A =  S-*A                         # A
-keyseq $LATIN_CAPITAL_LETTER_B =  S-*B                         # B
-keyseq $LATIN_CAPITAL_LETTER_C =  S-*C                         # C
-keyseq $LATIN_CAPITAL_LETTER_D =  S-*D                         # D
-keyseq $LATIN_CAPITAL_LETTER_E =  S-*E                         # E
-keyseq $LATIN_CAPITAL_LETTER_F =  S-*F                         # F
-keyseq $LATIN_CAPITAL_LETTER_G =  S-*G                         # G
-keyseq $LATIN_CAPITAL_LETTER_H =  S-*H                         # H
-keyseq $LATIN_CAPITAL_LETTER_I =  S-*I                         # I
-keyseq $LATIN_CAPITAL_LETTER_J =  S-*J                         # J
-keyseq $LATIN_CAPITAL_LETTER_K =  S-*K                         # K
-keyseq $LATIN_CAPITAL_LETTER_L =  S-*L                         # L
-keyseq $LATIN_CAPITAL_LETTER_M =  S-*M                         # M
-keyseq $LATIN_CAPITAL_LETTER_N =  S-*N                         # N
-keyseq $LATIN_CAPITAL_LETTER_O =  S-*O                         # O
-keyseq $LATIN_CAPITAL_LETTER_P =  S-*P                         # P
-keyseq $LATIN_CAPITAL_LETTER_Q =  S-*Q                         # Q
-keyseq $LATIN_CAPITAL_LETTER_R =  S-*R                         # R
-keyseq $LATIN_CAPITAL_LETTER_S =  S-*S                         # S
-keyseq $LATIN_CAPITAL_LETTER_T =  S-*T                         # T
-keyseq $LATIN_CAPITAL_LETTER_U =  S-*U                         # U
-keyseq $LATIN_CAPITAL_LETTER_V =  S-*V                         # V
-keyseq $LATIN_CAPITAL_LETTER_W =  S-*W                         # W
-keyseq $LATIN_CAPITAL_LETTER_X =  S-*X                         # X
-keyseq $LATIN_CAPITAL_LETTER_Y =  S-*Y                         # Y
-keyseq $LATIN_CAPITAL_LETTER_Z =  S-*Z                         # Z
-keyseq $LEFT_SQUARE_BRACKET    = ~S-*LeftSquareBracket         # [
-keyseq $REVERSE_SOLIDUS                = ~S-*ReverseSolidus            # \
-keyseq $RIGHT_SQUARE_BRACKET   = ~S-*RightSquareBracket        # ]
-keyseq $CIRCUMFLEX_ACCENT      =  S-*_6                        # ^
-keyseq $LOW_LINE               =  S-*HyphenMinus               # _
-keyseq $GRAVE_ACCENT           = ~S-*GraveAccent               # `
-keyseq $LATIN_SMALL_LETTER_A   = ~S-*A                         # a
-keyseq $LATIN_SMALL_LETTER_B   = ~S-*B                         # b
-keyseq $LATIN_SMALL_LETTER_C   = ~S-*C                         # c
-keyseq $LATIN_SMALL_LETTER_D   = ~S-*D                         # d
-keyseq $LATIN_SMALL_LETTER_E   = ~S-*E                         # e
-keyseq $LATIN_SMALL_LETTER_F   = ~S-*F                         # f
-keyseq $LATIN_SMALL_LETTER_G   = ~S-*G                         # g
-keyseq $LATIN_SMALL_LETTER_H   = ~S-*H                         # h
-keyseq $LATIN_SMALL_LETTER_I   = ~S-*I                         # i
-keyseq $LATIN_SMALL_LETTER_J   = ~S-*J                         # j
-keyseq $LATIN_SMALL_LETTER_K   = ~S-*K                         # k
-keyseq $LATIN_SMALL_LETTER_L   = ~S-*L                         # l
-keyseq $LATIN_SMALL_LETTER_M   = ~S-*M                         # m
-keyseq $LATIN_SMALL_LETTER_N   = ~S-*N                         # n
-keyseq $LATIN_SMALL_LETTER_O   = ~S-*O                         # o
-keyseq $LATIN_SMALL_LETTER_P   = ~S-*P                         # p
-keyseq $LATIN_SMALL_LETTER_Q   = ~S-*Q                         # q
-keyseq $LATIN_SMALL_LETTER_R   = ~S-*R                         # r
-keyseq $LATIN_SMALL_LETTER_S   = ~S-*S                         # s
-keyseq $LATIN_SMALL_LETTER_T   = ~S-*T                         # t
-keyseq $LATIN_SMALL_LETTER_U   = ~S-*U                         # u
-keyseq $LATIN_SMALL_LETTER_V   = ~S-*V                         # v
-keyseq $LATIN_SMALL_LETTER_W   = ~S-*W                         # w
-keyseq $LATIN_SMALL_LETTER_X   = ~S-*X                         # x
-keyseq $LATIN_SMALL_LETTER_Y   = ~S-*Y                         # y
-keyseq $LATIN_SMALL_LETTER_Z   = ~S-*Z                         # z
-keyseq $LEFT_CURLY_BRACKET     =  S-*LeftSquareBracket         # {
-keyseq $VERTICAL_LINE          =  S-*ReverseSolidus            # |
-keyseq $RIGHT_CURLY_BRACKET    =  S-*RightSquareBracket        # }
-keyseq $TILDE                  =  S-*GraveAccent               # ~
-keyseq $VERTICAL_LINE          =  S-*YenSign                   # |
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# \91\8b\8eg\82¢\82Ì\97J\9fT - AX.mayu\r
+#\r
+# derived from 104.mayu, and 109.mayu\r
+# Copyright (C) 1999-2000, TAGA Nayuta <nayuta@users.sourceforge.net>\r
+# \r
+# AX.mayu\r
+# Copyright (C) 2000, KAWABE Nobukazu <nbk@imasy.or.jp>\r
+#\r
+\r
+define KBDAX\r
+\r
+\r
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# AX \93ú\96{\8cê\83L\81[\83{\81[\83h\92è\8b`\r
+#\r
+\r
+def key Esc Escape                     =    0x01\r
+def key _1                             =    0x02 # 1!\r
+def key _2                             =    0x03 # 2@\r
+def key _3                             =    0x04 # 3#\r
+def key _4                             =    0x05 # 4$\r
+def key _5                             =    0x06 # 5%\r
+def key _6                             =    0x07 # 6^\r
+def key _7                             =    0x08 # 7&\r
+def key _8                             =    0x09 # 8*\r
+def key _9                             =    0x0a # 9(\r
+def key _0                             =    0x0b # 0)\r
+def key HyphenMinus Hyphen Minus       =    0x0c # -_\r
+def key EqualsSign Equal               =    0x0d # =+\r
+def key BackSpace BS Back              =    0x0e\r
+def key Tab                            =    0x0f\r
+def key Q                              =    0x10\r
+def key W                              =    0x11\r
+def key E                              =    0x12\r
+def key R                              =    0x13\r
+def key T                              =    0x14\r
+def key Y                              =    0x15\r
+def key U                              =    0x16\r
+def key I                              =    0x17\r
+def key O                              =    0x18\r
+def key P                              =    0x19\r
+def key LeftSquareBracket OpenBracket  =    0x1a # [{\r
+def key RightSquareBracket CloseBracket        =    0x1b # ]}\r
+def key Enter Return                   =    0x1c\r
+def key NumEnter NumReturn             = E0-0x1c\r
+def key LeftControl LControl LCtrl     =    0x1d\r
+def key \89p\90\94/\83J\83i Eisuu                        = E0-0x1d # \89p\90\94 \83J\83i\r
+def key Pause                          = E1-0x1d 0x45 # Pause\r
+def key A                              =    0x1e\r
+def key S                              =    0x1f\r
+def key D                              =    0x20\r
+def key F                              =    0x21\r
+def key G                              =    0x22\r
+def key H                              =    0x23\r
+def key J                              =    0x24\r
+def key K                              =    0x25\r
+def key L                              =    0x26\r
+def key Semicolon                      =    0x27 # ;:\r
+def key Apostrophe Quote               =    0x28 # '"\r
+def key GraveAccent BackQuote          =    0x29 # `~\r
+def key LeftShift LShift               =    0x2a\r
+# def ignore                           = E0-0x2a # what is this? (ignore)\r
+def key YenSign Yen                    =    0x2b # \|\r
+def key Z                              =    0x2c\r
+def key X                              =    0x2d\r
+def key C                              =    0x2e\r
+def key V                              =    0x2f\r
+def key B                              =    0x30\r
+def key N                              =    0x31\r
+def key M                              =    0x32\r
+def key Comma                          =    0x33 # ,<\r
+def key FullStop Period                        =    0x34 # .>\r
+def key Solidus Slash                  =    0x35 # /?\r
+def key NumSolidus NumSlash            = E0-0x35 # Numpad /\r
+def key RightShift RShift              =    0x36\r
+def key NumAsterisk NumMultiply                =    0x37 # Numpad *\r
+def key PrintScreen Snapshot           = E0-0x37\r
+def key LeftAlt LAlt LMenu             =    0x38\r
+def key \8a¿\8e\9a Kanji                     = E0-0x38 # \8a¿\8e\9a\r
+def key Space                          =    0x39\r
+def key CapsLock Capital Caps          =    0x3a # CapsLock\r
+def key F1                             =    0x3b\r
+def key F2                             =    0x3c\r
+def key F3                             =    0x3d\r
+def key F4                             =    0x3e\r
+def key F5                             =    0x3f\r
+def key F6                             =    0x40\r
+def key F7                             =    0x41\r
+def key F8                             =    0x42\r
+def key F9                             =    0x43\r
+def key F10                            =    0x44\r
+def key NumLock                                =    0x45\r
+def key ScrollLock Scroll              =    0x46\r
+def key Break                          = E0-0x46 # Break\r
+def key Num7                           =    0x47 # Numpad 7\r
+def key Home                           = E0-0x47\r
+def key Num8                           =    0x48 # Numpad 8\r
+def key \81ª Up                          = E0-0x48\r
+def key Num9                           =    0x49 # Numpad 9\r
+def key PageUp Prior                   = E0-0x49\r
+def key NumHyphenMinus NumMinus                =    0x4a # Numpad -\r
+def key Num4                           =    0x4b # Numpad 4\r
+def key \81© Left                                = E0-0x4b\r
+def key Num5                           =    0x4c # Numpad 5\r
+def key Num6                           =    0x4d # Numpad 6\r
+def key \81¨ Right                       = E0-0x4d\r
+def key NumPlusSign NumPlus            =    0x4e # Numpad +\r
+def key Num1                           =    0x4f # Numpad 1\r
+def key End                            = E0-0x4f\r
+def key Num2                           =    0x50\r
+def key \81« Down                                = E0-0x50\r
+def key Num3                           =    0x51\r
+def key PageDown Next                  = E0-0x51\r
+def key Num0                           =    0x52\r
+def key Insert                         = E0-0x52\r
+def key NumFullStop NumPeriod          =    0x53 # Numpad .\r
+def key Delete Del                     = E0-0x53\r
+def key SysRq                          =    0x54\r
+def key ReverseSolidus BackSlash       =    0x56 # \|\r
+def key F11                            =    0x57\r
+def key F12                            =    0x58\r
+def key \96³\95Ï\8a· NonConvert              =    0x5a # \96³\95Ï\8a·\r
+def key \95Ï\8a· Convert                   =    0x5b # \95Ï\8a·\r
+def key AX                             =    0x5c # AX\83L\81[\r
+def key RightWindows RWindows RWin     = E0-0x5c # (\83L\81[\83{\81[\83h\8fã\82É\82Í\82È\82¢)\r
+def key Applications Apps              = E0-0x5d # (\83L\81[\83{\81[\83h\8fã\82É\82Í\82È\82¢)\r
+# def overflow                         =    0xff # overflow (ignore)\r
+\r
+def sync                               =    0x7e # scan code used by &Sync\r
+\r
+def mod Shift  = LShift RShift\r
+def mod Alt    = LAlt\r
+def mod Control        = LControl\r
+def mod Windows = RWindows\r
+\r
+\r
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# global keymap\r
+#\r
+\r
+keymap Global\r
+ mod Windows += AX\r
+ key *AX                       => *RWindows\r
+\r
+# \81EAX \83L\81[\83{\81[\83h\8fã\82É\82Í Windows \83L\81[\82Í\91\8dÝ\82µ\82È\82¢\81B\r
+# \81EWindows95 \82Å\82Í [AX] \83L\81[\82ª [Windows] \83L\81[\82Ì\96ð\96Ú\82ð\89Ê\82½\82µ\82Ä\82¢\82½\82ª\81A\r
+#   NT/2000 \82Å\82Í\96³\8e\8b\82³\82ê\82é\81B\r
+# \81EAX \83L\81[\83{\81[\83h\82Í RWindows \82â Applications \82Ì\83L\81[\83R\81[\83h\82ð\94­\90\82³\82¹\82é\r
+#   \82±\82Æ\82Í\82È\82¢\82ª\81ANT/2000 \82Ì\83h\83\89\83C\83o\82Í\82±\82ê\82ç\82Ì\83L\81[\83R\81[\83h\82ð\94F\8e¯\82·\82é\81B\r
+# \81E\82æ\82Á\82Ä\8fã\8bL\82Ì\82æ\82¤\82È\92è\8b`\82ð\82·\82é\82±\82Æ\82Å [AX] \83L\81[\82ð [Windows] \83L\81[\82Æ\82µ\r
+#   \82Ä\8eg\97p\82·\82é\82±\82Æ\82ª\82Å\82«\82é\81B\r
+\r
+\r
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# define some key sequence\r
+#\r
+\r
+keyseq $ToggleIME              = \8a¿\8e\9a\r
+keyseq $CapsLock               = CapsLock\r
+\r
+keyseq $SPACE                  = ~S-*Space                     #  \r
+keyseq $EXCLAMATION_MARK       =  S-*_1                        # !\r
+keyseq $QUOTATION_MARK         =  S-*Apostrophe                # "\r
+keyseq $NUMBER_SIGN            =  S-*_3                        # #\r
+keyseq $DOLLAR_SIGN            =  S-*_4                        # $\r
+keyseq $PERCENT_SIGN           =  S-*_5                        # %\r
+keyseq $AMPERSAND              =  S-*_7                        # &\r
+keyseq $APOSTROPHE             = ~S-*Apostrophe                # '\r
+keyseq $LEFT_PARENTHESIS       =  S-*_9                        # (\r
+keyseq $RIGHT_PARENTHESIS      =  S-*_0                        # )\r
+keyseq $ASTERISK               =  S-*_8                        # *\r
+keyseq $PLUS_SIGN              =  S-*EqualsSign                # +\r
+keyseq $COMMA                  = ~S-*Comma                     # ,\r
+keyseq $HYPHEN-MINUS           = ~S-*HyphenMinus               # -\r
+keyseq $FULL_STOP              = ~S-*FullStop                  # .\r
+keyseq $SOLIDUS                        = ~S-*Solidus                   # /\r
+keyseq $DIGIT_ZERO             = ~S-*_0                        # 0\r
+keyseq $DIGIT_ONE              = ~S-*_1                        # 1\r
+keyseq $DIGIT_TWO              = ~S-*_2                        # 2\r
+keyseq $DIGIT_THREE            = ~S-*_3                        # 3\r
+keyseq $DIGIT_FOUR             = ~S-*_4                        # 4\r
+keyseq $DIGIT_FIVE             = ~S-*_5                        # 5\r
+keyseq $DIGIT_SIX              = ~S-*_6                        # 6\r
+keyseq $DIGIT_SEVEN            = ~S-*_7                        # 7\r
+keyseq $DIGIT_EIGHT            = ~S-*_8                        # 8\r
+keyseq $DIGIT_NINE             = ~S-*_9                        # 9\r
+keyseq $COLON                  =  S-*Semicolon                 # :\r
+keyseq $SEMICOLON              = ~S-*Semicolon                 # ;\r
+keyseq $LESS-THAN_SIGN         =  S-*Comma                     # <\r
+keyseq $EQUALS_SIGN            = ~S-*EqualsSign                # =\r
+keyseq $GREATER-THAN_SIGN      =  S-*FullStop                  # >\r
+keyseq $QUESTION_MARK          =  S-*Solidus                   # ?\r
+keyseq $COMMERCIAL_AT          =  S-*_2                        # @\r
+keyseq $LATIN_CAPITAL_LETTER_A =  S-*A                         # A\r
+keyseq $LATIN_CAPITAL_LETTER_B =  S-*B                         # B\r
+keyseq $LATIN_CAPITAL_LETTER_C =  S-*C                         # C\r
+keyseq $LATIN_CAPITAL_LETTER_D =  S-*D                         # D\r
+keyseq $LATIN_CAPITAL_LETTER_E =  S-*E                         # E\r
+keyseq $LATIN_CAPITAL_LETTER_F =  S-*F                         # F\r
+keyseq $LATIN_CAPITAL_LETTER_G =  S-*G                         # G\r
+keyseq $LATIN_CAPITAL_LETTER_H =  S-*H                         # H\r
+keyseq $LATIN_CAPITAL_LETTER_I =  S-*I                         # I\r
+keyseq $LATIN_CAPITAL_LETTER_J =  S-*J                         # J\r
+keyseq $LATIN_CAPITAL_LETTER_K =  S-*K                         # K\r
+keyseq $LATIN_CAPITAL_LETTER_L =  S-*L                         # L\r
+keyseq $LATIN_CAPITAL_LETTER_M =  S-*M                         # M\r
+keyseq $LATIN_CAPITAL_LETTER_N =  S-*N                         # N\r
+keyseq $LATIN_CAPITAL_LETTER_O =  S-*O                         # O\r
+keyseq $LATIN_CAPITAL_LETTER_P =  S-*P                         # P\r
+keyseq $LATIN_CAPITAL_LETTER_Q =  S-*Q                         # Q\r
+keyseq $LATIN_CAPITAL_LETTER_R =  S-*R                         # R\r
+keyseq $LATIN_CAPITAL_LETTER_S =  S-*S                         # S\r
+keyseq $LATIN_CAPITAL_LETTER_T =  S-*T                         # T\r
+keyseq $LATIN_CAPITAL_LETTER_U =  S-*U                         # U\r
+keyseq $LATIN_CAPITAL_LETTER_V =  S-*V                         # V\r
+keyseq $LATIN_CAPITAL_LETTER_W =  S-*W                         # W\r
+keyseq $LATIN_CAPITAL_LETTER_X =  S-*X                         # X\r
+keyseq $LATIN_CAPITAL_LETTER_Y =  S-*Y                         # Y\r
+keyseq $LATIN_CAPITAL_LETTER_Z =  S-*Z                         # Z\r
+keyseq $LEFT_SQUARE_BRACKET    = ~S-*LeftSquareBracket         # [\r
+keyseq $REVERSE_SOLIDUS                = ~S-*ReverseSolidus            # \\r
+keyseq $RIGHT_SQUARE_BRACKET   = ~S-*RightSquareBracket        # ]\r
+keyseq $CIRCUMFLEX_ACCENT      =  S-*_6                        # ^\r
+keyseq $LOW_LINE               =  S-*HyphenMinus               # _\r
+keyseq $GRAVE_ACCENT           = ~S-*GraveAccent               # `\r
+keyseq $LATIN_SMALL_LETTER_A   = ~S-*A                         # a\r
+keyseq $LATIN_SMALL_LETTER_B   = ~S-*B                         # b\r
+keyseq $LATIN_SMALL_LETTER_C   = ~S-*C                         # c\r
+keyseq $LATIN_SMALL_LETTER_D   = ~S-*D                         # d\r
+keyseq $LATIN_SMALL_LETTER_E   = ~S-*E                         # e\r
+keyseq $LATIN_SMALL_LETTER_F   = ~S-*F                         # f\r
+keyseq $LATIN_SMALL_LETTER_G   = ~S-*G                         # g\r
+keyseq $LATIN_SMALL_LETTER_H   = ~S-*H                         # h\r
+keyseq $LATIN_SMALL_LETTER_I   = ~S-*I                         # i\r
+keyseq $LATIN_SMALL_LETTER_J   = ~S-*J                         # j\r
+keyseq $LATIN_SMALL_LETTER_K   = ~S-*K                         # k\r
+keyseq $LATIN_SMALL_LETTER_L   = ~S-*L                         # l\r
+keyseq $LATIN_SMALL_LETTER_M   = ~S-*M                         # m\r
+keyseq $LATIN_SMALL_LETTER_N   = ~S-*N                         # n\r
+keyseq $LATIN_SMALL_LETTER_O   = ~S-*O                         # o\r
+keyseq $LATIN_SMALL_LETTER_P   = ~S-*P                         # p\r
+keyseq $LATIN_SMALL_LETTER_Q   = ~S-*Q                         # q\r
+keyseq $LATIN_SMALL_LETTER_R   = ~S-*R                         # r\r
+keyseq $LATIN_SMALL_LETTER_S   = ~S-*S                         # s\r
+keyseq $LATIN_SMALL_LETTER_T   = ~S-*T                         # t\r
+keyseq $LATIN_SMALL_LETTER_U   = ~S-*U                         # u\r
+keyseq $LATIN_SMALL_LETTER_V   = ~S-*V                         # v\r
+keyseq $LATIN_SMALL_LETTER_W   = ~S-*W                         # w\r
+keyseq $LATIN_SMALL_LETTER_X   = ~S-*X                         # x\r
+keyseq $LATIN_SMALL_LETTER_Y   = ~S-*Y                         # y\r
+keyseq $LATIN_SMALL_LETTER_Z   = ~S-*Z                         # z\r
+keyseq $LEFT_CURLY_BRACKET     =  S-*LeftSquareBracket         # {\r
+keyseq $VERTICAL_LINE          =  S-*ReverseSolidus            # |\r
+keyseq $RIGHT_CURLY_BRACKET    =  S-*RightSquareBracket        # }\r
+keyseq $TILDE                  =  S-*GraveAccent               # ~\r
+keyseq $VERTICAL_LINE          =  S-*YenSign                   # |\r
index 1a8b6e1..cb73d05 100644 (file)
@@ -1,98 +1,98 @@
-#
-# Dvorak layout for \91\8b\8eg\82¢\82Ì\97J\9fT
-#
-# Written by KANAI Makoto <kanai@nadmin.org>
-#         on May. 2, 2000
-#
-# [\8eg\82¢\95û]
-# .mayu\82Ì\92\86\82Å
-#     include "104.mayu"
-# \82É\91±\82¢\82Ä
-#     include "dvorak.mayu"
-# \82Æ\82µ\82Ä\93Ç\82Ý\8d\9e\82Ü\82¹\82é¡
-# \82»\82Ì\8cã\82Í\81A\83A\83\93\83_\81[\83X\83R\83A\95t\82Ì\83L\81[\95Ê\96¼\82ð\8eg\82Á\82½\8ew\92è\82ª\89Â\94\\81B
-# \97á: window EditControl /:Edit$/ : Global
-#     key C-_H => BackSpace
-#
-
-def alias  _A                  = A
-def alias  _B                  = N
-def alias  _C                  = I
-def alias  _D                  = H
-def alias  _E                  = D
-def alias  _F                  = Y
-def alias  _G                  = U
-def alias  _H                  = J
-def alias  _I                  = G
-def alias  _J                  = C
-def alias  _K                  = V
-def alias  _L                  = P
-def alias  _M                  = M
-def alias  _N                  = L
-def alias  _O                  = S
-def alias  _P                  = R
-def alias  _Q                  = X
-def alias  _R                  = O
-def alias  _S                  = Semicolon
-def alias  _T                  = K
-def alias  _U                  = F
-def alias  _V                  = Period
-def alias  _W                  = Comma
-def alias  _X                  = B
-def alias  _Y                  = T
-def alias  _Z                  = Slash
-def alias  _CloseBracket       = Equal
-def alias  _Comma              = W
-def alias  _Equal              = CloseBracket
-def alias  _Minus              = Quote
-def alias  _OpenBracket                = Minus
-def alias  _Period             = E
-def alias  _Quote              = Q
-def alias  _Semicolon          = Z
-def alias  _Slash              = OpenBracket
-#def alias  _BackQuote         = BackQuote
-#def alias  _BackSlash         = BackSlash
-#def alias  _BackSpace         = BackSpace
-#def alias  _Caps              = Caps
-#def alias  _Enter             = Enter
-#def alias  _Escape            = Escape
-#def alias  _Space             = Space
-#def alias  _Tab               = Tab
-
-key *_A                        => *A
-key *_B                        => *B
-key *_C                        => *C
-key *_D                        => *D
-key *_E                        => *E
-key *_F                        => *F
-key *_G                        => *G
-key *_H                        => *H
-key *_I                        => *I
-key *_J                        => *J
-key *_K                        => *K
-key *_L                        => *L
-key *_M                        => *M
-key *_N                        => *N
-key *_O                        => *O
-key *_P                        => *P
-key *_Q                        => *Q
-key *_R                        => *R
-key *_S                        => *S
-key *_T                        => *T
-key *_U                        => *U
-key *_V                        => *V
-key *_W                        => *W
-key *_X                        => *X
-key *_Y                        => *Y
-key *_Z                        => *Z
-key *_CloseBracket     => *CloseBracket
-key *_Comma            => *Comma
-key *_Equal            => *Equal
-key *_Minus            => *Minus
-key *_OpenBracket      => *OpenBracket
-key *_Period           => *Period
-key *_Quote            => *Quote
-key *_Semicolon                => *Semicolon
-key *_Slash            => *Slash
-
-#--
+#\r
+# Dvorak layout for \91\8b\8eg\82¢\82Ì\97J\9fT\r
+#\r
+# Written by KANAI Makoto <kanai@nadmin.org>\r
+#         on May. 2, 2000\r
+#\r
+# [\8eg\82¢\95û]\r
+# .mayu\82Ì\92\86\82Å\r
+#     include "104.mayu"\r
+# \82É\91±\82¢\82Ä\r
+#     include "dvorak.mayu"\r
+# \82Æ\82µ\82Ä\93Ç\82Ý\8d\9e\82Ü\82¹\82é¡\r
+# \82»\82Ì\8cã\82Í\81A\83A\83\93\83_\81[\83X\83R\83A\95t\82Ì\83L\81[\95Ê\96¼\82ð\8eg\82Á\82½\8ew\92è\82ª\89Â\94\\81B\r
+# \97á: window EditControl /:Edit$/ : Global\r
+#     key C-_H => BackSpace\r
+#\r
+\r
+def alias  _A                  = A\r
+def alias  _B                  = N\r
+def alias  _C                  = I\r
+def alias  _D                  = H\r
+def alias  _E                  = D\r
+def alias  _F                  = Y\r
+def alias  _G                  = U\r
+def alias  _H                  = J\r
+def alias  _I                  = G\r
+def alias  _J                  = C\r
+def alias  _K                  = V\r
+def alias  _L                  = P\r
+def alias  _M                  = M\r
+def alias  _N                  = L\r
+def alias  _O                  = S\r
+def alias  _P                  = R\r
+def alias  _Q                  = X\r
+def alias  _R                  = O\r
+def alias  _S                  = Semicolon\r
+def alias  _T                  = K\r
+def alias  _U                  = F\r
+def alias  _V                  = Period\r
+def alias  _W                  = Comma\r
+def alias  _X                  = B\r
+def alias  _Y                  = T\r
+def alias  _Z                  = Slash\r
+def alias  _CloseBracket       = Equal\r
+def alias  _Comma              = W\r
+def alias  _Equal              = CloseBracket\r
+def alias  _Minus              = Quote\r
+def alias  _OpenBracket                = Minus\r
+def alias  _Period             = E\r
+def alias  _Quote              = Q\r
+def alias  _Semicolon          = Z\r
+def alias  _Slash              = OpenBracket\r
+#def alias  _BackQuote         = BackQuote\r
+#def alias  _BackSlash         = BackSlash\r
+#def alias  _BackSpace         = BackSpace\r
+#def alias  _Caps              = Caps\r
+#def alias  _Enter             = Enter\r
+#def alias  _Escape            = Escape\r
+#def alias  _Space             = Space\r
+#def alias  _Tab               = Tab\r
+\r
+key *_A                        => *A\r
+key *_B                        => *B\r
+key *_C                        => *C\r
+key *_D                        => *D\r
+key *_E                        => *E\r
+key *_F                        => *F\r
+key *_G                        => *G\r
+key *_H                        => *H\r
+key *_I                        => *I\r
+key *_J                        => *J\r
+key *_K                        => *K\r
+key *_L                        => *L\r
+key *_M                        => *M\r
+key *_N                        => *N\r
+key *_O                        => *O\r
+key *_P                        => *P\r
+key *_Q                        => *Q\r
+key *_R                        => *R\r
+key *_S                        => *S\r
+key *_T                        => *T\r
+key *_U                        => *U\r
+key *_V                        => *V\r
+key *_W                        => *W\r
+key *_X                        => *X\r
+key *_Y                        => *Y\r
+key *_Z                        => *Z\r
+key *_CloseBracket     => *CloseBracket\r
+key *_Comma            => *Comma\r
+key *_Equal            => *Equal\r
+key *_Minus            => *Minus\r
+key *_OpenBracket      => *OpenBracket\r
+key *_Period           => *Period\r
+key *_Quote            => *Quote\r
+key *_Semicolon                => *Semicolon\r
+key *_Slash            => *Slash\r
+\r
+#--\r
index 290822a..023a436 100644 (file)
-#
-# Dvorak layout for \91\8b\8eg\82¢\82Ì\97J\9fT
-#
-# Written by KANAI Makoto <kanai@nadmin.org>
-#         on May. 2, 2000
-# Modified by Oota Toshiya <oota@mspd.mt.nec.co.jp>
-#      ver 1.1 2001/11/1
-#
-# [\8eg\82¢\95û]
-# .mayu\82Ì\92\86\82Å
-#     include "109.mayu"
-# \82É\91±\82¢\82Ä
-#     include "dvorak109.mayu"
-# \82Æ\82µ\82Ä\93Ç\82Ý\8d\9e\82Ü\82¹\82é¡
-
-def key EqualsSign Equal               =    0x0d # =+
-#key ~S-*\94¼\8ap/\91S\8ap             = $GRAVE_ACCENT
-#key  S-*\94¼\8ap/\91S\8ap             = $TILDE
-#key  A-\94¼\8ap/\91S\8ap              = $ToggleIME
-#key    *\96³\95Ï\8a·                = *Space
-#key    *\95Ï\8a·          = *Space
-#key    *\82Ð\82ç\82ª\82È              = *Space
-#key    *\89p\90\94          = S-*\89p\90\94
-#key *ReverseSolidus   = *RightShift
-
-
-def alias  _A                  = A
-def alias  _B                  = N
-def alias  _C                  = I
-def alias  _D                  = H
-def alias  _E                  = D
-def alias  _F                  = Y
-def alias  _G                  = U
-def alias  _H                  = J
-def alias  _I                  = G
-def alias  _J                  = C
-def alias  _K                  = V
-def alias  _L                  = P
-def alias  _M                  = M
-def alias  _N                  = L
-def alias  _O                  = S
-def alias  _P                  = R
-def alias  _Q                  = X
-def alias  _R                  = O
-def alias  _S                  = Semicolon
-def alias  _T                  = K
-def alias  _U                  = F
-def alias  _V                  = Period
-def alias  _W                  = Comma
-def alias  _X                  = B
-def alias  _Y                  = T
-def alias  _Z                  = Slash
-def alias  _Comma              = W
-def alias  _Period             = E
-
-key S-*_2              => Atmark
-def subst S-*_6                => $CIRCUMFLEX_ACCENT
-def subst S-*_7                => $AMPERSAND
-key S-*_8              => $ASTERISK
-key S-*_9              => $LEFT_PARENTHESIS
-key S-*_0              => $RIGHT_PARENTHESIS
-key *Minus             => $LEFT_SQUARE_BRACKET
-key S-*Minus           => $LEFT_CURLY_BRACKET
-key *EqualsSign                => $RIGHT_SQUARE_BRACKET
-key S-*EqualsSign      => $RIGHT_CURLY_BRACKET
-key S-*Q               => $QUOTATION_MARK
-key ~S-*Q              => $APOSTROPHE
-key S-*Atmark          => $QUESTION_MARK
-key ~S-*Atmark         => $SOLIDUS
-key S-*OpenBracket     => $PLUS_SIGN
-key ~S-*OpenBracket    => $EQUALS_SIGN
-
-key S-*Colon           => $LOW_LINE
-key ~S-*Colon          => $HYPHEN-MINUS
-key *X                 => *Q
-key S-*CloseBracket    => $TILDE
-key ~S-*CloseBracket   => $GRAVE_ACCENT
-
-key  S-*Z              => $COLON
-key  ~S-*Z             => $SEMICOLON
-
-
-key *_A                        => *A
-key *_B                        => *B
-key *_C                        => *C
-key *_D                        => *D
-key *_E                        => *E
-key *_F                        => *F
-key *_G                        => *G
-key *_H                        => *H
-key *_I                        => *I
-key *_J                        => *J
-key *_K                        => *K
-key *_L                        => *L
-key *_M                        => *M
-key *_N                        => *N
-key *_O                        => *O
-key *_P                        => *P
-key *_R                        => *R
-key *_S                        => *S
-key *_T                        => *T
-key *_U                        => *U
-key *_V                        => *V
-key *_W                        => *W
-key *_X                        => *X
-key *_Y                        => *Y
-key *_Z                        => *Z
-key *_Comma            => *Comma
-key *_Period           => *Period
-
-#--
+#\r
+# Dvorak layout for \91\8b\8eg\82¢\82Ì\97J\9fT\r
+#\r
+# Written by KANAI Makoto <kanai@nadmin.org>\r
+#         on May. 2, 2000\r
+# Modified by Oota Toshiya <oota@mspd.mt.nec.co.jp>\r
+#      ver 1.1 2001/11/1\r
+#\r
+# [\8eg\82¢\95û]\r
+# .mayu\82Ì\92\86\82Å\r
+#     include "109.mayu"\r
+# \82É\91±\82¢\82Ä\r
+#     include "dvorak109.mayu"\r
+# \82Æ\82µ\82Ä\93Ç\82Ý\8d\9e\82Ü\82¹\82é¡\r
+\r
+def key EqualsSign Equal               =    0x0d # =+\r
+#key ~S-*\94¼\8ap/\91S\8ap             = $GRAVE_ACCENT\r
+#key  S-*\94¼\8ap/\91S\8ap             = $TILDE\r
+#key  A-\94¼\8ap/\91S\8ap              = $ToggleIME\r
+#key    *\96³\95Ï\8a·                = *Space\r
+#key    *\95Ï\8a·          = *Space\r
+#key    *\82Ð\82ç\82ª\82È              = *Space\r
+#key    *\89p\90\94          = S-*\89p\90\94\r
+#key *ReverseSolidus   = *RightShift\r
+\r
+\r
+def alias  _A                  = A\r
+def alias  _B                  = N\r
+def alias  _C                  = I\r
+def alias  _D                  = H\r
+def alias  _E                  = D\r
+def alias  _F                  = Y\r
+def alias  _G                  = U\r
+def alias  _H                  = J\r
+def alias  _I                  = G\r
+def alias  _J                  = C\r
+def alias  _K                  = V\r
+def alias  _L                  = P\r
+def alias  _M                  = M\r
+def alias  _N                  = L\r
+def alias  _O                  = S\r
+def alias  _P                  = R\r
+def alias  _Q                  = X\r
+def alias  _R                  = O\r
+def alias  _S                  = Semicolon\r
+def alias  _T                  = K\r
+def alias  _U                  = F\r
+def alias  _V                  = Period\r
+def alias  _W                  = Comma\r
+def alias  _X                  = B\r
+def alias  _Y                  = T\r
+def alias  _Z                  = Slash\r
+def alias  _Comma              = W\r
+def alias  _Period             = E\r
+\r
+key S-*_2              => Atmark\r
+def subst S-*_6                => $CIRCUMFLEX_ACCENT\r
+def subst S-*_7                => $AMPERSAND\r
+key S-*_8              => $ASTERISK\r
+key S-*_9              => $LEFT_PARENTHESIS\r
+key S-*_0              => $RIGHT_PARENTHESIS\r
+key *Minus             => $LEFT_SQUARE_BRACKET\r
+key S-*Minus           => $LEFT_CURLY_BRACKET\r
+key *EqualsSign                => $RIGHT_SQUARE_BRACKET\r
+key S-*EqualsSign      => $RIGHT_CURLY_BRACKET\r
+key S-*Q               => $QUOTATION_MARK\r
+key ~S-*Q              => $APOSTROPHE\r
+key S-*Atmark          => $QUESTION_MARK\r
+key ~S-*Atmark         => $SOLIDUS\r
+key S-*OpenBracket     => $PLUS_SIGN\r
+key ~S-*OpenBracket    => $EQUALS_SIGN\r
+\r
+key S-*Colon           => $LOW_LINE\r
+key ~S-*Colon          => $HYPHEN-MINUS\r
+key *X                 => *Q\r
+key S-*CloseBracket    => $TILDE\r
+key ~S-*CloseBracket   => $GRAVE_ACCENT\r
+\r
+key  S-*Z              => $COLON\r
+key  ~S-*Z             => $SEMICOLON\r
+\r
+\r
+key *_A                        => *A\r
+key *_B                        => *B\r
+key *_C                        => *C\r
+key *_D                        => *D\r
+key *_E                        => *E\r
+key *_F                        => *F\r
+key *_G                        => *G\r
+key *_H                        => *H\r
+key *_I                        => *I\r
+key *_J                        => *J\r
+key *_K                        => *K\r
+key *_L                        => *L\r
+key *_M                        => *M\r
+key *_N                        => *N\r
+key *_O                        => *O\r
+key *_P                        => *P\r
+key *_R                        => *R\r
+key *_S                        => *S\r
+key *_T                        => *T\r
+key *_U                        => *U\r
+key *_V                        => *V\r
+key *_W                        => *W\r
+key *_X                        => *X\r
+key *_Y                        => *Y\r
+key *_Z                        => *Z\r
+key *_Comma            => *Comma\r
+key *_Period           => *Period\r
+\r
+#--\r
index 52cdea3..9813f7a 100644 (file)
-keymap2 \8cg\91Ñ_0 : Global
-keymap2 \8cg\91Ñ_1 : Global
-keymap2 \8cg\91Ñ_2 : Global
-keymap2 \8cg\91Ñ_3 : Global
-keymap2 \8cg\91Ñ_4 : Global
-keymap2 \8cg\91Ñ_5 : Global
-keymap2 \8cg\91Ñ_6 : Global
-keymap2 \8cg\91Ñ_7 : Global
-keymap2 \8cg\91Ñ_8 : Global
-keymap2 \8cg\91Ñ_9 : Global
-keymap2 \8cg\91Ñ_ : Global
-
-keymap2 \8cg\91Ñ____ : Global
- key *IC-IL-Num0 => BS &Prefix(\8cg\91Ñ_)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ___ : Global
- key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ____)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ__ : Global
- key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ___)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_ : Global
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ__)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_9_9_9_9_9 : Global
- key *IC-IL-Num3 => BS R A &Prefix(\8cg\91Ñ_9)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_9_9_9_9 : Global
- key *IC-IL-Num3 => BS R O &Prefix(\8cg\91Ñ_9_9_9_9_9)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_9_9_9 : Global
- key *IC-IL-Num3 => BS R E &Prefix(\8cg\91Ñ_9_9_9_9)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_9_9 : Global
- key *IC-IL-Num3 => BS R U &Prefix(\8cg\91Ñ_9_9_9)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_9 : Global
- key *IC-IL-Num3 => BS R I &Prefix(\8cg\91Ñ_9_9)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_8_8_8_8_8_8 : Global
- key *IC-IL-Num2 => BS Y A &Prefix(\8cg\91Ñ_8)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_8_8_8_8_8 : Global
- key *IC-IL-Num2 => BS X Y O &Prefix(\8cg\91Ñ_8_8_8_8_8_8)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_8_8_8_8 : Global
- key *IC-IL-Num2 => BS X Y U &Prefix(\8cg\91Ñ_8_8_8_8_8)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_8_8_8 : Global
- key *IC-IL-Num2 => BS X Y A &Prefix(\8cg\91Ñ_8_8_8_8)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_8_8 : Global
- key *IC-IL-Num2 => BS Y O &Prefix(\8cg\91Ñ_8_8_8)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_8 : Global
- key *IC-IL-Num2 => BS Y U &Prefix(\8cg\91Ñ_8_8)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_7_7_7_7_7 : Global
- key *IC-IL-Num1 => BS M A &Prefix(\8cg\91Ñ_7)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_7_7_7_7 : Global
- key *IC-IL-Num1 => BS M O &Prefix(\8cg\91Ñ_7_7_7_7_7)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_7_7_7 : Global
- key *IC-IL-Num1 => BS M E &Prefix(\8cg\91Ñ_7_7_7_7)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_7_7 : Global
- key *IC-IL-Num1 => BS M U &Prefix(\8cg\91Ñ_7_7_7)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_7 : Global
- key *IC-IL-Num1 => BS M I &Prefix(\8cg\91Ñ_7_7)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-
-keymap2 \8cg\91Ñ_6_6_6_6_6_ : Global
-
-keymap2 \8cg\91Ñ_6_6_6_6_6____ : Global
- key *IC-IL-Num0 => BS BS B O &Prefix(\8cg\91Ñ_6_6_6_6_6_)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_6_6_6_6_6___ : Global
- key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_6_6_6_6_6____)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_6_6_6_6_6__ : Global
- key *IC-IL-Num0 => BS H O Comma &Prefix(\8cg\91Ñ_6_6_6_6_6___)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_6_6_6_6_6_ : Global
- key *IC-IL-Num0 => BS P O &Prefix(\8cg\91Ñ_6_6_6_6_6__)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_6_6_6_6_6 : Global
- key *IC-IL-Num6 => BS H A &Prefix(\8cg\91Ñ_6)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => BS B O &Prefix(\8cg\91Ñ_6_6_6_6_6_)
-
-keymap2 \8cg\91Ñ_6_6_6_6_ : Global
-
-keymap2 \8cg\91Ñ_6_6_6_6____ : Global
- key *IC-IL-Num0 => BS BS B E &Prefix(\8cg\91Ñ_6_6_6_6_)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_6_6_6_6___ : Global
- key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_6_6_6_6____)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_6_6_6_6__ : Global
- key *IC-IL-Num0 => BS H E Comma &Prefix(\8cg\91Ñ_6_6_6_6___)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_6_6_6_6_ : Global
- key *IC-IL-Num0 => BS P E &Prefix(\8cg\91Ñ_6_6_6_6__)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_6_6_6_6 : Global
- key *IC-IL-Num6 => BS H O &Prefix(\8cg\91Ñ_6_6_6_6_6)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => BS B E &Prefix(\8cg\91Ñ_6_6_6_6_)
-
-keymap2 \8cg\91Ñ_6_6_6_ : Global
-
-keymap2 \8cg\91Ñ_6_6_6____ : Global
- key *IC-IL-Num0 => BS BS B U &Prefix(\8cg\91Ñ_6_6_6_)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_6_6_6___ : Global
- key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_6_6_6____)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_6_6_6__ : Global
- key *IC-IL-Num0 => BS F U Comma &Prefix(\8cg\91Ñ_6_6_6___)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_6_6_6_ : Global
- key *IC-IL-Num0 => BS P U &Prefix(\8cg\91Ñ_6_6_6__)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_6_6_6 : Global
- key *IC-IL-Num6 => BS H E &Prefix(\8cg\91Ñ_6_6_6_6)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => BS B U &Prefix(\8cg\91Ñ_6_6_6_)
-
-keymap2 \8cg\91Ñ_6_6_ : Global
-
-keymap2 \8cg\91Ñ_6_6____ : Global
- key *IC-IL-Num0 => BS BS B I &Prefix(\8cg\91Ñ_6_6_)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_6_6___ : Global
- key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_6_6____)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_6_6__ : Global
- key *IC-IL-Num0 => BS H I Comma &Prefix(\8cg\91Ñ_6_6___)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_6_6_ : Global
- key *IC-IL-Num0 => BS P I &Prefix(\8cg\91Ñ_6_6__)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_6_6 : Global
- key *IC-IL-Num6 => BS F U &Prefix(\8cg\91Ñ_6_6_6)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => BS B I &Prefix(\8cg\91Ñ_6_6_)
-
-keymap2 \8cg\91Ñ_6_ : Global
-
-keymap2 \8cg\91Ñ_6____ : Global
- key *IC-IL-Num0 => BS BS B A &Prefix(\8cg\91Ñ_6_)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_6___ : Global
- key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_6____)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_6__ : Global
- key *IC-IL-Num0 => BS H A Comma &Prefix(\8cg\91Ñ_6___)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_6_ : Global
- key *IC-IL-Num0 => BS P A &Prefix(\8cg\91Ñ_6__)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_6 : Global
- key *IC-IL-Num6 => BS H I &Prefix(\8cg\91Ñ_6_6)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => BS B A &Prefix(\8cg\91Ñ_6_)
-keymap2 \8cg\91Ñ_5_5_5_5_5 : Global
- key *IC-IL-Num5 => BS N A &Prefix(\8cg\91Ñ_5)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_5_5_5_5 : Global
- key *IC-IL-Num5 => BS N O &Prefix(\8cg\91Ñ_5_5_5_5_5)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_5_5_5 : Global
- key *IC-IL-Num5 => BS N E &Prefix(\8cg\91Ñ_5_5_5_5)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_5_5 : Global
- key *IC-IL-Num5 => BS N U &Prefix(\8cg\91Ñ_5_5_5)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_5 : Global
- key *IC-IL-Num5 => BS N I &Prefix(\8cg\91Ñ_5_5)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_4_4_4_4_4_4 : Global
- key *IC-IL-Num4 => BS T A &Prefix(\8cg\91Ñ_4)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-
-keymap2 \8cg\91Ñ_4_4_4_4_4_ : Global
-
-keymap2 \8cg\91Ñ_4_4_4_4_4____ : Global
- key *IC-IL-Num0 => BS BS D O &Prefix(\8cg\91Ñ_4_4_4_4_4_)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_4_4_4_4_4___ : Global
- key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_4_4_4_4_4____)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_4_4_4_4_4__ : Global
- key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_4_4_4_4_4___)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_4_4_4_4_4_ : Global
- key *IC-IL-Num0 => BS T O &Prefix(\8cg\91Ñ_4_4_4_4_4__)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_4_4_4_4_4 : Global
- key *IC-IL-Num4 => BS X T U &Prefix(\8cg\91Ñ_4_4_4_4_4_4)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => BS D O &Prefix(\8cg\91Ñ_4_4_4_4_4_)
-
-keymap2 \8cg\91Ñ_4_4_4_4_ : Global
-
-keymap2 \8cg\91Ñ_4_4_4_4____ : Global
- key *IC-IL-Num0 => BS BS D E &Prefix(\8cg\91Ñ_4_4_4_4_)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_4_4_4_4___ : Global
- key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_4_4_4_4____)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_4_4_4_4__ : Global
- key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_4_4_4_4___)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_4_4_4_4_ : Global
- key *IC-IL-Num0 => BS T E &Prefix(\8cg\91Ñ_4_4_4_4__)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_4_4_4_4 : Global
- key *IC-IL-Num4 => BS T O &Prefix(\8cg\91Ñ_4_4_4_4_4)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => BS D E &Prefix(\8cg\91Ñ_4_4_4_4_)
-
-keymap2 \8cg\91Ñ_4_4_4_ : Global
-
-keymap2 \8cg\91Ñ_4_4_4____ : Global
- key *IC-IL-Num0 => BS BS D U &Prefix(\8cg\91Ñ_4_4_4_)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_4_4_4___ : Global
- key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_4_4_4____)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_4_4_4__ : Global
- key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_4_4_4___)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_4_4_4_ : Global
- key *IC-IL-Num0 => BS T U &Prefix(\8cg\91Ñ_4_4_4__)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_4_4_4 : Global
- key *IC-IL-Num4 => BS T E &Prefix(\8cg\91Ñ_4_4_4_4)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => BS D U &Prefix(\8cg\91Ñ_4_4_4_)
-
-keymap2 \8cg\91Ñ_4_4_ : Global
-
-keymap2 \8cg\91Ñ_4_4____ : Global
- key *IC-IL-Num0 => BS BS D I &Prefix(\8cg\91Ñ_4_4_)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_4_4___ : Global
- key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_4_4____)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_4_4__ : Global
- key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_4_4___)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_4_4_ : Global
- key *IC-IL-Num0 => BS T I &Prefix(\8cg\91Ñ_4_4__)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_4_4 : Global
- key *IC-IL-Num4 => BS T U &Prefix(\8cg\91Ñ_4_4_4)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => BS D I &Prefix(\8cg\91Ñ_4_4_)
-
-keymap2 \8cg\91Ñ_4_ : Global
-
-keymap2 \8cg\91Ñ_4____ : Global
- key *IC-IL-Num0 => BS BS D A &Prefix(\8cg\91Ñ_4_)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_4___ : Global
- key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_4____)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_4__ : Global
- key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_4___)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_4_ : Global
- key *IC-IL-Num0 => BS T A &Prefix(\8cg\91Ñ_4__)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_4 : Global
- key *IC-IL-Num4 => BS T I &Prefix(\8cg\91Ñ_4_4)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => BS D A &Prefix(\8cg\91Ñ_4_)
-
-keymap2 \8cg\91Ñ_3_3_3_3_3_ : Global
-
-keymap2 \8cg\91Ñ_3_3_3_3_3____ : Global
- key *IC-IL-Num0 => BS BS Z O &Prefix(\8cg\91Ñ_3_3_3_3_3_)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_3_3_3_3_3___ : Global
- key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_3_3_3_3_3____)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_3_3_3_3_3__ : Global
- key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_3_3_3_3_3___)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_3_3_3_3_3_ : Global
- key *IC-IL-Num0 => BS S O &Prefix(\8cg\91Ñ_3_3_3_3_3__)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_3_3_3_3_3 : Global
- key *IC-IL-Num9 => BS S A &Prefix(\8cg\91Ñ_3)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => BS Z O &Prefix(\8cg\91Ñ_3_3_3_3_3_)
-
-keymap2 \8cg\91Ñ_3_3_3_3_ : Global
-
-keymap2 \8cg\91Ñ_3_3_3_3____ : Global
- key *IC-IL-Num0 => BS BS Z E &Prefix(\8cg\91Ñ_3_3_3_3_)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_3_3_3_3___ : Global
- key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_3_3_3_3____)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_3_3_3_3__ : Global
- key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_3_3_3_3___)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_3_3_3_3_ : Global
- key *IC-IL-Num0 => BS S E &Prefix(\8cg\91Ñ_3_3_3_3__)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_3_3_3_3 : Global
- key *IC-IL-Num9 => BS S O &Prefix(\8cg\91Ñ_3_3_3_3_3)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => BS Z E &Prefix(\8cg\91Ñ_3_3_3_3_)
-
-keymap2 \8cg\91Ñ_3_3_3_ : Global
-
-keymap2 \8cg\91Ñ_3_3_3____ : Global
- key *IC-IL-Num0 => BS BS Z U &Prefix(\8cg\91Ñ_3_3_3_)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_3_3_3___ : Global
- key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_3_3_3____)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_3_3_3__ : Global
- key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_3_3_3___)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_3_3_3_ : Global
- key *IC-IL-Num0 => BS S U &Prefix(\8cg\91Ñ_3_3_3__)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_3_3_3 : Global
- key *IC-IL-Num9 => BS S E &Prefix(\8cg\91Ñ_3_3_3_3)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => BS Z U &Prefix(\8cg\91Ñ_3_3_3_)
-
-keymap2 \8cg\91Ñ_3_3_ : Global
-
-keymap2 \8cg\91Ñ_3_3____ : Global
- key *IC-IL-Num0 => BS BS J I &Prefix(\8cg\91Ñ_3_3_)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_3_3___ : Global
- key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_3_3____)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_3_3__ : Global
- key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_3_3___)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_3_3_ : Global
- key *IC-IL-Num0 => BS S I &Prefix(\8cg\91Ñ_3_3__)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_3_3 : Global
- key *IC-IL-Num9 => BS S U &Prefix(\8cg\91Ñ_3_3_3)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => BS J I &Prefix(\8cg\91Ñ_3_3_)
-
-keymap2 \8cg\91Ñ_3_ : Global
-
-keymap2 \8cg\91Ñ_3____ : Global
- key *IC-IL-Num0 => BS BS Z A &Prefix(\8cg\91Ñ_3_)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_3___ : Global
- key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_3____)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_3__ : Global
- key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_3___)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_3_ : Global
- key *IC-IL-Num0 => BS S A &Prefix(\8cg\91Ñ_3__)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_3 : Global
- key *IC-IL-Num9 => BS S I &Prefix(\8cg\91Ñ_3_3)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => BS Z A &Prefix(\8cg\91Ñ_3_)
-
-keymap2 \8cg\91Ñ_2_2_2_2_2_ : Global
-
-keymap2 \8cg\91Ñ_2_2_2_2_2____ : Global
- key *IC-IL-Num0 => BS BS G O &Prefix(\8cg\91Ñ_2_2_2_2_2_)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_2_2_2_2_2___ : Global
- key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_2_2_2_2_2____)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_2_2_2_2_2__ : Global
- key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_2_2_2_2_2___)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_2_2_2_2_2_ : Global
- key *IC-IL-Num0 => BS K O &Prefix(\8cg\91Ñ_2_2_2_2_2__)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_2_2_2_2_2 : Global
- key *IC-IL-Num8 => BS K A &Prefix(\8cg\91Ñ_2)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => BS G O &Prefix(\8cg\91Ñ_2_2_2_2_2_)
-
-keymap2 \8cg\91Ñ_2_2_2_2_ : Global
-
-keymap2 \8cg\91Ñ_2_2_2_2____ : Global
- key *IC-IL-Num0 => BS BS G E &Prefix(\8cg\91Ñ_2_2_2_2_)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_2_2_2_2___ : Global
- key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_2_2_2_2____)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_2_2_2_2__ : Global
- key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_2_2_2_2___)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_2_2_2_2_ : Global
- key *IC-IL-Num0 => BS K E &Prefix(\8cg\91Ñ_2_2_2_2__)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_2_2_2_2 : Global
- key *IC-IL-Num8 => BS K O &Prefix(\8cg\91Ñ_2_2_2_2_2)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => BS G E &Prefix(\8cg\91Ñ_2_2_2_2_)
-
-keymap2 \8cg\91Ñ_2_2_2_ : Global
-
-keymap2 \8cg\91Ñ_2_2_2____ : Global
- key *IC-IL-Num0 => BS BS G U &Prefix(\8cg\91Ñ_2_2_2_)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_2_2_2___ : Global
- key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_2_2_2____)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_2_2_2__ : Global
- key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_2_2_2___)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_2_2_2_ : Global
- key *IC-IL-Num0 => BS K U &Prefix(\8cg\91Ñ_2_2_2__)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_2_2_2 : Global
- key *IC-IL-Num8 => BS K E &Prefix(\8cg\91Ñ_2_2_2_2)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => BS G U &Prefix(\8cg\91Ñ_2_2_2_)
-
-keymap2 \8cg\91Ñ_2_2_ : Global
-
-keymap2 \8cg\91Ñ_2_2____ : Global
- key *IC-IL-Num0 => BS BS G I &Prefix(\8cg\91Ñ_2_2_)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_2_2___ : Global
- key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_2_2____)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_2_2__ : Global
- key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_2_2___)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_2_2_ : Global
- key *IC-IL-Num0 => BS K I &Prefix(\8cg\91Ñ_2_2__)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_2_2 : Global
- key *IC-IL-Num8 => BS K U &Prefix(\8cg\91Ñ_2_2_2)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => BS G I &Prefix(\8cg\91Ñ_2_2_)
-
-keymap2 \8cg\91Ñ_2_ : Global
-
-keymap2 \8cg\91Ñ_2____ : Global
- key *IC-IL-Num0 => BS BS G A &Prefix(\8cg\91Ñ_2_)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_2___ : Global
- key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_2____)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_2__ : Global
- key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_2___)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_2_ : Global
- key *IC-IL-Num0 => BS K A &Prefix(\8cg\91Ñ_2__)
- key *IC-IL-\81¨ => &Ignore
-keymap2 \8cg\91Ñ_2 : Global
- key *IC-IL-Num8 => BS K I &Prefix(\8cg\91Ñ_2_2)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => BS G A &Prefix(\8cg\91Ñ_2_)
-keymap2 \8cg\91Ñ_1_1_1_1_1_1_1_1_1_1 : Global
- key *IC-IL-Num7 => BS A &Prefix(\8cg\91Ñ_1)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_1_1_1_1_1_1_1_1_1 : Global
- key *IC-IL-Num7 => BS X O &Prefix(\8cg\91Ñ_1_1_1_1_1_1_1_1_1_1)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_1_1_1_1_1_1_1_1 : Global
- key *IC-IL-Num7 => BS X E &Prefix(\8cg\91Ñ_1_1_1_1_1_1_1_1_1)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_1_1_1_1_1_1_1 : Global
- key *IC-IL-Num7 => BS X U &Prefix(\8cg\91Ñ_1_1_1_1_1_1_1_1)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_1_1_1_1_1_1 : Global
- key *IC-IL-Num7 => BS X I &Prefix(\8cg\91Ñ_1_1_1_1_1_1_1)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_1_1_1_1_1 : Global
- key *IC-IL-Num7 => BS X A &Prefix(\8cg\91Ñ_1_1_1_1_1_1)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_1_1_1_1 : Global
- key *IC-IL-Num7 => BS O &Prefix(\8cg\91Ñ_1_1_1_1_1)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_1_1_1 : Global
- key *IC-IL-Num7 => BS E &Prefix(\8cg\91Ñ_1_1_1_1)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_1_1 : Global
- key *IC-IL-Num7 => BS U &Prefix(\8cg\91Ñ_1_1_1)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_1 : Global
- key *IC-IL-Num7 => BS I &Prefix(\8cg\91Ñ_1_1)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_0_0_0 : Global
- key *IC-IL-NumFullStop => BS W A &Prefix(\8cg\91Ñ_0)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_0_0 : Global
- key *IC-IL-NumFullStop => BS N N &Prefix(\8cg\91Ñ_0_0_0)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap2 \8cg\91Ñ_0 : Global
- key *IC-IL-NumFullStop => BS W O &Prefix(\8cg\91Ñ_0_0)
- key *IC-IL-\81¨ => &Ignore
- key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)
-keymap Global
- key *IC-IL-NumFullStop => W A &Prefix(\8cg\91Ñ_0)
- key *IC-IL-Num7 => A &Prefix(\8cg\91Ñ_1)
- key *IC-IL-Num8 => K A &Prefix(\8cg\91Ñ_2)
- key *IC-IL-Num9 => S A &Prefix(\8cg\91Ñ_3)
- key *IC-IL-Num4 => T A &Prefix(\8cg\91Ñ_4)
- key *IC-IL-Num5 => N A &Prefix(\8cg\91Ñ_5)
- key *IC-IL-Num6 => H A &Prefix(\8cg\91Ñ_6)
- key *IC-IL-Num1 => M A &Prefix(\8cg\91Ñ_7)
- key *IC-IL-Num2 => Y A &Prefix(\8cg\91Ñ_8)
- key *IC-IL-Num3 => R A &Prefix(\8cg\91Ñ_9)
+keymap2 \8cg\91Ñ_0 : Global\r
+keymap2 \8cg\91Ñ_1 : Global\r
+keymap2 \8cg\91Ñ_2 : Global\r
+keymap2 \8cg\91Ñ_3 : Global\r
+keymap2 \8cg\91Ñ_4 : Global\r
+keymap2 \8cg\91Ñ_5 : Global\r
+keymap2 \8cg\91Ñ_6 : Global\r
+keymap2 \8cg\91Ñ_7 : Global\r
+keymap2 \8cg\91Ñ_8 : Global\r
+keymap2 \8cg\91Ñ_9 : Global\r
+keymap2 \8cg\91Ñ_ : Global\r
+\r
+keymap2 \8cg\91Ñ____ : Global\r
+ key *IC-IL-Num0 => BS &Prefix(\8cg\91Ñ_)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ___ : Global\r
+ key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ____)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ__ : Global\r
+ key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ___)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_ : Global\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ__)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_9_9_9_9_9 : Global\r
+ key *IC-IL-Num3 => BS R A &Prefix(\8cg\91Ñ_9)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_9_9_9_9 : Global\r
+ key *IC-IL-Num3 => BS R O &Prefix(\8cg\91Ñ_9_9_9_9_9)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_9_9_9 : Global\r
+ key *IC-IL-Num3 => BS R E &Prefix(\8cg\91Ñ_9_9_9_9)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_9_9 : Global\r
+ key *IC-IL-Num3 => BS R U &Prefix(\8cg\91Ñ_9_9_9)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_9 : Global\r
+ key *IC-IL-Num3 => BS R I &Prefix(\8cg\91Ñ_9_9)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_8_8_8_8_8_8 : Global\r
+ key *IC-IL-Num2 => BS Y A &Prefix(\8cg\91Ñ_8)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_8_8_8_8_8 : Global\r
+ key *IC-IL-Num2 => BS X Y O &Prefix(\8cg\91Ñ_8_8_8_8_8_8)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_8_8_8_8 : Global\r
+ key *IC-IL-Num2 => BS X Y U &Prefix(\8cg\91Ñ_8_8_8_8_8)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_8_8_8 : Global\r
+ key *IC-IL-Num2 => BS X Y A &Prefix(\8cg\91Ñ_8_8_8_8)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_8_8 : Global\r
+ key *IC-IL-Num2 => BS Y O &Prefix(\8cg\91Ñ_8_8_8)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_8 : Global\r
+ key *IC-IL-Num2 => BS Y U &Prefix(\8cg\91Ñ_8_8)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_7_7_7_7_7 : Global\r
+ key *IC-IL-Num1 => BS M A &Prefix(\8cg\91Ñ_7)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_7_7_7_7 : Global\r
+ key *IC-IL-Num1 => BS M O &Prefix(\8cg\91Ñ_7_7_7_7_7)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_7_7_7 : Global\r
+ key *IC-IL-Num1 => BS M E &Prefix(\8cg\91Ñ_7_7_7_7)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_7_7 : Global\r
+ key *IC-IL-Num1 => BS M U &Prefix(\8cg\91Ñ_7_7_7)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_7 : Global\r
+ key *IC-IL-Num1 => BS M I &Prefix(\8cg\91Ñ_7_7)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+\r
+keymap2 \8cg\91Ñ_6_6_6_6_6_ : Global\r
+\r
+keymap2 \8cg\91Ñ_6_6_6_6_6____ : Global\r
+ key *IC-IL-Num0 => BS BS B O &Prefix(\8cg\91Ñ_6_6_6_6_6_)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_6_6_6_6_6___ : Global\r
+ key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_6_6_6_6_6____)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_6_6_6_6_6__ : Global\r
+ key *IC-IL-Num0 => BS H O Comma &Prefix(\8cg\91Ñ_6_6_6_6_6___)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_6_6_6_6_6_ : Global\r
+ key *IC-IL-Num0 => BS P O &Prefix(\8cg\91Ñ_6_6_6_6_6__)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_6_6_6_6_6 : Global\r
+ key *IC-IL-Num6 => BS H A &Prefix(\8cg\91Ñ_6)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => BS B O &Prefix(\8cg\91Ñ_6_6_6_6_6_)\r
+\r
+keymap2 \8cg\91Ñ_6_6_6_6_ : Global\r
+\r
+keymap2 \8cg\91Ñ_6_6_6_6____ : Global\r
+ key *IC-IL-Num0 => BS BS B E &Prefix(\8cg\91Ñ_6_6_6_6_)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_6_6_6_6___ : Global\r
+ key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_6_6_6_6____)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_6_6_6_6__ : Global\r
+ key *IC-IL-Num0 => BS H E Comma &Prefix(\8cg\91Ñ_6_6_6_6___)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_6_6_6_6_ : Global\r
+ key *IC-IL-Num0 => BS P E &Prefix(\8cg\91Ñ_6_6_6_6__)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_6_6_6_6 : Global\r
+ key *IC-IL-Num6 => BS H O &Prefix(\8cg\91Ñ_6_6_6_6_6)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => BS B E &Prefix(\8cg\91Ñ_6_6_6_6_)\r
+\r
+keymap2 \8cg\91Ñ_6_6_6_ : Global\r
+\r
+keymap2 \8cg\91Ñ_6_6_6____ : Global\r
+ key *IC-IL-Num0 => BS BS B U &Prefix(\8cg\91Ñ_6_6_6_)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_6_6_6___ : Global\r
+ key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_6_6_6____)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_6_6_6__ : Global\r
+ key *IC-IL-Num0 => BS F U Comma &Prefix(\8cg\91Ñ_6_6_6___)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_6_6_6_ : Global\r
+ key *IC-IL-Num0 => BS P U &Prefix(\8cg\91Ñ_6_6_6__)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_6_6_6 : Global\r
+ key *IC-IL-Num6 => BS H E &Prefix(\8cg\91Ñ_6_6_6_6)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => BS B U &Prefix(\8cg\91Ñ_6_6_6_)\r
+\r
+keymap2 \8cg\91Ñ_6_6_ : Global\r
+\r
+keymap2 \8cg\91Ñ_6_6____ : Global\r
+ key *IC-IL-Num0 => BS BS B I &Prefix(\8cg\91Ñ_6_6_)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_6_6___ : Global\r
+ key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_6_6____)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_6_6__ : Global\r
+ key *IC-IL-Num0 => BS H I Comma &Prefix(\8cg\91Ñ_6_6___)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_6_6_ : Global\r
+ key *IC-IL-Num0 => BS P I &Prefix(\8cg\91Ñ_6_6__)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_6_6 : Global\r
+ key *IC-IL-Num6 => BS F U &Prefix(\8cg\91Ñ_6_6_6)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => BS B I &Prefix(\8cg\91Ñ_6_6_)\r
+\r
+keymap2 \8cg\91Ñ_6_ : Global\r
+\r
+keymap2 \8cg\91Ñ_6____ : Global\r
+ key *IC-IL-Num0 => BS BS B A &Prefix(\8cg\91Ñ_6_)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_6___ : Global\r
+ key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_6____)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_6__ : Global\r
+ key *IC-IL-Num0 => BS H A Comma &Prefix(\8cg\91Ñ_6___)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_6_ : Global\r
+ key *IC-IL-Num0 => BS P A &Prefix(\8cg\91Ñ_6__)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_6 : Global\r
+ key *IC-IL-Num6 => BS H I &Prefix(\8cg\91Ñ_6_6)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => BS B A &Prefix(\8cg\91Ñ_6_)\r
+keymap2 \8cg\91Ñ_5_5_5_5_5 : Global\r
+ key *IC-IL-Num5 => BS N A &Prefix(\8cg\91Ñ_5)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_5_5_5_5 : Global\r
+ key *IC-IL-Num5 => BS N O &Prefix(\8cg\91Ñ_5_5_5_5_5)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_5_5_5 : Global\r
+ key *IC-IL-Num5 => BS N E &Prefix(\8cg\91Ñ_5_5_5_5)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_5_5 : Global\r
+ key *IC-IL-Num5 => BS N U &Prefix(\8cg\91Ñ_5_5_5)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_5 : Global\r
+ key *IC-IL-Num5 => BS N I &Prefix(\8cg\91Ñ_5_5)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_4_4_4_4_4_4 : Global\r
+ key *IC-IL-Num4 => BS T A &Prefix(\8cg\91Ñ_4)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+\r
+keymap2 \8cg\91Ñ_4_4_4_4_4_ : Global\r
+\r
+keymap2 \8cg\91Ñ_4_4_4_4_4____ : Global\r
+ key *IC-IL-Num0 => BS BS D O &Prefix(\8cg\91Ñ_4_4_4_4_4_)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_4_4_4_4_4___ : Global\r
+ key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_4_4_4_4_4____)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_4_4_4_4_4__ : Global\r
+ key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_4_4_4_4_4___)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_4_4_4_4_4_ : Global\r
+ key *IC-IL-Num0 => BS T O &Prefix(\8cg\91Ñ_4_4_4_4_4__)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_4_4_4_4_4 : Global\r
+ key *IC-IL-Num4 => BS X T U &Prefix(\8cg\91Ñ_4_4_4_4_4_4)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => BS D O &Prefix(\8cg\91Ñ_4_4_4_4_4_)\r
+\r
+keymap2 \8cg\91Ñ_4_4_4_4_ : Global\r
+\r
+keymap2 \8cg\91Ñ_4_4_4_4____ : Global\r
+ key *IC-IL-Num0 => BS BS D E &Prefix(\8cg\91Ñ_4_4_4_4_)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_4_4_4_4___ : Global\r
+ key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_4_4_4_4____)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_4_4_4_4__ : Global\r
+ key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_4_4_4_4___)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_4_4_4_4_ : Global\r
+ key *IC-IL-Num0 => BS T E &Prefix(\8cg\91Ñ_4_4_4_4__)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_4_4_4_4 : Global\r
+ key *IC-IL-Num4 => BS T O &Prefix(\8cg\91Ñ_4_4_4_4_4)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => BS D E &Prefix(\8cg\91Ñ_4_4_4_4_)\r
+\r
+keymap2 \8cg\91Ñ_4_4_4_ : Global\r
+\r
+keymap2 \8cg\91Ñ_4_4_4____ : Global\r
+ key *IC-IL-Num0 => BS BS D U &Prefix(\8cg\91Ñ_4_4_4_)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_4_4_4___ : Global\r
+ key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_4_4_4____)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_4_4_4__ : Global\r
+ key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_4_4_4___)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_4_4_4_ : Global\r
+ key *IC-IL-Num0 => BS T U &Prefix(\8cg\91Ñ_4_4_4__)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_4_4_4 : Global\r
+ key *IC-IL-Num4 => BS T E &Prefix(\8cg\91Ñ_4_4_4_4)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => BS D U &Prefix(\8cg\91Ñ_4_4_4_)\r
+\r
+keymap2 \8cg\91Ñ_4_4_ : Global\r
+\r
+keymap2 \8cg\91Ñ_4_4____ : Global\r
+ key *IC-IL-Num0 => BS BS D I &Prefix(\8cg\91Ñ_4_4_)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_4_4___ : Global\r
+ key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_4_4____)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_4_4__ : Global\r
+ key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_4_4___)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_4_4_ : Global\r
+ key *IC-IL-Num0 => BS T I &Prefix(\8cg\91Ñ_4_4__)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_4_4 : Global\r
+ key *IC-IL-Num4 => BS T U &Prefix(\8cg\91Ñ_4_4_4)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => BS D I &Prefix(\8cg\91Ñ_4_4_)\r
+\r
+keymap2 \8cg\91Ñ_4_ : Global\r
+\r
+keymap2 \8cg\91Ñ_4____ : Global\r
+ key *IC-IL-Num0 => BS BS D A &Prefix(\8cg\91Ñ_4_)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_4___ : Global\r
+ key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_4____)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_4__ : Global\r
+ key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_4___)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_4_ : Global\r
+ key *IC-IL-Num0 => BS T A &Prefix(\8cg\91Ñ_4__)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_4 : Global\r
+ key *IC-IL-Num4 => BS T I &Prefix(\8cg\91Ñ_4_4)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => BS D A &Prefix(\8cg\91Ñ_4_)\r
+\r
+keymap2 \8cg\91Ñ_3_3_3_3_3_ : Global\r
+\r
+keymap2 \8cg\91Ñ_3_3_3_3_3____ : Global\r
+ key *IC-IL-Num0 => BS BS Z O &Prefix(\8cg\91Ñ_3_3_3_3_3_)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_3_3_3_3_3___ : Global\r
+ key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_3_3_3_3_3____)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_3_3_3_3_3__ : Global\r
+ key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_3_3_3_3_3___)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_3_3_3_3_3_ : Global\r
+ key *IC-IL-Num0 => BS S O &Prefix(\8cg\91Ñ_3_3_3_3_3__)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_3_3_3_3_3 : Global\r
+ key *IC-IL-Num9 => BS S A &Prefix(\8cg\91Ñ_3)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => BS Z O &Prefix(\8cg\91Ñ_3_3_3_3_3_)\r
+\r
+keymap2 \8cg\91Ñ_3_3_3_3_ : Global\r
+\r
+keymap2 \8cg\91Ñ_3_3_3_3____ : Global\r
+ key *IC-IL-Num0 => BS BS Z E &Prefix(\8cg\91Ñ_3_3_3_3_)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_3_3_3_3___ : Global\r
+ key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_3_3_3_3____)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_3_3_3_3__ : Global\r
+ key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_3_3_3_3___)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_3_3_3_3_ : Global\r
+ key *IC-IL-Num0 => BS S E &Prefix(\8cg\91Ñ_3_3_3_3__)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_3_3_3_3 : Global\r
+ key *IC-IL-Num9 => BS S O &Prefix(\8cg\91Ñ_3_3_3_3_3)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => BS Z E &Prefix(\8cg\91Ñ_3_3_3_3_)\r
+\r
+keymap2 \8cg\91Ñ_3_3_3_ : Global\r
+\r
+keymap2 \8cg\91Ñ_3_3_3____ : Global\r
+ key *IC-IL-Num0 => BS BS Z U &Prefix(\8cg\91Ñ_3_3_3_)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_3_3_3___ : Global\r
+ key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_3_3_3____)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_3_3_3__ : Global\r
+ key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_3_3_3___)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_3_3_3_ : Global\r
+ key *IC-IL-Num0 => BS S U &Prefix(\8cg\91Ñ_3_3_3__)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_3_3_3 : Global\r
+ key *IC-IL-Num9 => BS S E &Prefix(\8cg\91Ñ_3_3_3_3)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => BS Z U &Prefix(\8cg\91Ñ_3_3_3_)\r
+\r
+keymap2 \8cg\91Ñ_3_3_ : Global\r
+\r
+keymap2 \8cg\91Ñ_3_3____ : Global\r
+ key *IC-IL-Num0 => BS BS J I &Prefix(\8cg\91Ñ_3_3_)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_3_3___ : Global\r
+ key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_3_3____)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_3_3__ : Global\r
+ key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_3_3___)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_3_3_ : Global\r
+ key *IC-IL-Num0 => BS S I &Prefix(\8cg\91Ñ_3_3__)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_3_3 : Global\r
+ key *IC-IL-Num9 => BS S U &Prefix(\8cg\91Ñ_3_3_3)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => BS J I &Prefix(\8cg\91Ñ_3_3_)\r
+\r
+keymap2 \8cg\91Ñ_3_ : Global\r
+\r
+keymap2 \8cg\91Ñ_3____ : Global\r
+ key *IC-IL-Num0 => BS BS Z A &Prefix(\8cg\91Ñ_3_)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_3___ : Global\r
+ key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_3____)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_3__ : Global\r
+ key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_3___)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_3_ : Global\r
+ key *IC-IL-Num0 => BS S A &Prefix(\8cg\91Ñ_3__)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_3 : Global\r
+ key *IC-IL-Num9 => BS S I &Prefix(\8cg\91Ñ_3_3)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => BS Z A &Prefix(\8cg\91Ñ_3_)\r
+\r
+keymap2 \8cg\91Ñ_2_2_2_2_2_ : Global\r
+\r
+keymap2 \8cg\91Ñ_2_2_2_2_2____ : Global\r
+ key *IC-IL-Num0 => BS BS G O &Prefix(\8cg\91Ñ_2_2_2_2_2_)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_2_2_2_2_2___ : Global\r
+ key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_2_2_2_2_2____)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_2_2_2_2_2__ : Global\r
+ key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_2_2_2_2_2___)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_2_2_2_2_2_ : Global\r
+ key *IC-IL-Num0 => BS K O &Prefix(\8cg\91Ñ_2_2_2_2_2__)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_2_2_2_2_2 : Global\r
+ key *IC-IL-Num8 => BS K A &Prefix(\8cg\91Ñ_2)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => BS G O &Prefix(\8cg\91Ñ_2_2_2_2_2_)\r
+\r
+keymap2 \8cg\91Ñ_2_2_2_2_ : Global\r
+\r
+keymap2 \8cg\91Ñ_2_2_2_2____ : Global\r
+ key *IC-IL-Num0 => BS BS G E &Prefix(\8cg\91Ñ_2_2_2_2_)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_2_2_2_2___ : Global\r
+ key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_2_2_2_2____)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_2_2_2_2__ : Global\r
+ key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_2_2_2_2___)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_2_2_2_2_ : Global\r
+ key *IC-IL-Num0 => BS K E &Prefix(\8cg\91Ñ_2_2_2_2__)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_2_2_2_2 : Global\r
+ key *IC-IL-Num8 => BS K O &Prefix(\8cg\91Ñ_2_2_2_2_2)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => BS G E &Prefix(\8cg\91Ñ_2_2_2_2_)\r
+\r
+keymap2 \8cg\91Ñ_2_2_2_ : Global\r
+\r
+keymap2 \8cg\91Ñ_2_2_2____ : Global\r
+ key *IC-IL-Num0 => BS BS G U &Prefix(\8cg\91Ñ_2_2_2_)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_2_2_2___ : Global\r
+ key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_2_2_2____)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_2_2_2__ : Global\r
+ key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_2_2_2___)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_2_2_2_ : Global\r
+ key *IC-IL-Num0 => BS K U &Prefix(\8cg\91Ñ_2_2_2__)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_2_2_2 : Global\r
+ key *IC-IL-Num8 => BS K E &Prefix(\8cg\91Ñ_2_2_2_2)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => BS G U &Prefix(\8cg\91Ñ_2_2_2_)\r
+\r
+keymap2 \8cg\91Ñ_2_2_ : Global\r
+\r
+keymap2 \8cg\91Ñ_2_2____ : Global\r
+ key *IC-IL-Num0 => BS BS G I &Prefix(\8cg\91Ñ_2_2_)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_2_2___ : Global\r
+ key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_2_2____)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_2_2__ : Global\r
+ key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_2_2___)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_2_2_ : Global\r
+ key *IC-IL-Num0 => BS K I &Prefix(\8cg\91Ñ_2_2__)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_2_2 : Global\r
+ key *IC-IL-Num8 => BS K U &Prefix(\8cg\91Ñ_2_2_2)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => BS G I &Prefix(\8cg\91Ñ_2_2_)\r
+\r
+keymap2 \8cg\91Ñ_2_ : Global\r
+\r
+keymap2 \8cg\91Ñ_2____ : Global\r
+ key *IC-IL-Num0 => BS BS G A &Prefix(\8cg\91Ñ_2_)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_2___ : Global\r
+ key *IC-IL-Num0 => BS FullStop &Prefix(\8cg\91Ñ_2____)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_2__ : Global\r
+ key *IC-IL-Num0 => Comma &Prefix(\8cg\91Ñ_2___)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_2_ : Global\r
+ key *IC-IL-Num0 => BS K A &Prefix(\8cg\91Ñ_2__)\r
+ key *IC-IL-\81¨ => &Ignore\r
+keymap2 \8cg\91Ñ_2 : Global\r
+ key *IC-IL-Num8 => BS K I &Prefix(\8cg\91Ñ_2_2)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => BS G A &Prefix(\8cg\91Ñ_2_)\r
+keymap2 \8cg\91Ñ_1_1_1_1_1_1_1_1_1_1 : Global\r
+ key *IC-IL-Num7 => BS A &Prefix(\8cg\91Ñ_1)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_1_1_1_1_1_1_1_1_1 : Global\r
+ key *IC-IL-Num7 => BS X O &Prefix(\8cg\91Ñ_1_1_1_1_1_1_1_1_1_1)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_1_1_1_1_1_1_1_1 : Global\r
+ key *IC-IL-Num7 => BS X E &Prefix(\8cg\91Ñ_1_1_1_1_1_1_1_1_1)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_1_1_1_1_1_1_1 : Global\r
+ key *IC-IL-Num7 => BS X U &Prefix(\8cg\91Ñ_1_1_1_1_1_1_1_1)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_1_1_1_1_1_1 : Global\r
+ key *IC-IL-Num7 => BS X I &Prefix(\8cg\91Ñ_1_1_1_1_1_1_1)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_1_1_1_1_1 : Global\r
+ key *IC-IL-Num7 => BS X A &Prefix(\8cg\91Ñ_1_1_1_1_1_1)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_1_1_1_1 : Global\r
+ key *IC-IL-Num7 => BS O &Prefix(\8cg\91Ñ_1_1_1_1_1)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_1_1_1 : Global\r
+ key *IC-IL-Num7 => BS E &Prefix(\8cg\91Ñ_1_1_1_1)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_1_1 : Global\r
+ key *IC-IL-Num7 => BS U &Prefix(\8cg\91Ñ_1_1_1)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_1 : Global\r
+ key *IC-IL-Num7 => BS I &Prefix(\8cg\91Ñ_1_1)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_0_0_0 : Global\r
+ key *IC-IL-NumFullStop => BS W A &Prefix(\8cg\91Ñ_0)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_0_0 : Global\r
+ key *IC-IL-NumFullStop => BS N N &Prefix(\8cg\91Ñ_0_0_0)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap2 \8cg\91Ñ_0 : Global\r
+ key *IC-IL-NumFullStop => BS W O &Prefix(\8cg\91Ñ_0_0)\r
+ key *IC-IL-\81¨ => &Ignore\r
+ key *IC-IL-Num0 => &Prefix(\8cg\91Ñ_)\r
+keymap Global\r
+ key *IC-IL-NumFullStop => W A &Prefix(\8cg\91Ñ_0)\r
+ key *IC-IL-Num7 => A &Prefix(\8cg\91Ñ_1)\r
+ key *IC-IL-Num8 => K A &Prefix(\8cg\91Ñ_2)\r
+ key *IC-IL-Num9 => S A &Prefix(\8cg\91Ñ_3)\r
+ key *IC-IL-Num4 => T A &Prefix(\8cg\91Ñ_4)\r
+ key *IC-IL-Num5 => N A &Prefix(\8cg\91Ñ_5)\r
+ key *IC-IL-Num6 => H A &Prefix(\8cg\91Ñ_6)\r
+ key *IC-IL-Num1 => M A &Prefix(\8cg\91Ñ_7)\r
+ key *IC-IL-Num2 => Y A &Prefix(\8cg\91Ñ_8)\r
+ key *IC-IL-Num3 => R A &Prefix(\8cg\91Ñ_9)\r
index 0069fab..1262606 100644 (file)
-\83p\83b\83P\81[\83W\82É\8aÜ\82Ü\82ê\82é\90Ý\92è\83t\83@\83C\83\8b\82É\82Â\82¢\82Ä  by HANAWA Yoshio\81i\92P\82È\82é\88ê\83\86\81[\83U\81[\81j
-
-.mayu\82ð\8f\91\82­\8dÛ\82É\81A\8dÅ\8f\89\82©\82ç\82 \82é\83t\83@\83C\83\8b\82ª\89½\82È\82Ì\82©\82í\82©\82ç\82È\82¢\82Æ
-\8bê\82µ\82¢\82Æ\8ev\82¢\82Ü\82µ\82½\82Ì\82Å\81A\83}\83j\83\85\83A\83\8b\82É\92Ç\89Á\82µ\82Ä\82­\82ê\81A\82Æ\82¢\82¤\88Ó\96¡\82Å
-\88ê\83\86\81[\83U\81[\82Å\82 \82é\8e\84\81i\88È\89º\81A\95M\8eÒ\81j\82ª\82±\82Ì\83t\83@\83C\83\8b\82ð\8dì\8eÒ\82É\83v\83\8c\83[\83\93\83g\82µ\82½\82Æ\82±\82ë\81A
-\82±\82Ì\83t\83@\83C\83\8b\82à\83p\83b\83P\81[\83W\82É\8aÜ\82Ü\82ê\82é\82±\82Æ\82É\82È\82è\82Ü\82µ\82½\81B
-\82±\82ê\82©\82ç\90Ý\92è\82ð\92²\90®\82·\82é\95û\82Ì\8eQ\8dl\82É\82È\82ê\82Î\8dK\82¢\82Å\82·\81B
-
-
-104.mayu        \89p\8cê\83L\81[\83{\81[\83h\97p\92è\8b`\83t\83@\83C\83\8b
-104on109.mayu   \89p\8cê\83L\81[\83{\81[\83h\82ð\93ú\96{\8cê\83L\81[\83{\81[\83h\95\97\82É\8eg\82¤\90Ý\92è
-109.mayu        \93ú\96{\8cê\83L\81[\83{\81[\83h\97p\92è\8b`\83t\83@\83C\83\8b
-109on104.mayu   \93ú\96{\8cê\83L\81[\83{\81[\83h\82ð\89p\8cê\83L\81[\83{\81[\83h\95\97\82É\8eg\82¤\90Ý\92è
-default.mayu    \81i\8dì\8eÒ\8dD\82Ý\82Ì\81j\95Ö\97\98\82È\90Ý\92è\82Ì\93ü\82Á\82½\83t\83@\83C\83\8b
-dot.mayu        \83f\83t\83H\83\8b\83g\82Ì\90Ý\92è\83t\83@\83C\83\8b
-emacsedit.mayu  emacs\82É\8e\97\82¹\82½\83L\81[\83}\83b\83v\82Ì\92è\8b`
-
-contrib/98x1.mayu          NEC PC-98x1\97p\82Ì\90Ý\92è
-contrib/ax.mayu            AX\83L\81[\83{\81[\83h\97p\82Ì\90Ý\92è
-contrib/dvorak.mayu        \95\81\92Ê\82Ì\83L\81[\83{\81[\83h\82Ådvorak\95\97\82É\8eg\82¤\90Ý\92è
-contrib/keitai.mayu        IME\93ü\97Í\8e\9e\82É\83e\83\93\83L\81[\82Å\8cg\91Ñ\93d\98b\95\97\82É\8eg\82¤\90Ý\92è
-contrib/mayu-settings.txt  \82±\82Ì\83t\83@\83C\83\8b
-
-
-\82±\82ê\82ç\82É\82Â\82¢\82Ä\8f\87\82É\90à\96¾\82µ\82Ä\82¢\82­\82Æ\81A
-
-104.mayu
-\89p\8cê\83L\81[\83{\81[\83h\82Å\82Ì\83L\81[\96¼\82Ì\92è\8b`\82ð\82µ\82Ä\82¢\82é\82¾\82¯\82Å\81A
-\82±\82ê\82¾\82¯\82Å\82Í\83L\81[\94z\92u\82É\8aÖ\82µ\82Ä\82Í\89½\82à\95Ï\82í\82è\82Ü\82¹\82ñ\82ª\81A
-\82±\82ê\82ª\82È\82¢\82Æ\89½\82à\93®\82«\82Ü\82¹\82ñ\82Ì\82Å\81A
-\81i\89p\8cê\83L\81[\83{\81[\83h\82È\82ç\82Î\81j\95K\82¸\8dÅ\8f\89\82É\93Ç\82Ý\8d\9e\82ñ\82Å\82­\82¾\82³\82¢\81B
-
-
-104on109.mayu
-\93ú\96{\8cê\83L\81[\83{\81[\83h\82ð\8eg\82í\82´\82é\82ð\93¾\82È\82¢\82à\82Ì\82Ì\81A
-\89p\8cê\83L\81[\83{\81[\83h\82É\97]\82è\82É\8aµ\82ê\82Ä\82¢\82é\82½\82ß\81A
-\83L\81[\83g\83b\83v\82Ì\95\8e\9a\82Æ\82Í\88Ù\82È\82Á\82Ä\82µ\82Ü\82¤\82É\82à\8aÖ\82í\82ç\82¸
-\89p\8cê\83L\81[\83{\81[\83h\82Æ\93¯\82\94z\92u\82É\82µ\82½\82¢\90l\82Ì\82½\82ß\82Ì\90Ý\92è\83t\83@\83C\83\8b\82Å\82·\81B
-\81i\95M\8eÒ\82Í\8fí\97p\82µ\82Ä\82¨\82è\82Ü\82·\81j
-\8bï\91Ì\93I\82É\82Í\81A
-  [\94¼\8ap/\91S\8ap]         => [`]
-  [Shift]+[\94¼\8ap/\91S\8ap] => [~]
-  [Alt]+[\94¼\8ap/\91S\8ap]   => IME on/off
-  [Shift]+[2]         => [@]
-  [Shift]+[6]         => [^]
-  [Shift]+[7]         => [&]
-  [Shift]+[8]         => [*]
-  [Shift]+[9]         => [(]
-  [Shift]+[0]         => [)]
-  [Shift]+[-]         => [_]
-  [^]                 => [=]
-  [Shift]+[^]         => [+]
-  [@]                 => [[]
-  [Shift]+[@]         => [{]
-  [[]                 => []]
-  [Shift]+[[]         => [}]
-  []]                 => [\]
-  [Shift]+[]]         => [|]
-  [Shift]+[;]         => [:]
-  [:]                 => [']
-  [Shift]+[:]         => ["]
-  [\96³\95Ï\8a·]            => [Space]
-  [\95Ï\8a·]              => [Space]
-  [\82Ð\82ç\82ª\82È]          => [Space]
-  [\89p\90\94]              => [Shift]+[\89p\90\94]
-  \81w\81__\82ë\81x           => [Shift]
-\82Æ\82È\82Á\82Ä\82¢\82Ü\82·\81B
-\81w]}\82Þ\81v\81x\82Ì\83L\81[\82É\88á\98a\8a´\82ð\8ao\82¦\82Ü\82·\82ª\81A
-Enter \82É\82µ\82Ä\82µ\82Ü\82¤\82Ì\82à\8eè\82©\82Æ\8ev\82¢\82Ü\82·\81B
-\81i\95M\8eÒ\82Í\82Ç\82¤\82Å\82à\82æ\82¢\82Ì\82Å\82·\82ª\81B
-  \82Æ\82¢\82¤\82Ì\82à\81A Enter \82Í C-m \82Ì\82Ý\82Æ\82¢\82¤\83|\83\8a\83V\81[\82È\82Ì\82Å\81j
-\91å\92ï\82Ì\90l\82Í\82±\82ê\82Å\96\9e\91«\82È\82Ì\82Å\82Í\82È\82¢\82Å\82µ\82å\82¤\82©\81B
-109\82ð\8eg\82Á\82Ä\82¢\82Ä\82à\81A\83h\83\89\83C\83o\82¾\82¯104\82É\82µ\82Ä\82µ\82Ü\82¦\82Î
-\93¯\82\82æ\82¤\82È\82±\82Æ\82ª\8eÀ\8c»\82Å\82«\82Ü\82·\82ª\81A
-\91¼\90l\82à\8eg\82¤\82æ\82¤\82È\83}\83V\83\93\82Å\82 \82ê\82Î\81A
-mayu\82ð\83C\83\93\83X\83g\81[\83\8b\82µ\82Ä104on109\82Å\8eg\82¤\95û\82ª\82¨\91E\82ß\82Å\82·\81B
-
-
-109.mayu
-\93ú\96{\8cê\83L\81[\83{\81[\83h\82Å\82Ì\83L\81[\96¼\82Ì\92è\8b`\82ð\82µ\82Ä\82¢\82é\82¾\82¯\82Å\81A
-\82±\82ê\82¾\82¯\82Å\82Í\83L\81[\94z\92u\82É\8aÖ\82µ\82Ä\82Í\89½\82à\95Ï\82í\82è\82Ü\82¹\82ñ\82ª\81A
-\82±\82ê\82ª\82È\82¢\82Æ\89½\82à\93®\82«\82Ü\82¹\82ñ\82Ì\82Å\81A
-\81i\93ú\96{\8cê\83L\81[\83{\81[\83h\82È\82ç\82Î\81j\95K\82¸\8dÅ\8f\89\82É\93Ç\82Ý\8d\9e\82ñ\82Å\82­\82¾\82³\82¢\81B
-
-
-109on104.mayu
-\89p\8cê\83L\81[\83{\81[\83h\82ð\8eg\82í\82´\82é\82ð\93¾\82È\82¢\82à\82Ì\82Ì\81A
-\93ú\96{\8cê\83L\81[\83{\81[\83h\82É\97]\82è\82É\8aµ\82ê\82Ä\82¢\82é\82½\82ß\81A
-\83L\81[\83g\83b\83v\82Ì\95\8e\9a\82Æ\82Í\88Ù\82È\82Á\82Ä\82µ\82Ü\82¤\82É\82à\8aÖ\82í\82ç\82¸
-\93ú\96{\8cê\83L\81[\83{\81[\83h\82Æ\93¯\82\94z\92u\82É\82µ\82½\82¢\90l\82Ì\82½\82ß\82Ì\90Ý\92è\83t\83@\83C\83\8b\82Å\82·\81B
-\82±\82ê\82ð\8fí\97p\82µ\82Ä\82¢\82é\90l\82Í\90¢\8aE\92\86\92T\82µ\82Ä\82à\82¢\82È\82¢\82Æ\8ev\82í\82ê\82Ü\82·\82Ì\82Å\81A
-\8d¡\82Ð\82Æ\82Â\97û\82ê\82Ä\82¢\82È\82¢\82Í\82¸\82Å\82·\81B\81i\8dì\8eÒ\82Í\8bH\82É\8eg\82¤\82»\82¤\82Å\82·\82ª\81j
-\8eg\82¢\82±\82ñ\82Å\82Ý\82Ä\81A\8a´\91z\82â\97v\96]\82ð\8dì\8eÒ\82É\91\97\82é\82Æ\8aì\82Î\82ê\82Ü\82·\81B
-
-
-default.mayu
-\8dì\8eÒ\82Ì\8eï\96¡\82É\8f]\82Á\82Ä\8dì\82ç\82ê\82½\81A\95Î\82Á\82½\83f\83t\83H\83\8b\83g\90Ý\92è\83t\83@\83C\83\8b\82Å\82·\81B
-\82±\82ê\82ð$HOME/.mayu\82Å\93Ç\82Ý\8d\9e\82ß\82Î\81AUN*X\8eg\82¢\82Í\8dK\82¹\82É\82È\82ê\82é\82Í\82¸\82Å\82·\81B
-\82¨\82¨\82Ü\82©\82É\8c¾\82¤\82Æ\81AUN*X\82âemacs\82ð\8fí\97p\82µ\82Ä\82¢\82é\90l\8cü\82¯\82Ì\90Ý\92è\82Å\82·\81B
-\83o\81[\83W\83\87\83\93\83A\83b\83v\82Ì\82½\82Ñ\82É\96³\8bO\93¹\82É\91\9d\82¦\82Ä\82¢\82­\82Ì\82Å\81A
-\91S\82Ä\82ð\90à\96¾\82·\82é\82Ì\82Í\95s\89Â\94\\82¾\82Æ\8ev\82¢\82Ü\82·\82ª\81A
-\89Â\94\\82È\94Í\88Í\82Å\97ñ\8b\93\82µ\82Ä\82¢\82«\82Ü\82·\81B
-1. Caps\82Ü\82½\82Í\89p\90\94\83L\81[\82ðCtrl\83L\81[\82É\82µ\82Ü\82·\81B\81i\93ü\82ê\91Ö\82¦\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81j
-2. 109\83L\81[\83{\81[\83h\82Å\82©\82Â104on109\82ð\8eg\82Á\82Ä\82¢\82È\82¢\8fê\8d\87\81A
-   ESC\83L\81[\82Æ\94¼\8ap/\91S\8ap\83L\81[\82ð\93ü\82ê\91Ö\82¦\82Ü\82·\81B
-   \81i104on109\82ª\97L\8cø\82È\8fê\8d\87\82Í\81A\94¼\8ap/\91S\8ap\83L\81[\82Í\81u~\81v\82É\82È\82è\82Ü\82·\81j
-3. [Ctrl]+[Shift]+[\89½\82©\82Ì\83L\81[]\82Å\8c»\8dÝ\82Ì\83E\83C\83\93\83h\83E\82É\91Î\82·\82é\91\80\8dì\82ª\82Å\82«\82Ü\82·\81B
-     \92N\82ª\8dl\88Ä\8eÒ\82È\82Ì\82©\8dì\8eÒ\82ç\82à\92m\82è\82Ü\82¹\82ñ\82ª\81A\96^\8f\8a\82Å\82Ìtwm\82Ì\93®\8dì\82ð\93¥\8fP\82µ\82Ä\82¢\82Ü\82·\81B
-       C-S-[\96î\88ó\83L\81[]  \82Å\83E\83C\83\93\83h\83E\82ð\88Ú\93®
-       C-S-A-[\96î\88ó\83L\81[]\82Å\83E\83C\83\93\83h\83E\82ð\8f¬\82³\82­\88Ú\93®
-       C-S-z \82Å\8dÅ\91å\89»(zoom)
-       C-S-x \82Å\8fc\95û\8cü\82Ì\82Ý\8dÅ\91å\89»
-       C-S-c \82Å\89¡\95û\8cü\82Ì\82Ý\8dÅ\91å\89»
-       C-S-i \82Å\8dÅ\8f¬\89»(iconify)
-       C-S-k \82Å\95Â\82\82é(kill)
-       C-S-[a/e/p/n] \82Å\82»\82Ì\83E\83C\83\93\83h\83E\82ð\8d¶/\89E/\8fã/\89º\92[\82É\8d\87\82í\82¹\82é(emacs\95\97?)
-       C-S-l \82Å\82»\82Ì\83E\83C\83\93\83h\83E\82ª\83t\83H\81[\83J\83X\82ð\8e\9d\82Á\82½\82Ü\82Ü\88ê\94Ô\89º\82É(lower)
-       C-S-r \82Å\82»\82Ì\83E\83C\83\93\83h\83E\82ª\83t\83H\81[\83J\83X\82ð\8e\9d\82Á\82½\82Ü\82Ü\88ê\94Ô\8fã\82É(raise)
-       C-S-v \82Å\82»\82Ì\83E\83C\83\93\83h\83E\82ð\8c©\82¦\82é\88Ê\92u\82É\8e\9d\82Á\82Ä\82­\82é(visible?)
-     \82È\82Ç\82È\82Ç\81B
-     \8dÅ\8cã\82Ì\82à\82Ì\82Í\81A\82»\82Ì\91\8b\82ª\83}\83E\83X\82Å\82Ç\82¤\82â\82Á\82Ä\82à\82Â\82©\82ß\82È\82¢\8fê\8f\8a\82É\8ds\82Á\82½\82Æ\82«\82É
-     \82±\82ê\88È\8aO\82É\89ð\8c\88\95û\96@\82ª\82È\82¢\82Ù\82Ç\95Ö\97\98\82Å\82·\81B\81iWindows\95W\8f\80\82Å\82à\89Â\94\\82Å\82·\82¯\82Ç\81j
-     \82Ü\82½\81A\83t\83H\81[\83J\83X\82ð\8aO\82³\82È\82¢\82Å\8e©\95ª\8e©\90g\82Ì\8cã\82ë\82Ì\91\8b\82ð\8c©\82½\82¢\82Æ\82«\82É
-     lower&raise \82Í\95Ö\97\98\82Å\82·\81B\81iWindows\95W\8f\80\82Å\82Í\95s\89Â\94\\82È\93®\8dì\82Å\82·\81j
-     \83L\81[\88ê\94­\82Å\8dÅ\91å\89»\82à\95È\82É\82È\82è\82Ü\82·\81B
-4. C-\ \82ÅIME\82Ì\83I\83\93/\83I\83t\82ð\82Å\82«\82é\82æ\82¤\82É\82µ\82Ü\82·\81B
-     \88ê\95\94\82ÌUN*X\82Å\8dL\82­\8eg\82í\82ê\82Ä\82¢\82é\81Aegg\82Ì\83L\81[\83o\83C\83\93\83f\83B\83\93\83O\82Å\82·\81B
-5. \91½\82­\82Ì\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Åemacs\95\97\82È\83L\81[\93ü\97Í\82ð\8eó\82¯\95t\82¯\82Ü\82·\81B
-     \83\81\83\82\92 \82âInternetExplorer\81ANetScape\82È\82Ç\82ªemacs\95\97\82É\82È\82è\82Ü\82·\81B
-     \95M\8eÒ\82Í\82Ù\82Æ\82ñ\82Ç\8eg\82í\82È\82¢\82Ì\82Å\82·\82ª\81AWord\82âPowerPoint\82È\82Ç\82ÌOffice\90»\95i\81A
-     Becky!\82âEdmax\82È\82Ç\82Ì\83\81\81[\83\89\81[\82Å\82àemacs\95\97\82É\93®\82­\82æ\82¤\82Å\82·\81B
-     \83\81\83\82\92 \82È\82Ç\82ÅC-a\82Å\8ds\93ª\82É\8ds\82±\82¤\82Æ\82µ\82Ä\91S\95\94\91I\91ð\82µ\82Ä\82µ\82Ü\82¤\90l\81A
-     IE\82ânetscape\82ÅC-h\82Å\88ê\95\8e\9a\8fÁ\82»\82¤\82Æ\82µ\82Ä\83q\83X\83g\83\8a\82ð\8fo\82µ\82Ä\82µ\82Ü\82¤\90l\81A
-     \82Ü\82½\81A\83\81\83\82\92 \82ÅC-x C-s\82Å\83Z\81[\83u\82µ\82»\82¤\82É\82È\82é\90l\82É\82¨\91E\82ß\82Å\82·\81B
-6. NT\83R\83\93\83\\81[\83\8b\82ÆTeraTerm\82Å\81Akterm\95\97\82Ì\91\80\8dì\82ð\89Â\94\\82É\82µ\82Ü\82·\81B
-     UN*X\82ð\95\81\92i\8eg\82Á\82Ä\82¢\82é\90l\82Å\82à\81A\88Ó\8aO\82É\92m\82ç\82È\82¢\90l\82ª\91½\82¢\82Ì\82Å\82·\82ª\81A
-     xterm/kterm(UN*X\82Ì\95W\8f\80\93I\83R\83\93\83\\81[\83\8b)\82Å\82Í\81A
-       Shift+Insert\82Å\83y\81[\83X\83g\81A
-       Shift+PageUp/Down\82Å\8fã\89º\83X\83N\83\8d\81[\83\8b
-     \82ª\82Å\82«\82Ü\82·\81B\82±\82ê\82ðNT\83R\83\93\83\\81[\83\8b\82ÆTeraTerm\82Å\82à\82Å\82«\82é\82æ\82¤\82É\82µ\82Ü\82·\81B
-7. \83}\83C\83\93\83X\83C\81[\83p\82ª\83L\81[\83{\81[\83h\82¾\82¯\82Å\91\80\8dì\82Å\82«\82Ü\82·\81B
-     \83e\83\93\83L\81[\82Å\83}\83E\83X\83J\81[\83\\83\8b\88Ú\93®
-     z,x,c\83L\81[\82ª\82»\82ê\82¼\82ê\89E\83{\83^\83\93\81A\8d\89E\93¯\8e\9e\89\9f\82µ\81A\8d\83{\83^\83\93
-     \81i\8d\8eè\82Å\88µ\82¤\82½\82ß\81A\83}\83E\83X\82Æ\82Í\94z\92u\82ª\8bt\82Å\82·\81j
-8. \82»\82Ì\91¼\81A\83A\83v\83\8a\82²\82Æ\82Ì\90Ý\92è\81B
-     \97á\82¦\82Î\81ATeraTerm \82Å\82Í C-/ \82Ì\83L\81[\93ü\97Í\81iemacs\82Ìundo\81j\82ð
-     \93`\82¦\82Ä\82­\82ê\82È\82¢\82Æ\82¢\82¤\96â\91è\93_\82ª\82 \82è\82Ü\82·\82ª\81A
-     TeraTerm \8fã\82Å C-/ \82ª\89\9f\82³\82ê\82½\82ç C-_ \82ª\89\9f\82³\82ê\82½\82æ\82¤\82É\90U\95\91\82¤\82±\82Æ\82Å
-     \82±\82ê\82ð\89ð\8c\88\82µ\82Ä\82¢\82Ü\82·\81B\81i\82±\82ê\82Å\82Í\89ð\8c\88\82É\82È\82ç\82È\82¢\90l\82¢\82Ü\82·\82©\81H\81j
-
-
-\91¼\82É\82à\81A\96\9c\90l\82ª\8aì\82Ô\82Æ\8dì\8eÒ\82ª\8ev\82Á\82½\82ç\82Ç\82ñ\82Ç\82ñ\92Ç\89Á\82³\82ê\82Ä\82¢\82­\82Í\82¸\82Å\82·\81B
-\82Ü\82½\82Í\81A7\82Ì\83}\83C\83\93\83X\83C\81[\83p\82Ì\82æ\82¤\82É\81A\92N\82à\96À\98f\82ð\94í\82ç\82È\82¢\82Æ\8ev\82í\82ê\81A
-\82©\82Â\96Ê\94\92\82¯\82ê\82Î\8dÌ\97p\82³\82ê\82é\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B
-\95Ö\97\98\82È\81A\82Ü\82½\82Í\96Ê\94\92\82¢\90Ý\92è\82ª\82 \82è\82Ü\82µ\82½\82çML\82É\93\8a\8de\82µ\82Ä\82Ý\82Ä\89º\82³\82¢\81B
-
-emacs\95\97\83L\81[\83o\83C\83\93\83f\83B\83\93\83O\82É\82µ\82È\82¢\95û\82Í\82±\82Ì\83t\83@\83C\83\8b\82ð\93Ç\82Ý\8d\9e\82Ü\82¸\81A
-\82à\82µ\82±\82Ì\83t\83@\83C\83\8b\92\86\82Ì\95Ö\97\98\82È\95\94\95ª\82ª\82 \82é\82Ì\82È\82ç\82Î\81A\82»\82Ì\95\94\95ª\82ð
-$HOME/.mayu\82É\92Ç\8bL\82·\82é\82Ì\82ª\82¢\82¢\82©\82Æ\8ev\82¢\82Ü\82·\81B
-emacs\82É\8aµ\82ê\82½\95û\82Í$HOME/.mayu\82Å\82±\82Ì\83t\83@\83C\83\8b\82ðinclude\82µ\81A
-\95s\96\9e\82È\93_\82ð$HOME/.mayu\93à\82Å\83I\81[\83o\81[\83\89\83C\83h\82·\82ê\82Î\82æ\82¢\82©\82Æ\8ev\82¢\82Ü\82·\81B
-
-
-dot.mayu
-.mayu\82Ì\83T\83\93\83v\83\8b\82Å\82·\81B
-\83f\83t\83H\83\8b\83g\82Å\81u\91I\91ð\81v\82Ì\91Î\8fÛ\82É\82È\82Á\82Ä\82¢\82Ü\82·\81B
-define\82É\82æ\82è\81A\89p\8cê104\83L\81[\83{\81[\83h\82©\93ú\96{\8cê109\83L\81[\83{\81[\83h\82©(USE104)\81A
-\89p\8cê\83L\81[\83{\81[\83h\82È\82ç\82Î109\95\97\83L\81[\83o\83C\83\93\83f\83B\83\93\83O\82É\82·\82é\82©\82Ç\82¤\82©(USE109on104)\81A
-\93ú\96{\8cê\83L\81[\83{\81[\83h\82È\82ç\82Î104\95\97\83L\81[\83o\83C\83\93\83f\83B\83\93\83O\82É\82·\82é\82©\82Ç\82¤\82©(USE104on109)\81A
-\82»\82ê\82¼\82ê\82Ì\8fê\8d\87\82Édefault.mayu\82ð\93Ç\82Ý\82±\82Þ\82©\82Ç\82¤\82©(USEdefault)\82ð\91I\91ð\82Å\82«\82Ü\82·\81B
-
-
-emacsedit.mayu
-UN*X\82Å\95W\8f\80\93I\82È\81A\83L\81[\83o\83C\83\93\83f\83B\83\93\83O\82ª\93Æ\93Á\82È\83G\83f\83B\83^\82Å\82 \82é\81A
-emacs\82É\8e\97\82½\93®\8dì\82ð\8eÀ\8c»\82³\82¹\82é\82½\82ß\82Ì\90Ý\92è\83t\83@\83C\83\8b\82Å\82·\81B
-default.mayu\82Å\93Ç\82Ý\82±\82Ü\82ê\82Ä\82¢\82Ü\82·\81B
-
-
-contrib/98x1.mayu
-contrib/ax.mayu
-contrib/dvorak.mayu
-\82±\82ê\82ç\82Ì\83t\83@\83C\83\8b\82Í\81Amayu\82Ì\83\86\81[\83U\81[\82©\82ç\92ñ\8b\9f\82³\82ê\82½\83t\83@\83C\83\8b\82Å\82·\81B
-PC-98x1\97p\82Ì\90Ý\92è\83t\83@\83C\83\8b\82Æ\81A
-AX\83L\81[\83{\81[\83h\97p\82Ì\90Ý\92è\83t\83@\83C\83\8b\82Æ\81A
-\95\81\92Ê\82Ì\83L\81[\83{\81[\83h\82Ådvorak\95\97\82É\8eg\82¤\90Ý\92è\82Ì\82æ\82¤\82Å\82·\81B
-\8ec\94O\82È\82ª\82ç\95M\8eÒ\82Í\8eg\82Á\82½\82±\82Æ\82ª\82 \82è\82Ü\82¹\82ñ\82ª\81A
-ML\82Ì\89ß\8b\8e\83\8d\83O\82ª\8eQ\8dl\82É\82È\82é\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B
-
-
-contrib/keitai.mayu
-\95M\8eÒ\82ª\83V\83\83\83\8c\82Å\8dì\82Á\82½\83t\83@\83C\83\8b\82Å\82·\81B\83L\81[\83{\81[\83h\82Ì\94z\92u\82Í\8ao\82¦\82Ä\82¢\82È\82¢\82¯\82ê\82Ç\82à\81A
-\8cg\91Ñ\93d\98b\82Å\83\81\81[\83\8b\82ð\8f\91\82­\82Ì\82Í\88Ù\8fí\82É\91¬\82¢\81A\82Æ\82¢\82¤\90l\8cü\82¯\82Å\82· :-)
-IME\83I\83\93\82Ì\8fó\91Ô\82Å\81A\82©\82È\93ü\97Í\82ª\83e\83\93\83L\81[\82¾\82¯\82Å\8ds\82¦\82Ü\82·\81B
-\8eÀ\97p\82É\82È\82é\82Æ\82Í\8ev\82¦\82Ü\82¹\82ñ\82ª\81A\8eQ\8dl\82Æ\82¢\82¤\82±\82Æ\82Å\81B
-
-
-2000/03/02  written by HANAWA Yoshio <hanawa@is.s.u-tokyo.ac.jp>
-2000/04/06  rewritten by HANAWA Yoshio
-2000/04/24  fixed small bug by TAGA Nayuta <nayuta@i.am>
-2000/05/06  fixed obsolete articles for mayu-3.11 by HANAWA Yoshio
+\83p\83b\83P\81[\83W\82É\8aÜ\82Ü\82ê\82é\90Ý\92è\83t\83@\83C\83\8b\82É\82Â\82¢\82Ä  by HANAWA Yoshio\81i\92P\82È\82é\88ê\83\86\81[\83U\81[\81j\r
+\r
+.mayu\82ð\8f\91\82­\8dÛ\82É\81A\8dÅ\8f\89\82©\82ç\82 \82é\83t\83@\83C\83\8b\82ª\89½\82È\82Ì\82©\82í\82©\82ç\82È\82¢\82Æ\r
+\8bê\82µ\82¢\82Æ\8ev\82¢\82Ü\82µ\82½\82Ì\82Å\81A\83}\83j\83\85\83A\83\8b\82É\92Ç\89Á\82µ\82Ä\82­\82ê\81A\82Æ\82¢\82¤\88Ó\96¡\82Å\r
+\88ê\83\86\81[\83U\81[\82Å\82 \82é\8e\84\81i\88È\89º\81A\95M\8eÒ\81j\82ª\82±\82Ì\83t\83@\83C\83\8b\82ð\8dì\8eÒ\82É\83v\83\8c\83[\83\93\83g\82µ\82½\82Æ\82±\82ë\81A\r
+\82±\82Ì\83t\83@\83C\83\8b\82à\83p\83b\83P\81[\83W\82É\8aÜ\82Ü\82ê\82é\82±\82Æ\82É\82È\82è\82Ü\82µ\82½\81B\r
+\82±\82ê\82©\82ç\90Ý\92è\82ð\92²\90®\82·\82é\95û\82Ì\8eQ\8dl\82É\82È\82ê\82Î\8dK\82¢\82Å\82·\81B\r
+\r
+\r
+104.mayu        \89p\8cê\83L\81[\83{\81[\83h\97p\92è\8b`\83t\83@\83C\83\8b\r
+104on109.mayu   \89p\8cê\83L\81[\83{\81[\83h\82ð\93ú\96{\8cê\83L\81[\83{\81[\83h\95\97\82É\8eg\82¤\90Ý\92è\r
+109.mayu        \93ú\96{\8cê\83L\81[\83{\81[\83h\97p\92è\8b`\83t\83@\83C\83\8b\r
+109on104.mayu   \93ú\96{\8cê\83L\81[\83{\81[\83h\82ð\89p\8cê\83L\81[\83{\81[\83h\95\97\82É\8eg\82¤\90Ý\92è\r
+default.mayu    \81i\8dì\8eÒ\8dD\82Ý\82Ì\81j\95Ö\97\98\82È\90Ý\92è\82Ì\93ü\82Á\82½\83t\83@\83C\83\8b\r
+dot.mayu        \83f\83t\83H\83\8b\83g\82Ì\90Ý\92è\83t\83@\83C\83\8b\r
+emacsedit.mayu  emacs\82É\8e\97\82¹\82½\83L\81[\83}\83b\83v\82Ì\92è\8b`\r
+\r
+contrib/98x1.mayu          NEC PC-98x1\97p\82Ì\90Ý\92è\r
+contrib/ax.mayu            AX\83L\81[\83{\81[\83h\97p\82Ì\90Ý\92è\r
+contrib/dvorak.mayu        \95\81\92Ê\82Ì\83L\81[\83{\81[\83h\82Ådvorak\95\97\82É\8eg\82¤\90Ý\92è\r
+contrib/keitai.mayu        IME\93ü\97Í\8e\9e\82É\83e\83\93\83L\81[\82Å\8cg\91Ñ\93d\98b\95\97\82É\8eg\82¤\90Ý\92è\r
+contrib/mayu-settings.txt  \82±\82Ì\83t\83@\83C\83\8b\r
+\r
+\r
+\82±\82ê\82ç\82É\82Â\82¢\82Ä\8f\87\82É\90à\96¾\82µ\82Ä\82¢\82­\82Æ\81A\r
+\r
+104.mayu\r
+\89p\8cê\83L\81[\83{\81[\83h\82Å\82Ì\83L\81[\96¼\82Ì\92è\8b`\82ð\82µ\82Ä\82¢\82é\82¾\82¯\82Å\81A\r
+\82±\82ê\82¾\82¯\82Å\82Í\83L\81[\94z\92u\82É\8aÖ\82µ\82Ä\82Í\89½\82à\95Ï\82í\82è\82Ü\82¹\82ñ\82ª\81A\r
+\82±\82ê\82ª\82È\82¢\82Æ\89½\82à\93®\82«\82Ü\82¹\82ñ\82Ì\82Å\81A\r
+\81i\89p\8cê\83L\81[\83{\81[\83h\82È\82ç\82Î\81j\95K\82¸\8dÅ\8f\89\82É\93Ç\82Ý\8d\9e\82ñ\82Å\82­\82¾\82³\82¢\81B\r
+\r
+\r
+104on109.mayu\r
+\93ú\96{\8cê\83L\81[\83{\81[\83h\82ð\8eg\82í\82´\82é\82ð\93¾\82È\82¢\82à\82Ì\82Ì\81A\r
+\89p\8cê\83L\81[\83{\81[\83h\82É\97]\82è\82É\8aµ\82ê\82Ä\82¢\82é\82½\82ß\81A\r
+\83L\81[\83g\83b\83v\82Ì\95\8e\9a\82Æ\82Í\88Ù\82È\82Á\82Ä\82µ\82Ü\82¤\82É\82à\8aÖ\82í\82ç\82¸\r
+\89p\8cê\83L\81[\83{\81[\83h\82Æ\93¯\82\94z\92u\82É\82µ\82½\82¢\90l\82Ì\82½\82ß\82Ì\90Ý\92è\83t\83@\83C\83\8b\82Å\82·\81B\r
+\81i\95M\8eÒ\82Í\8fí\97p\82µ\82Ä\82¨\82è\82Ü\82·\81j\r
+\8bï\91Ì\93I\82É\82Í\81A\r
+  [\94¼\8ap/\91S\8ap]         => [`]\r
+  [Shift]+[\94¼\8ap/\91S\8ap] => [~]\r
+  [Alt]+[\94¼\8ap/\91S\8ap]   => IME on/off\r
+  [Shift]+[2]         => [@]\r
+  [Shift]+[6]         => [^]\r
+  [Shift]+[7]         => [&]\r
+  [Shift]+[8]         => [*]\r
+  [Shift]+[9]         => [(]\r
+  [Shift]+[0]         => [)]\r
+  [Shift]+[-]         => [_]\r
+  [^]                 => [=]\r
+  [Shift]+[^]         => [+]\r
+  [@]                 => [[]\r
+  [Shift]+[@]         => [{]\r
+  [[]                 => []]\r
+  [Shift]+[[]         => [}]\r
+  []]                 => [\]\r
+  [Shift]+[]]         => [|]\r
+  [Shift]+[;]         => [:]\r
+  [:]                 => [']\r
+  [Shift]+[:]         => ["]\r
+  [\96³\95Ï\8a·]            => [Space]\r
+  [\95Ï\8a·]              => [Space]\r
+  [\82Ð\82ç\82ª\82È]          => [Space]\r
+  [\89p\90\94]              => [Shift]+[\89p\90\94]\r
+  \81w\81__\82ë\81x           => [Shift]\r
+\82Æ\82È\82Á\82Ä\82¢\82Ü\82·\81B\r
+\81w]}\82Þ\81v\81x\82Ì\83L\81[\82É\88á\98a\8a´\82ð\8ao\82¦\82Ü\82·\82ª\81A\r
+Enter \82É\82µ\82Ä\82µ\82Ü\82¤\82Ì\82à\8eè\82©\82Æ\8ev\82¢\82Ü\82·\81B\r
+\81i\95M\8eÒ\82Í\82Ç\82¤\82Å\82à\82æ\82¢\82Ì\82Å\82·\82ª\81B\r
+  \82Æ\82¢\82¤\82Ì\82à\81A Enter \82Í C-m \82Ì\82Ý\82Æ\82¢\82¤\83|\83\8a\83V\81[\82È\82Ì\82Å\81j\r
+\91å\92ï\82Ì\90l\82Í\82±\82ê\82Å\96\9e\91«\82È\82Ì\82Å\82Í\82È\82¢\82Å\82µ\82å\82¤\82©\81B\r
+109\82ð\8eg\82Á\82Ä\82¢\82Ä\82à\81A\83h\83\89\83C\83o\82¾\82¯104\82É\82µ\82Ä\82µ\82Ü\82¦\82Î\r
+\93¯\82\82æ\82¤\82È\82±\82Æ\82ª\8eÀ\8c»\82Å\82«\82Ü\82·\82ª\81A\r
+\91¼\90l\82à\8eg\82¤\82æ\82¤\82È\83}\83V\83\93\82Å\82 \82ê\82Î\81A\r
+mayu\82ð\83C\83\93\83X\83g\81[\83\8b\82µ\82Ä104on109\82Å\8eg\82¤\95û\82ª\82¨\91E\82ß\82Å\82·\81B\r
+\r
+\r
+109.mayu\r
+\93ú\96{\8cê\83L\81[\83{\81[\83h\82Å\82Ì\83L\81[\96¼\82Ì\92è\8b`\82ð\82µ\82Ä\82¢\82é\82¾\82¯\82Å\81A\r
+\82±\82ê\82¾\82¯\82Å\82Í\83L\81[\94z\92u\82É\8aÖ\82µ\82Ä\82Í\89½\82à\95Ï\82í\82è\82Ü\82¹\82ñ\82ª\81A\r
+\82±\82ê\82ª\82È\82¢\82Æ\89½\82à\93®\82«\82Ü\82¹\82ñ\82Ì\82Å\81A\r
+\81i\93ú\96{\8cê\83L\81[\83{\81[\83h\82È\82ç\82Î\81j\95K\82¸\8dÅ\8f\89\82É\93Ç\82Ý\8d\9e\82ñ\82Å\82­\82¾\82³\82¢\81B\r
+\r
+\r
+109on104.mayu\r
+\89p\8cê\83L\81[\83{\81[\83h\82ð\8eg\82í\82´\82é\82ð\93¾\82È\82¢\82à\82Ì\82Ì\81A\r
+\93ú\96{\8cê\83L\81[\83{\81[\83h\82É\97]\82è\82É\8aµ\82ê\82Ä\82¢\82é\82½\82ß\81A\r
+\83L\81[\83g\83b\83v\82Ì\95\8e\9a\82Æ\82Í\88Ù\82È\82Á\82Ä\82µ\82Ü\82¤\82É\82à\8aÖ\82í\82ç\82¸\r
+\93ú\96{\8cê\83L\81[\83{\81[\83h\82Æ\93¯\82\94z\92u\82É\82µ\82½\82¢\90l\82Ì\82½\82ß\82Ì\90Ý\92è\83t\83@\83C\83\8b\82Å\82·\81B\r
+\82±\82ê\82ð\8fí\97p\82µ\82Ä\82¢\82é\90l\82Í\90¢\8aE\92\86\92T\82µ\82Ä\82à\82¢\82È\82¢\82Æ\8ev\82í\82ê\82Ü\82·\82Ì\82Å\81A\r
+\8d¡\82Ð\82Æ\82Â\97û\82ê\82Ä\82¢\82È\82¢\82Í\82¸\82Å\82·\81B\81i\8dì\8eÒ\82Í\8bH\82É\8eg\82¤\82»\82¤\82Å\82·\82ª\81j\r
+\8eg\82¢\82±\82ñ\82Å\82Ý\82Ä\81A\8a´\91z\82â\97v\96]\82ð\8dì\8eÒ\82É\91\97\82é\82Æ\8aì\82Î\82ê\82Ü\82·\81B\r
+\r
+\r
+default.mayu\r
+\8dì\8eÒ\82Ì\8eï\96¡\82É\8f]\82Á\82Ä\8dì\82ç\82ê\82½\81A\95Î\82Á\82½\83f\83t\83H\83\8b\83g\90Ý\92è\83t\83@\83C\83\8b\82Å\82·\81B\r
+\82±\82ê\82ð$HOME/.mayu\82Å\93Ç\82Ý\8d\9e\82ß\82Î\81AUN*X\8eg\82¢\82Í\8dK\82¹\82É\82È\82ê\82é\82Í\82¸\82Å\82·\81B\r
+\82¨\82¨\82Ü\82©\82É\8c¾\82¤\82Æ\81AUN*X\82âemacs\82ð\8fí\97p\82µ\82Ä\82¢\82é\90l\8cü\82¯\82Ì\90Ý\92è\82Å\82·\81B\r
+\83o\81[\83W\83\87\83\93\83A\83b\83v\82Ì\82½\82Ñ\82É\96³\8bO\93¹\82É\91\9d\82¦\82Ä\82¢\82­\82Ì\82Å\81A\r
+\91S\82Ä\82ð\90à\96¾\82·\82é\82Ì\82Í\95s\89Â\94\\82¾\82Æ\8ev\82¢\82Ü\82·\82ª\81A\r
+\89Â\94\\82È\94Í\88Í\82Å\97ñ\8b\93\82µ\82Ä\82¢\82«\82Ü\82·\81B\r
+1. Caps\82Ü\82½\82Í\89p\90\94\83L\81[\82ðCtrl\83L\81[\82É\82µ\82Ü\82·\81B\81i\93ü\82ê\91Ö\82¦\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81j\r
+2. 109\83L\81[\83{\81[\83h\82Å\82©\82Â104on109\82ð\8eg\82Á\82Ä\82¢\82È\82¢\8fê\8d\87\81A\r
+   ESC\83L\81[\82Æ\94¼\8ap/\91S\8ap\83L\81[\82ð\93ü\82ê\91Ö\82¦\82Ü\82·\81B\r
+   \81i104on109\82ª\97L\8cø\82È\8fê\8d\87\82Í\81A\94¼\8ap/\91S\8ap\83L\81[\82Í\81u~\81v\82É\82È\82è\82Ü\82·\81j\r
+3. [Ctrl]+[Shift]+[\89½\82©\82Ì\83L\81[]\82Å\8c»\8dÝ\82Ì\83E\83C\83\93\83h\83E\82É\91Î\82·\82é\91\80\8dì\82ª\82Å\82«\82Ü\82·\81B\r
+     \92N\82ª\8dl\88Ä\8eÒ\82È\82Ì\82©\8dì\8eÒ\82ç\82à\92m\82è\82Ü\82¹\82ñ\82ª\81A\96^\8f\8a\82Å\82Ìtwm\82Ì\93®\8dì\82ð\93¥\8fP\82µ\82Ä\82¢\82Ü\82·\81B\r
+       C-S-[\96î\88ó\83L\81[]  \82Å\83E\83C\83\93\83h\83E\82ð\88Ú\93®\r
+       C-S-A-[\96î\88ó\83L\81[]\82Å\83E\83C\83\93\83h\83E\82ð\8f¬\82³\82­\88Ú\93®\r
+       C-S-z \82Å\8dÅ\91å\89»(zoom)\r
+       C-S-x \82Å\8fc\95û\8cü\82Ì\82Ý\8dÅ\91å\89»\r
+       C-S-c \82Å\89¡\95û\8cü\82Ì\82Ý\8dÅ\91å\89»\r
+       C-S-i \82Å\8dÅ\8f¬\89»(iconify)\r
+       C-S-k \82Å\95Â\82\82é(kill)\r
+       C-S-[a/e/p/n] \82Å\82»\82Ì\83E\83C\83\93\83h\83E\82ð\8d¶/\89E/\8fã/\89º\92[\82É\8d\87\82í\82¹\82é(emacs\95\97?)\r
+       C-S-l \82Å\82»\82Ì\83E\83C\83\93\83h\83E\82ª\83t\83H\81[\83J\83X\82ð\8e\9d\82Á\82½\82Ü\82Ü\88ê\94Ô\89º\82É(lower)\r
+       C-S-r \82Å\82»\82Ì\83E\83C\83\93\83h\83E\82ª\83t\83H\81[\83J\83X\82ð\8e\9d\82Á\82½\82Ü\82Ü\88ê\94Ô\8fã\82É(raise)\r
+       C-S-v \82Å\82»\82Ì\83E\83C\83\93\83h\83E\82ð\8c©\82¦\82é\88Ê\92u\82É\8e\9d\82Á\82Ä\82­\82é(visible?)\r
+     \82È\82Ç\82È\82Ç\81B\r
+     \8dÅ\8cã\82Ì\82à\82Ì\82Í\81A\82»\82Ì\91\8b\82ª\83}\83E\83X\82Å\82Ç\82¤\82â\82Á\82Ä\82à\82Â\82©\82ß\82È\82¢\8fê\8f\8a\82É\8ds\82Á\82½\82Æ\82«\82É\r
+     \82±\82ê\88È\8aO\82É\89ð\8c\88\95û\96@\82ª\82È\82¢\82Ù\82Ç\95Ö\97\98\82Å\82·\81B\81iWindows\95W\8f\80\82Å\82à\89Â\94\\82Å\82·\82¯\82Ç\81j\r
+     \82Ü\82½\81A\83t\83H\81[\83J\83X\82ð\8aO\82³\82È\82¢\82Å\8e©\95ª\8e©\90g\82Ì\8cã\82ë\82Ì\91\8b\82ð\8c©\82½\82¢\82Æ\82«\82É\r
+     lower&raise \82Í\95Ö\97\98\82Å\82·\81B\81iWindows\95W\8f\80\82Å\82Í\95s\89Â\94\\82È\93®\8dì\82Å\82·\81j\r
+     \83L\81[\88ê\94­\82Å\8dÅ\91å\89»\82à\95È\82É\82È\82è\82Ü\82·\81B\r
+4. C-\ \82ÅIME\82Ì\83I\83\93/\83I\83t\82ð\82Å\82«\82é\82æ\82¤\82É\82µ\82Ü\82·\81B\r
+     \88ê\95\94\82ÌUN*X\82Å\8dL\82­\8eg\82í\82ê\82Ä\82¢\82é\81Aegg\82Ì\83L\81[\83o\83C\83\93\83f\83B\83\93\83O\82Å\82·\81B\r
+5. \91½\82­\82Ì\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Åemacs\95\97\82È\83L\81[\93ü\97Í\82ð\8eó\82¯\95t\82¯\82Ü\82·\81B\r
+     \83\81\83\82\92 \82âInternetExplorer\81ANetScape\82È\82Ç\82ªemacs\95\97\82É\82È\82è\82Ü\82·\81B\r
+     \95M\8eÒ\82Í\82Ù\82Æ\82ñ\82Ç\8eg\82í\82È\82¢\82Ì\82Å\82·\82ª\81AWord\82âPowerPoint\82È\82Ç\82ÌOffice\90»\95i\81A\r
+     Becky!\82âEdmax\82È\82Ç\82Ì\83\81\81[\83\89\81[\82Å\82àemacs\95\97\82É\93®\82­\82æ\82¤\82Å\82·\81B\r
+     \83\81\83\82\92 \82È\82Ç\82ÅC-a\82Å\8ds\93ª\82É\8ds\82±\82¤\82Æ\82µ\82Ä\91S\95\94\91I\91ð\82µ\82Ä\82µ\82Ü\82¤\90l\81A\r
+     IE\82ânetscape\82ÅC-h\82Å\88ê\95\8e\9a\8fÁ\82»\82¤\82Æ\82µ\82Ä\83q\83X\83g\83\8a\82ð\8fo\82µ\82Ä\82µ\82Ü\82¤\90l\81A\r
+     \82Ü\82½\81A\83\81\83\82\92 \82ÅC-x C-s\82Å\83Z\81[\83u\82µ\82»\82¤\82É\82È\82é\90l\82É\82¨\91E\82ß\82Å\82·\81B\r
+6. NT\83R\83\93\83\\81[\83\8b\82ÆTeraTerm\82Å\81Akterm\95\97\82Ì\91\80\8dì\82ð\89Â\94\\82É\82µ\82Ü\82·\81B\r
+     UN*X\82ð\95\81\92i\8eg\82Á\82Ä\82¢\82é\90l\82Å\82à\81A\88Ó\8aO\82É\92m\82ç\82È\82¢\90l\82ª\91½\82¢\82Ì\82Å\82·\82ª\81A\r
+     xterm/kterm(UN*X\82Ì\95W\8f\80\93I\83R\83\93\83\\81[\83\8b)\82Å\82Í\81A\r
+       Shift+Insert\82Å\83y\81[\83X\83g\81A\r
+       Shift+PageUp/Down\82Å\8fã\89º\83X\83N\83\8d\81[\83\8b\r
+     \82ª\82Å\82«\82Ü\82·\81B\82±\82ê\82ðNT\83R\83\93\83\\81[\83\8b\82ÆTeraTerm\82Å\82à\82Å\82«\82é\82æ\82¤\82É\82µ\82Ü\82·\81B\r
+7. \83}\83C\83\93\83X\83C\81[\83p\82ª\83L\81[\83{\81[\83h\82¾\82¯\82Å\91\80\8dì\82Å\82«\82Ü\82·\81B\r
+     \83e\83\93\83L\81[\82Å\83}\83E\83X\83J\81[\83\\83\8b\88Ú\93®\r
+     z,x,c\83L\81[\82ª\82»\82ê\82¼\82ê\89E\83{\83^\83\93\81A\8d\89E\93¯\8e\9e\89\9f\82µ\81A\8d\83{\83^\83\93\r
+     \81i\8d\8eè\82Å\88µ\82¤\82½\82ß\81A\83}\83E\83X\82Æ\82Í\94z\92u\82ª\8bt\82Å\82·\81j\r
+8. \82»\82Ì\91¼\81A\83A\83v\83\8a\82²\82Æ\82Ì\90Ý\92è\81B\r
+     \97á\82¦\82Î\81ATeraTerm \82Å\82Í C-/ \82Ì\83L\81[\93ü\97Í\81iemacs\82Ìundo\81j\82ð\r
+     \93`\82¦\82Ä\82­\82ê\82È\82¢\82Æ\82¢\82¤\96â\91è\93_\82ª\82 \82è\82Ü\82·\82ª\81A\r
+     TeraTerm \8fã\82Å C-/ \82ª\89\9f\82³\82ê\82½\82ç C-_ \82ª\89\9f\82³\82ê\82½\82æ\82¤\82É\90U\95\91\82¤\82±\82Æ\82Å\r
+     \82±\82ê\82ð\89ð\8c\88\82µ\82Ä\82¢\82Ü\82·\81B\81i\82±\82ê\82Å\82Í\89ð\8c\88\82É\82È\82ç\82È\82¢\90l\82¢\82Ü\82·\82©\81H\81j\r
+\r
+\r
+\91¼\82É\82à\81A\96\9c\90l\82ª\8aì\82Ô\82Æ\8dì\8eÒ\82ª\8ev\82Á\82½\82ç\82Ç\82ñ\82Ç\82ñ\92Ç\89Á\82³\82ê\82Ä\82¢\82­\82Í\82¸\82Å\82·\81B\r
+\82Ü\82½\82Í\81A7\82Ì\83}\83C\83\93\83X\83C\81[\83p\82Ì\82æ\82¤\82É\81A\92N\82à\96À\98f\82ð\94í\82ç\82È\82¢\82Æ\8ev\82í\82ê\81A\r
+\82©\82Â\96Ê\94\92\82¯\82ê\82Î\8dÌ\97p\82³\82ê\82é\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B\r
+\95Ö\97\98\82È\81A\82Ü\82½\82Í\96Ê\94\92\82¢\90Ý\92è\82ª\82 \82è\82Ü\82µ\82½\82çML\82É\93\8a\8de\82µ\82Ä\82Ý\82Ä\89º\82³\82¢\81B\r
+\r
+emacs\95\97\83L\81[\83o\83C\83\93\83f\83B\83\93\83O\82É\82µ\82È\82¢\95û\82Í\82±\82Ì\83t\83@\83C\83\8b\82ð\93Ç\82Ý\8d\9e\82Ü\82¸\81A\r
+\82à\82µ\82±\82Ì\83t\83@\83C\83\8b\92\86\82Ì\95Ö\97\98\82È\95\94\95ª\82ª\82 \82é\82Ì\82È\82ç\82Î\81A\82»\82Ì\95\94\95ª\82ð\r
+$HOME/.mayu\82É\92Ç\8bL\82·\82é\82Ì\82ª\82¢\82¢\82©\82Æ\8ev\82¢\82Ü\82·\81B\r
+emacs\82É\8aµ\82ê\82½\95û\82Í$HOME/.mayu\82Å\82±\82Ì\83t\83@\83C\83\8b\82ðinclude\82µ\81A\r
+\95s\96\9e\82È\93_\82ð$HOME/.mayu\93à\82Å\83I\81[\83o\81[\83\89\83C\83h\82·\82ê\82Î\82æ\82¢\82©\82Æ\8ev\82¢\82Ü\82·\81B\r
+\r
+\r
+dot.mayu\r
+.mayu\82Ì\83T\83\93\83v\83\8b\82Å\82·\81B\r
+\83f\83t\83H\83\8b\83g\82Å\81u\91I\91ð\81v\82Ì\91Î\8fÛ\82É\82È\82Á\82Ä\82¢\82Ü\82·\81B\r
+define\82É\82æ\82è\81A\89p\8cê104\83L\81[\83{\81[\83h\82©\93ú\96{\8cê109\83L\81[\83{\81[\83h\82©(USE104)\81A\r
+\89p\8cê\83L\81[\83{\81[\83h\82È\82ç\82Î109\95\97\83L\81[\83o\83C\83\93\83f\83B\83\93\83O\82É\82·\82é\82©\82Ç\82¤\82©(USE109on104)\81A\r
+\93ú\96{\8cê\83L\81[\83{\81[\83h\82È\82ç\82Î104\95\97\83L\81[\83o\83C\83\93\83f\83B\83\93\83O\82É\82·\82é\82©\82Ç\82¤\82©(USE104on109)\81A\r
+\82»\82ê\82¼\82ê\82Ì\8fê\8d\87\82Édefault.mayu\82ð\93Ç\82Ý\82±\82Þ\82©\82Ç\82¤\82©(USEdefault)\82ð\91I\91ð\82Å\82«\82Ü\82·\81B\r
+\r
+\r
+emacsedit.mayu\r
+UN*X\82Å\95W\8f\80\93I\82È\81A\83L\81[\83o\83C\83\93\83f\83B\83\93\83O\82ª\93Æ\93Á\82È\83G\83f\83B\83^\82Å\82 \82é\81A\r
+emacs\82É\8e\97\82½\93®\8dì\82ð\8eÀ\8c»\82³\82¹\82é\82½\82ß\82Ì\90Ý\92è\83t\83@\83C\83\8b\82Å\82·\81B\r
+default.mayu\82Å\93Ç\82Ý\82±\82Ü\82ê\82Ä\82¢\82Ü\82·\81B\r
+\r
+\r
+contrib/98x1.mayu\r
+contrib/ax.mayu\r
+contrib/dvorak.mayu\r
+\82±\82ê\82ç\82Ì\83t\83@\83C\83\8b\82Í\81Amayu\82Ì\83\86\81[\83U\81[\82©\82ç\92ñ\8b\9f\82³\82ê\82½\83t\83@\83C\83\8b\82Å\82·\81B\r
+PC-98x1\97p\82Ì\90Ý\92è\83t\83@\83C\83\8b\82Æ\81A\r
+AX\83L\81[\83{\81[\83h\97p\82Ì\90Ý\92è\83t\83@\83C\83\8b\82Æ\81A\r
+\95\81\92Ê\82Ì\83L\81[\83{\81[\83h\82Ådvorak\95\97\82É\8eg\82¤\90Ý\92è\82Ì\82æ\82¤\82Å\82·\81B\r
+\8ec\94O\82È\82ª\82ç\95M\8eÒ\82Í\8eg\82Á\82½\82±\82Æ\82ª\82 \82è\82Ü\82¹\82ñ\82ª\81A\r
+ML\82Ì\89ß\8b\8e\83\8d\83O\82ª\8eQ\8dl\82É\82È\82é\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B\r
+\r
+\r
+contrib/keitai.mayu\r
+\95M\8eÒ\82ª\83V\83\83\83\8c\82Å\8dì\82Á\82½\83t\83@\83C\83\8b\82Å\82·\81B\83L\81[\83{\81[\83h\82Ì\94z\92u\82Í\8ao\82¦\82Ä\82¢\82È\82¢\82¯\82ê\82Ç\82à\81A\r
+\8cg\91Ñ\93d\98b\82Å\83\81\81[\83\8b\82ð\8f\91\82­\82Ì\82Í\88Ù\8fí\82É\91¬\82¢\81A\82Æ\82¢\82¤\90l\8cü\82¯\82Å\82· :-)\r
+IME\83I\83\93\82Ì\8fó\91Ô\82Å\81A\82©\82È\93ü\97Í\82ª\83e\83\93\83L\81[\82¾\82¯\82Å\8ds\82¦\82Ü\82·\81B\r
+\8eÀ\97p\82É\82È\82é\82Æ\82Í\8ev\82¦\82Ü\82¹\82ñ\82ª\81A\8eQ\8dl\82Æ\82¢\82¤\82±\82Æ\82Å\81B\r
+\r
+\r
+2000/03/02  written by HANAWA Yoshio <hanawa@is.s.u-tokyo.ac.jp>\r
+2000/04/06  rewritten by HANAWA Yoshio\r
+2000/04/24  fixed small bug by TAGA Nayuta <nayuta@i.am>\r
+2000/05/06  fixed obsolete articles for mayu-3.11 by HANAWA Yoshio\r
index 9ab9cda..61dd9aa 100644 (file)
@@ -1,75 +1,75 @@
-
-
-                       \91\8b\8eg\82¢\82Ì\97J\9fT\83h\83\89\83C\83o
-
-
-1. \83R\83\93\83p\83C\83\8b\95û\96@
-
-       Windows 200 DDK \82Æ Visual C++ 6.0 \82Å build \83\86\81[\83e\83B\83\8a\83e\83B\82ð\97\98
-       \97p\82µ\82Ä\83R\83\93\83p\83C\83\8b\82µ\82Ü\82·\81B
-
-       > cd mayu\d
-       > build
-       > cd nt4
-       > build
-
-       mayud.sys \82ð %windir%\system32\drivers\ \82Ö\83R\83s\81[\82µ test.reg \82ð
-       \93ü\97Í\82·\82ê\82Î\81A\8eè\93®\82Å\83f\83o\83C\83X\82ð on/off \82Å\82«\82Ü\82·\81B(\96\94\82Í Windows
-       NT4.0 \82Ì\8fê\8d\87\82Í mayudnt4.sys \82ð mayud.sys \82Æ\82¢\82¤\96¼\91O\82Å\83R\83s\81[)
-
-
-2. \8eg\82¢\95û
-
-       mayud \82ð\93®\8dì\82³\82¹\82é\82Æ
-
-             \\.\MayuDetour1
-
-       \82Æ\82¢\82¤\83f\83o\83C\83X\82ª\82Å\82«\82Ü\82·\81B\82±\82Ì\83f\83o\83C\83X\82ð GENERIC_READ |
-       GENERIC_WRITE \82Å\8aJ\82«\82Ü\82·\81B
-
-       ReadFile / WriteFile \82Å\82Í\81A\88È\89º\82Ì\8d\\91¢\91Ì\82ð\8eg\82¢\82Ü\82·\81B\83f\83o\83C\83X\82ð
-       \8aJ\82¢\82½\82 \82Æ\82É\81AReadFile \82·\82é\82Æ\83\86\81[\83U\81[\82ª\93ü\97Í\82µ\82½\83L\81[\82ð\8eæ\93¾\82Å\82«
-       \82Ü\82·\81BWriteFile \82·\82é\82Æ\83\86\81[\83U\82ª\82 \82½\82©\82à\83L\81[\82ð\93ü\97Í\82µ\82½\82©\82Ì\82æ\82¤\82É 
-       Windows \82ð\91\80\8dì\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B
-
-       struct KEYBOARD_INPUT_DATA
-       {
-         enum { BREAK = 1,
-                E0 = 2, E1 = 4,
-                TERMSRV_SET_LED = 8 };
-         enum { KEYBOARD_OVERRUN_MAKE_CODE = 0xFF };
-         
-         USHORT UnitId;
-         USHORT MakeCode;
-         USHORT Flags; 
-         USHORT Reserved;
-         ULONG ExtraInformation;
-       };
-
-       UnitId \82Æ Reserved \82Í\8fí\82É 0 \82Å\82·\81BExtraInformation \82É\92l\82ð\90Ý\92è
-       \82·\82é\82Æ\81AWM_KEYDOWN \82È\82Ç\82Ì\83\81\83b\83Z\81[\83W\82ª\97\88\82½\8e\9e\82É 
-       GetMessageExtraInfo() API \82Å\82»\82Ì\92l\82ð\8eæ\93¾\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B
-       MakeCode \82Í\83L\81[\83{\81[\83h\82Ì\83X\83L\83\83\83\93\83R\81[\83h\82Å\82·\81BFlags \82Í BREAK, E0,
-       E1, TERMSRV_SET_LED \82ª\91g\82Ý\8d\87\82í\82³\82Á\82Ä\82¢\82Ü\82·\81BBREAK \82Í\83L\81[\82ð\97£\82µ
-       \82½\82Æ\82«\81AE0 \82Æ E1 \82Í\8ag\92£\83L\81[\82ð\89\9f\82µ\82½\82Æ\82«\82É\90Ý\92è\82³\82ê\82Ü\82·\81B
-
-
-3. \83o\83O
-
-       * ReadFile \82ª ERROR_OPERATION_ABORTED \82Å\8e¸\94s\82µ\82½\8fê\8d\87\82à\82¤\88ê\93
-         ReadFile \82·\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
-
-       * \95¡\90\94\82Ì\83X\83\8c\83b\83h\82©\82ç mayud \83f\83o\83C\83X\82ð read \82·\82é\82Æ
-         MULTIPLE_IRP_COMPLETE_REQUESTS (0x44) \82Å\97\8e\82¿\82é\82±\82Æ\82ª\82 \82é\82æ\82¤
-         \82Å\82·\81B\8dÄ\8c»\90«\82Í\95s\96¾\81B
-
-       * ReadFile \82·\82é\82Æ\83\86\81[\83U\81[\82ª\93ü\97Í\82·\82é\82Ü\82Å\89i\89\93\82É\8bA\82Á\82Ä\82«\82Ü\82¹\82ñ\81B
-         NT4.0 \82È\82ç\82Î\95Ê\83X\83\8c\83b\83h\82Å CancelIo \82·\82é\82±\82Æ\82Å ReadFile \82ð\83L\83\83
-         \83\93\83Z\83\8b\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82·\82ª\81AWindows 2000 \82Å\82Í\95û\96@\82ª\82 \82è\82Ü\82¹
-         \82ñ\81B
-
-       * PnP \82Í\8dl\97\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B\82Â\82Ü\82è\81A\83L\81[\83{\81[\83h\82ð\82Â\82¯\82½\82è\97£\82µ\82½\82è
-         \82·\82é\82Æ\82Ç\82¤\82È\82é\82©\82í\82©\82è\82Ü\82¹\82ñ\81B
-
-       * \83L\81[\83{\81[\83h\82ª\93ñ\82Â\88È\8fã\82 \82é\82Æ\82«\82Å\82à\81A\83f\83o\83C\83X\82Í\88ê\82Â\82µ\82©\82Å\82«\82Ü\82¹
-         \82ñ\81B
+\r
+\r
+                       \91\8b\8eg\82¢\82Ì\97J\9fT\83h\83\89\83C\83o\r
+\r
+\r
+1. \83R\83\93\83p\83C\83\8b\95û\96@\r
+\r
+       Windows 200 DDK \82Æ Visual C++ 6.0 \82Å build \83\86\81[\83e\83B\83\8a\83e\83B\82ð\97\98\r
+       \97p\82µ\82Ä\83R\83\93\83p\83C\83\8b\82µ\82Ü\82·\81B\r
+\r
+       > cd mayu\d\r
+       > build\r
+       > cd nt4\r
+       > build\r
+\r
+       mayud.sys \82ð %windir%\system32\drivers\ \82Ö\83R\83s\81[\82µ test.reg \82ð\r
+       \93ü\97Í\82·\82ê\82Î\81A\8eè\93®\82Å\83f\83o\83C\83X\82ð on/off \82Å\82«\82Ü\82·\81B(\96\94\82Í Windows\r
+       NT4.0 \82Ì\8fê\8d\87\82Í mayudnt4.sys \82ð mayud.sys \82Æ\82¢\82¤\96¼\91O\82Å\83R\83s\81[)\r
+\r
+\r
+2. \8eg\82¢\95û\r
+\r
+       mayud \82ð\93®\8dì\82³\82¹\82é\82Æ\r
+\r
+             \\.\MayuDetour1\r
+\r
+       \82Æ\82¢\82¤\83f\83o\83C\83X\82ª\82Å\82«\82Ü\82·\81B\82±\82Ì\83f\83o\83C\83X\82ð GENERIC_READ |\r
+       GENERIC_WRITE \82Å\8aJ\82«\82Ü\82·\81B\r
+\r
+       ReadFile / WriteFile \82Å\82Í\81A\88È\89º\82Ì\8d\\91¢\91Ì\82ð\8eg\82¢\82Ü\82·\81B\83f\83o\83C\83X\82ð\r
+       \8aJ\82¢\82½\82 \82Æ\82É\81AReadFile \82·\82é\82Æ\83\86\81[\83U\81[\82ª\93ü\97Í\82µ\82½\83L\81[\82ð\8eæ\93¾\82Å\82«\r
+       \82Ü\82·\81BWriteFile \82·\82é\82Æ\83\86\81[\83U\82ª\82 \82½\82©\82à\83L\81[\82ð\93ü\97Í\82µ\82½\82©\82Ì\82æ\82¤\82É \r
+       Windows \82ð\91\80\8dì\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B\r
+\r
+       struct KEYBOARD_INPUT_DATA\r
+       {\r
+         enum { BREAK = 1,\r
+                E0 = 2, E1 = 4,\r
+                TERMSRV_SET_LED = 8 };\r
+         enum { KEYBOARD_OVERRUN_MAKE_CODE = 0xFF };\r
+         \r
+         USHORT UnitId;\r
+         USHORT MakeCode;\r
+         USHORT Flags; \r
+         USHORT Reserved;\r
+         ULONG ExtraInformation;\r
+       };\r
+\r
+       UnitId \82Æ Reserved \82Í\8fí\82É 0 \82Å\82·\81BExtraInformation \82É\92l\82ð\90Ý\92è\r
+       \82·\82é\82Æ\81AWM_KEYDOWN \82È\82Ç\82Ì\83\81\83b\83Z\81[\83W\82ª\97\88\82½\8e\9e\82É \r
+       GetMessageExtraInfo() API \82Å\82»\82Ì\92l\82ð\8eæ\93¾\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B\r
+       MakeCode \82Í\83L\81[\83{\81[\83h\82Ì\83X\83L\83\83\83\93\83R\81[\83h\82Å\82·\81BFlags \82Í BREAK, E0,\r
+       E1, TERMSRV_SET_LED \82ª\91g\82Ý\8d\87\82í\82³\82Á\82Ä\82¢\82Ü\82·\81BBREAK \82Í\83L\81[\82ð\97£\82µ\r
+       \82½\82Æ\82«\81AE0 \82Æ E1 \82Í\8ag\92£\83L\81[\82ð\89\9f\82µ\82½\82Æ\82«\82É\90Ý\92è\82³\82ê\82Ü\82·\81B\r
+\r
+\r
+3. \83o\83O\r
+\r
+       * ReadFile \82ª ERROR_OPERATION_ABORTED \82Å\8e¸\94s\82µ\82½\8fê\8d\87\82à\82¤\88ê\93\r
+         ReadFile \82·\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B\r
+\r
+       * \95¡\90\94\82Ì\83X\83\8c\83b\83h\82©\82ç mayud \83f\83o\83C\83X\82ð read \82·\82é\82Æ\r
+         MULTIPLE_IRP_COMPLETE_REQUESTS (0x44) \82Å\97\8e\82¿\82é\82±\82Æ\82ª\82 \82é\82æ\82¤\r
+         \82Å\82·\81B\8dÄ\8c»\90«\82Í\95s\96¾\81B\r
+\r
+       * ReadFile \82·\82é\82Æ\83\86\81[\83U\81[\82ª\93ü\97Í\82·\82é\82Ü\82Å\89i\89\93\82É\8bA\82Á\82Ä\82«\82Ü\82¹\82ñ\81B\r
+         NT4.0 \82È\82ç\82Î\95Ê\83X\83\8c\83b\83h\82Å CancelIo \82·\82é\82±\82Æ\82Å ReadFile \82ð\83L\83\83\r
+         \83\93\83Z\83\8b\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82·\82ª\81AWindows 2000 \82Å\82Í\95û\96@\82ª\82 \82è\82Ü\82¹\r
+         \82ñ\81B\r
+\r
+       * PnP \82Í\8dl\97\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B\82Â\82Ü\82è\81A\83L\81[\83{\81[\83h\82ð\82Â\82¯\82½\82è\97£\82µ\82½\82è\r
+         \82·\82é\82Æ\82Ç\82¤\82È\82é\82©\82í\82©\82è\82Ü\82¹\82ñ\81B\r
+\r
+       * \83L\81[\83{\81[\83h\82ª\93ñ\82Â\88È\8fã\82 \82é\82Æ\82«\82Å\82à\81A\83f\83o\83C\83X\82Í\88ê\82Â\82µ\82©\82Å\82«\82Ü\82¹\r
+         \82ñ\81B\r
index 87a13e5..a16798a 100644 (file)
--- a/d/SOURCES
+++ b/d/SOURCES
@@ -1,8 +1,8 @@
-TARGETNAME=    mayud
-TARGETTYPE=    DRIVER
-TARGETPATH=    .
-USE_MAPSYM=    1
-
-INCLUDES=      $(BASEDIR)\inc;.
-
-SOURCES=       mayud.c log.c
+TARGETNAME=    mayud\r
+TARGETTYPE=    DRIVER\r
+TARGETPATH=    .\r
+USE_MAPSYM=    1\r
+\r
+INCLUDES=      $(BASEDIR)\inc;.\r
+\r
+SOURCES=       mayud.c log.c\r
index 0ae9453..d1b5019 100644 (file)
-///////////////////////////////////////////////////////////////////////////////
-// keyque.c
-
-
-///////////////////////////////////////////////////////////////////////////////
-// Definitions
-
-
-typedef struct KeyQue
-{
-  ULONG count;                 // Number of keys in the que
-  ULONG lengthof_que;          // Length of que
-  KEYBOARD_INPUT_DATA *insert; // Insertion pointer for que
-  KEYBOARD_INPUT_DATA *remove; // Removal pointer for que
-  KEYBOARD_INPUT_DATA *que;
-} KeyQue;
-
-
-#define KeyQueSize 100
-
-
-///////////////////////////////////////////////////////////////////////////////
-// Prototypes
-
-
-NTSTATUS KqInitialize(KeyQue *kq);
-void KqClear(KeyQue *kq);
-NTSTATUS KqFinalize(KeyQue *kq);
-BOOLEAN KqIsEmpty(KeyQue *kq);
-ULONG KqEnque(KeyQue *kq, IN  KEYBOARD_INPUT_DATA *buf, IN ULONG lengthof_buf);
-ULONG KqDeque(KeyQue *kq, OUT KEYBOARD_INPUT_DATA *buf, IN ULONG lengthof_buf);
-
-
-#ifdef ALLOC_PRAGMA
-#pragma alloc_text( init, KqInitialize )
-#pragma alloc_text( page, KqFinalize )
-#endif // ALLOC_PRAGMA
-
-
-///////////////////////////////////////////////////////////////////////////////
-// Functions
-
-
-NTSTATUS KqInitialize(KeyQue *kq)
-{
-  kq->count = 0;
-  kq->lengthof_que = KeyQueSize;
-  kq->que = ExAllocatePool(NonPagedPool,
-                          kq->lengthof_que * sizeof(KEYBOARD_INPUT_DATA));
-  kq->insert = kq->que;
-  kq->remove = kq->que;
-  if (kq->que == NULL)
-    return STATUS_INSUFFICIENT_RESOURCES;
-  else
-    return STATUS_SUCCESS;
-}
-
-
-void KqClear(KeyQue *kq)
-{
-  kq->count = 0;
-  kq->insert = kq->que;
-  kq->remove = kq->que;
-}
-
-
-NTSTATUS KqFinalize(KeyQue *kq)
-{
-  if (kq->que)
-    ExFreePool(kq->que);
-  return STATUS_SUCCESS;
-}
-
-
-BOOLEAN KqIsEmpty(KeyQue *kq)
-{
-  return 0 == kq->count;
-}
-
-
-// return: lengthof copied data
-ULONG KqEnque(KeyQue *kq, IN KEYBOARD_INPUT_DATA *buf, IN ULONG lengthof_buf)
-{
-  ULONG rest;
-  
-  if (kq->lengthof_que - kq->count < lengthof_buf) // overflow
-    lengthof_buf = kq->lengthof_que - kq->count; // chop overflowed datum
-  if (lengthof_buf <= 0)
-    return 0;
-
-  rest = kq->lengthof_que - (kq->insert - kq->que);
-  if (rest < lengthof_buf)
-  {
-    ULONG copy = rest;
-    if (0 < copy)
-    {
-      RtlMoveMemory((PCHAR)kq->insert, (PCHAR)buf,
-                   sizeof(KEYBOARD_INPUT_DATA) * copy);
-      buf += copy;
-    }
-    copy = lengthof_buf - copy;
-    if (0 < copy)
-      RtlMoveMemory((PCHAR)kq->que, (PCHAR)buf,
-                   sizeof(KEYBOARD_INPUT_DATA) * copy);
-    kq->insert = kq->que + copy;
-  }
-  else
-  {
-    RtlMoveMemory((PCHAR)kq->insert, (PCHAR)buf,
-                 sizeof(KEYBOARD_INPUT_DATA) * lengthof_buf);
-    kq->insert += lengthof_buf;
-  }
-  kq->count += lengthof_buf;
-  return lengthof_buf;
-}
-
-
-// return: lengthof copied data
-ULONG KqDeque(KeyQue *kq, OUT KEYBOARD_INPUT_DATA *buf, IN ULONG lengthof_buf)
-{
-  ULONG rest;
-  
-  if (kq->count < lengthof_buf)
-    lengthof_buf = kq->count;
-  if (lengthof_buf <= 0)
-    return 0;
-
-  rest = kq->lengthof_que - (kq->remove - kq->que);
-  if (rest < lengthof_buf)
-  {
-    ULONG copy = rest;
-    if (0 < copy)
-    {
-      RtlMoveMemory((PCHAR)buf, (PCHAR)kq->remove,
-                   sizeof(KEYBOARD_INPUT_DATA) * copy);
-      buf += copy;
-    }
-    copy = lengthof_buf - copy;
-    if (0 < copy)
-      RtlMoveMemory((PCHAR)buf, (PCHAR)kq->que,
-                   sizeof(KEYBOARD_INPUT_DATA) * copy);
-    kq->remove = kq->que + copy;
-  }
-  else
-  {
-    RtlMoveMemory((PCHAR)buf, (PCHAR)kq->remove,
-                 sizeof(KEYBOARD_INPUT_DATA) * lengthof_buf);
-    kq->remove += lengthof_buf;
-  }
-  kq->count -= lengthof_buf;
-  return lengthof_buf;
-}
+///////////////////////////////////////////////////////////////////////////////\r
+// keyque.c\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Definitions\r
+\r
+\r
+typedef struct KeyQue\r
+{\r
+  ULONG count;                 // Number of keys in the que\r
+  ULONG lengthof_que;          // Length of que\r
+  KEYBOARD_INPUT_DATA *insert; // Insertion pointer for que\r
+  KEYBOARD_INPUT_DATA *remove; // Removal pointer for que\r
+  KEYBOARD_INPUT_DATA *que;\r
+} KeyQue;\r
+\r
+\r
+#define KeyQueSize 100\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Prototypes\r
+\r
+\r
+NTSTATUS KqInitialize(KeyQue *kq);\r
+void KqClear(KeyQue *kq);\r
+NTSTATUS KqFinalize(KeyQue *kq);\r
+BOOLEAN KqIsEmpty(KeyQue *kq);\r
+ULONG KqEnque(KeyQue *kq, IN  KEYBOARD_INPUT_DATA *buf, IN ULONG lengthof_buf);\r
+ULONG KqDeque(KeyQue *kq, OUT KEYBOARD_INPUT_DATA *buf, IN ULONG lengthof_buf);\r
+\r
+\r
+#ifdef ALLOC_PRAGMA\r
+#pragma alloc_text( init, KqInitialize )\r
+#pragma alloc_text( page, KqFinalize )\r
+#endif // ALLOC_PRAGMA\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Functions\r
+\r
+\r
+NTSTATUS KqInitialize(KeyQue *kq)\r
+{\r
+  kq->count = 0;\r
+  kq->lengthof_que = KeyQueSize;\r
+  kq->que = ExAllocatePool(NonPagedPool,\r
+                          kq->lengthof_que * sizeof(KEYBOARD_INPUT_DATA));\r
+  kq->insert = kq->que;\r
+  kq->remove = kq->que;\r
+  if (kq->que == NULL)\r
+    return STATUS_INSUFFICIENT_RESOURCES;\r
+  else\r
+    return STATUS_SUCCESS;\r
+}\r
+\r
+\r
+void KqClear(KeyQue *kq)\r
+{\r
+  kq->count = 0;\r
+  kq->insert = kq->que;\r
+  kq->remove = kq->que;\r
+}\r
+\r
+\r
+NTSTATUS KqFinalize(KeyQue *kq)\r
+{\r
+  if (kq->que)\r
+    ExFreePool(kq->que);\r
+  return STATUS_SUCCESS;\r
+}\r
+\r
+\r
+BOOLEAN KqIsEmpty(KeyQue *kq)\r
+{\r
+  return 0 == kq->count;\r
+}\r
+\r
+\r
+// return: lengthof copied data\r
+ULONG KqEnque(KeyQue *kq, IN KEYBOARD_INPUT_DATA *buf, IN ULONG lengthof_buf)\r
+{\r
+  ULONG rest;\r
+  \r
+  if (kq->lengthof_que - kq->count < lengthof_buf) // overflow\r
+    lengthof_buf = kq->lengthof_que - kq->count; // chop overflowed datum\r
+  if (lengthof_buf <= 0)\r
+    return 0;\r
+\r
+  rest = kq->lengthof_que - (kq->insert - kq->que);\r
+  if (rest < lengthof_buf)\r
+  {\r
+    ULONG copy = rest;\r
+    if (0 < copy)\r
+    {\r
+      RtlMoveMemory((PCHAR)kq->insert, (PCHAR)buf,\r
+                   sizeof(KEYBOARD_INPUT_DATA) * copy);\r
+      buf += copy;\r
+    }\r
+    copy = lengthof_buf - copy;\r
+    if (0 < copy)\r
+      RtlMoveMemory((PCHAR)kq->que, (PCHAR)buf,\r
+                   sizeof(KEYBOARD_INPUT_DATA) * copy);\r
+    kq->insert = kq->que + copy;\r
+  }\r
+  else\r
+  {\r
+    RtlMoveMemory((PCHAR)kq->insert, (PCHAR)buf,\r
+                 sizeof(KEYBOARD_INPUT_DATA) * lengthof_buf);\r
+    kq->insert += lengthof_buf;\r
+  }\r
+  kq->count += lengthof_buf;\r
+  return lengthof_buf;\r
+}\r
+\r
+\r
+// return: lengthof copied data\r
+ULONG KqDeque(KeyQue *kq, OUT KEYBOARD_INPUT_DATA *buf, IN ULONG lengthof_buf)\r
+{\r
+  ULONG rest;\r
+  \r
+  if (kq->count < lengthof_buf)\r
+    lengthof_buf = kq->count;\r
+  if (lengthof_buf <= 0)\r
+    return 0;\r
+\r
+  rest = kq->lengthof_que - (kq->remove - kq->que);\r
+  if (rest < lengthof_buf)\r
+  {\r
+    ULONG copy = rest;\r
+    if (0 < copy)\r
+    {\r
+      RtlMoveMemory((PCHAR)buf, (PCHAR)kq->remove,\r
+                   sizeof(KEYBOARD_INPUT_DATA) * copy);\r
+      buf += copy;\r
+    }\r
+    copy = lengthof_buf - copy;\r
+    if (0 < copy)\r
+      RtlMoveMemory((PCHAR)buf, (PCHAR)kq->que,\r
+                   sizeof(KEYBOARD_INPUT_DATA) * copy);\r
+    kq->remove = kq->que + copy;\r
+  }\r
+  else\r
+  {\r
+    RtlMoveMemory((PCHAR)buf, (PCHAR)kq->remove,\r
+                 sizeof(KEYBOARD_INPUT_DATA) * lengthof_buf);\r
+    kq->remove += lengthof_buf;\r
+  }\r
+  kq->count -= lengthof_buf;\r
+  return lengthof_buf;\r
+}\r
index e8d20e9..b5a7f63 100644 (file)
--- a/d/mayud.c
+++ b/d/mayud.c
-///////////////////////////////////////////////////////////////////////////////
-// Driver for Madotsukai no Yu^utsu for Windows2000
-
-
-#include <ntddk.h>
-#include <ntddkbd.h>
-#include <devioctl.h>
-
-#pragma warning(3 : 4061 4100 4132 4701 4706)
-
-#include "ioctl.h"
-#include "keyque.c"
-
-//#define USE_TOUCHPAD // very experimental!
-
-#if DBG
-// Enable debug logging only on checked build:
-// We use macro to avoid function call overhead
-// in non-logging case, and use double paren such
-// as DEBUG_LOG((...)) because of va_list in macro.
-#include "log.h"
-#define DEBUG_LOG_INIT(x) mayuLogInit x
-#define DEBUG_LOG_TERM(x) mayuLogTerm x
-#define DEBUG_LOG(x) mayuLogEnque x
-#define DEBUG_LOG_RETRIEVE(x) mayuLogDeque x
-#else
-#define DEBUG_LOG_INIT(x)
-#define DEBUG_LOG_TERM(x)
-#define DEBUG_LOG(x)
-#define DEBUG_LOG_RETRIEVE(x) STATUS_INVALID_DEVICE_REQUEST
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-// Device Extensions
-
-struct _DetourDeviceExtension;
-struct _FilterDeviceExtension;
-
-typedef struct _DetourDeviceExtension
-{
-  PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
-
-  KSPIN_LOCK lock; // lock below datum
-  PDEVICE_OBJECT filterDevObj;
-  LONG isOpen;
-  BOOLEAN wasCleanupInitiated; //
-  PIRP irpq;
-  KeyQue readQue; // when IRP_MJ_READ, the contents of readQue are returned
-} DetourDeviceExtension;
-
-typedef struct _FilterDeviceExtension
-{
-  PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
-  
-  PDEVICE_OBJECT detourDevObj;
-  PDEVICE_OBJECT kbdClassDevObj; // keyboard class device object
-  
-#ifdef USE_TOUCHPAD
-  BOOLEAN isKeyboard;
-#endif
-  KSPIN_LOCK lock; // lock below datum
-  PIRP irpq;
-  KeyQue readQue; // when IRP_MJ_READ, the contents of readQue are returned
-#ifdef USE_TOUCHPAD
-  BOOLEAN isTouched;
-#endif
-} FilterDeviceExtension;
-
-///////////////////////////////////////////////////////////////////////////////
-// Protorypes (TODO)
-
-
-NTSTATUS DriverEntry       (IN PDRIVER_OBJECT, IN PUNICODE_STRING);
-NTSTATUS mayuAddDevice     (IN PDRIVER_OBJECT, IN PDEVICE_OBJECT);
-VOID mayuUnloadDriver      (IN PDRIVER_OBJECT);
-VOID mayuDetourReadCancel (IN PDEVICE_OBJECT, IN PIRP);
-
-NTSTATUS filterGenericCompletion (IN PDEVICE_OBJECT, IN PIRP, IN PVOID);
-NTSTATUS filterReadCompletion    (IN PDEVICE_OBJECT, IN PIRP, IN PVOID);
-
-NTSTATUS mayuGenericDispatch (IN PDEVICE_OBJECT, IN PIRP);
-NTSTATUS detourCreate        (IN PDEVICE_OBJECT, IN PIRP);
-NTSTATUS detourClose         (IN PDEVICE_OBJECT, IN PIRP);
-NTSTATUS detourRead          (IN PDEVICE_OBJECT, IN PIRP);
-NTSTATUS detourWrite         (IN PDEVICE_OBJECT, IN PIRP);
-NTSTATUS detourCleanup       (IN PDEVICE_OBJECT, IN PIRP);
-NTSTATUS detourDeviceControl (IN PDEVICE_OBJECT, IN PIRP);
-NTSTATUS filterRead          (IN PDEVICE_OBJECT, IN PIRP);
-NTSTATUS filterPassThrough   (IN PDEVICE_OBJECT, IN PIRP);
-NTSTATUS detourPnP           (IN PDEVICE_OBJECT, IN PIRP);
-NTSTATUS filterPnP           (IN PDEVICE_OBJECT, IN PIRP);
-#ifndef MAYUD_NT4
-NTSTATUS detourPower         (IN PDEVICE_OBJECT, IN PIRP);
-NTSTATUS filterPower         (IN PDEVICE_OBJECT, IN PIRP);
-#endif // !MAYUD_NT4
-
-BOOLEAN CancelKeyboardClassRead(IN PIRP, IN PDEVICE_OBJECT);
-NTSTATUS readq(KeyQue*, PIRP);
-
-#ifdef USE_TOUCHPAD
-NTSTATUS filterTouchpadCompletion (IN PDEVICE_OBJECT, IN PIRP, IN PVOID);
-NTSTATUS filterTouchpad      (IN PDEVICE_OBJECT, IN PIRP);
-#endif
-
-#ifdef ALLOC_PRAGMA
-#pragma alloc_text( init, DriverEntry )
-#endif // ALLOC_PRAGMA
-
-
-///////////////////////////////////////////////////////////////////////////////
-// Global Constants / Variables
-
-BOOLEAN g_isPnP;
-BOOLEAN g_isXp;
-ULONG g_SpinLock_offset;
-ULONG g_RequestIsPending_offset;
-
-// Device names
-#define UnicodeString(str) { sizeof(str) - sizeof(UNICODE_NULL),       \
-                            sizeof(str) - sizeof(UNICODE_NULL), str }
-
-static UNICODE_STRING MayuDetourDeviceName =
-UnicodeString(L"\\Device\\MayuDetour0");
-
-static UNICODE_STRING MayuDetourWin32DeviceName =
-UnicodeString(L"\\DosDevices\\MayuDetour1");
-
-static UNICODE_STRING KeyboardClassDeviceName =
-UnicodeString(DD_KEYBOARD_DEVICE_NAME_U L"0");
-
-static UNICODE_STRING KeyboardClassDriverName =
-UnicodeString(L"\\Driver\\kbdclass");
-
-#ifdef USE_TOUCHPAD
-#define TOUCHPAD_PRESSURE_OFFSET 7
-#endif
-
-// Global Variables
-PDRIVER_DISPATCH _IopInvalidDeviceRequest; // Default dispatch function
-
-
-#define MAYUD_MODE L""
-static UNICODE_STRING MayuDriverVersion =
-UnicodeString(L"$Revision: 1.27 $" MAYUD_MODE);
-
-
-///////////////////////////////////////////////////////////////////////////////
-// Entry / Unload
-
-void DEBUG_LOGChain(PDRIVER_OBJECT driverObject)
-{
-  PDEVICE_OBJECT deviceObject = driverObject->DeviceObject;
-
-  if (deviceObject)
-  {
-    while (deviceObject->NextDevice)
-    {
-      DEBUG_LOG(("%x->", deviceObject));
-      deviceObject = deviceObject->NextDevice;
-    }
-    DEBUG_LOG(("%x", deviceObject));
-  }
-  return;
-}
-
-// initialize driver
-NTSTATUS DriverEntry(IN PDRIVER_OBJECT driverObject,
-                    IN PUNICODE_STRING registryPath)
-{
-  NTSTATUS status;
-  BOOLEAN is_symbolicLinkCreated = FALSE;
-  ULONG i;
-  PDEVICE_OBJECT detourDevObj = NULL;
-  DetourDeviceExtension *detourDevExt = NULL;
-  ULONG start = 0;
-  RTL_QUERY_REGISTRY_TABLE query[2];
-  
-  UNREFERENCED_PARAMETER(registryPath);
-
-  DEBUG_LOG_INIT(("mayud: start logging"));
-
-  // Environment specific initialize
-  RtlZeroMemory(query, sizeof(query));
-  query[0].Name = L"Start";
-  query[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
-  query[0].EntryContext = &start;
-  RtlQueryRegistryValues(RTL_REGISTRY_SERVICES, L"mayud", query, NULL, NULL);
-  if (start == 0x03) {
-    g_isPnP = TRUE;
-    DEBUG_LOG(("is PnP"));
-  } else {
-    g_isPnP = FALSE;
-    DEBUG_LOG(("is not PnP"));
-  }
-#ifdef MAYUD_NT4
-  g_isXp = FALSE;
-  g_SpinLock_offset = 48;
-  g_RequestIsPending_offset = 0;
-#else /* !MAYUD_NT4 */
-  if (IoIsWdmVersionAvailable(1, 0x20)) { // is WindowsXP
-    DEBUG_LOG(("is WindowsXp"));
-    g_isXp = TRUE;
-    g_SpinLock_offset = 108;
-    g_RequestIsPending_offset = 0;
-  } else if (IoIsWdmVersionAvailable(1, 0x10)) { // is Windows2000
-    DEBUG_LOG(("is Windows2000"));
-    g_isXp =FALSE;
-    g_SpinLock_offset = 116;
-    g_RequestIsPending_offset = 48;
-  } else { // Unknown version
-    DEBUG_LOG(("unknown Windows"));
-    status = STATUS_UNKNOWN_REVISION;
-    goto error;
-  }
-#endif /* MAYUD_NT4 */
-
-  // initialize global variables
-  _IopInvalidDeviceRequest = driverObject->MajorFunction[IRP_MJ_CREATE];
-  
-  // set major functions
-  driverObject->DriverUnload = mayuUnloadDriver;
-  if (g_isPnP == TRUE) {
-    driverObject->DriverExtension->AddDevice = mayuAddDevice;
-  }
-  for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
-#ifdef MAYUD_NT4
-    if (i != IRP_MJ_POWER)
-#endif // MAYUD_NT4
-      driverObject->MajorFunction[i] = mayuGenericDispatch;
-  if (g_isPnP == TRUE) {
-    driverObject->MajorFunction[IRP_MJ_PNP] = mayuGenericDispatch;
-  }
-  
-  // create a device
-  {
-    // create detour device
-    status = IoCreateDevice(driverObject, sizeof(DetourDeviceExtension),
-                           &MayuDetourDeviceName, FILE_DEVICE_KEYBOARD,
-                           0, FALSE, &detourDevObj);
-    
-    if (!NT_SUCCESS(status)) goto error;
-    DEBUG_LOG(("create detour device: %x", detourDevObj));
-    DEBUG_LOGChain(driverObject);
-    detourDevObj->Flags |= DO_BUFFERED_IO;
-#ifndef MAYUD_NT4
-    detourDevObj->Flags |= DO_POWER_PAGABLE;
-#endif // !MAYUD_NT4
-
-    // initialize detour device extension
-    detourDevExt = (DetourDeviceExtension*)detourDevObj->DeviceExtension;
-    RtlZeroMemory(detourDevExt, sizeof(DetourDeviceExtension));
-    detourDevExt->filterDevObj = NULL;
-
-    KeInitializeSpinLock(&detourDevExt->lock);
-    detourDevExt->isOpen = FALSE;
-    detourDevExt->wasCleanupInitiated = FALSE;
-    detourDevExt->irpq = NULL;
-    status = KqInitialize(&detourDevExt->readQue);
-    if (!NT_SUCCESS(status)) goto error;
-    
-    // create symbolic link for detour
-    status =
-      IoCreateSymbolicLink(&MayuDetourWin32DeviceName, &MayuDetourDeviceName);
-    if (!NT_SUCCESS(status)) goto error;
-    is_symbolicLinkCreated = TRUE;
-    
-    if (g_isPnP == FALSE)
-    // attach filter device to keyboard class device
-    {
-      PFILE_OBJECT f;
-      PDEVICE_OBJECT kbdClassDevObj;
-      
-      status = IoGetDeviceObjectPointer(&KeyboardClassDeviceName,
-                                       FILE_ALL_ACCESS, &f,
-                                       &kbdClassDevObj);
-      if (!NT_SUCCESS(status)) goto error;
-      ObDereferenceObject(f);
-      status = mayuAddDevice(driverObject, kbdClassDevObj);
-      
-      // why cannot I do below ?
-//      status = IoAttachDevice(filterDevObj, &KeyboardClassDeviceName,
-//                           &filterDevExt->kbdClassDevObj);
-      if (!NT_SUCCESS(status)) goto error;
-    }
-    
-    // initialize Major Functions
-    for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
-    {
-      detourDevExt->MajorFunction[i] = _IopInvalidDeviceRequest;
-    }
-
-    detourDevExt->MajorFunction[IRP_MJ_READ] = detourRead;
-    detourDevExt->MajorFunction[IRP_MJ_WRITE] = detourWrite;
-    detourDevExt->MajorFunction[IRP_MJ_CREATE] = detourCreate;
-    detourDevExt->MajorFunction[IRP_MJ_CLOSE] = detourClose;
-    detourDevExt->MajorFunction[IRP_MJ_CLEANUP] = detourCleanup;
-    detourDevExt->MajorFunction[IRP_MJ_DEVICE_CONTROL] = detourDeviceControl;
-
-#ifndef MAYUD_NT4
-    detourDevExt->MajorFunction[IRP_MJ_POWER] = detourPower;
-#endif // !MAYUD_NT4
-    if (g_isPnP == TRUE) {
-      detourDevExt->MajorFunction[IRP_MJ_PNP] = detourPnP;
-    }
-  }
-  detourDevObj->Flags &= ~DO_DEVICE_INITIALIZING;  
-  
-  return STATUS_SUCCESS;
-  
-  error:
-  {
-    if (is_symbolicLinkCreated)
-      IoDeleteSymbolicLink(&MayuDetourWin32DeviceName);
-    if (detourDevObj)
-    {
-      KqFinalize(&detourDevExt->readQue);
-      IoDeleteDevice(detourDevObj);
-    }
-  }
-  return status;
-}
-
-NTSTATUS mayuAddDevice(IN PDRIVER_OBJECT driverObject,
-                      IN PDEVICE_OBJECT kbdClassDevObj)
-{
-  NTSTATUS status;
-  PDEVICE_OBJECT devObj;
-  PDEVICE_OBJECT filterDevObj;
-  PDEVICE_OBJECT attachedDevObj;
-  DetourDeviceExtension *detourDevExt;
-  FilterDeviceExtension *filterDevExt;
-  ULONG i;
-
-  DEBUG_LOG(("attach to device: %x", kbdClassDevObj));
-  DEBUG_LOG(("type of device: %x", kbdClassDevObj->DeviceType));
-  DEBUG_LOG(("name of driver: %T", &(kbdClassDevObj->DriverObject->DriverName)));
-
-  // create filter device
-  status = IoCreateDevice(driverObject, sizeof(FilterDeviceExtension),
-                         NULL, FILE_DEVICE_KEYBOARD,
-                         0, FALSE, &filterDevObj);
-  DEBUG_LOG(("add filter device: %x", filterDevObj));
-  DEBUG_LOGChain(driverObject);
-  if (!NT_SUCCESS(status)) return status;
-  filterDevObj->Flags |= DO_BUFFERED_IO;
-#ifndef MAYUD_NT4
-  filterDevObj->Flags |= DO_POWER_PAGABLE;
-#endif // !MAYUD_NT4
-
-  // initialize filter device extension
-  filterDevExt = (FilterDeviceExtension*)filterDevObj->DeviceExtension;
-  RtlZeroMemory(filterDevExt, sizeof(FilterDeviceExtension));
-
-  KeInitializeSpinLock(&filterDevExt->lock);
-  filterDevExt->irpq = NULL;
-  status = KqInitialize(&filterDevExt->readQue);
-  if (!NT_SUCCESS(status)) goto error;
-#ifdef USE_TOUCHPAD
-  filterDevExt->isKeyboard = FALSE;
-  filterDevExt->isTouched = FALSE;
-#endif
-
-  attachedDevObj = kbdClassDevObj->AttachedDevice;
-  while (attachedDevObj)
-  {
-    DEBUG_LOG(("attached to %T", &(attachedDevObj->DriverObject->DriverName)));
-    DEBUG_LOG(("type of attched device: %x", attachedDevObj->DeviceType));
-#ifdef USE_TOUCHPAD
-    if (RtlCompareUnicodeString(&KeyboardClassDriverName, &attachedDevObj->DriverObject->DriverName, TRUE) == 0)
-      filterDevExt->isKeyboard = TRUE;
-#endif
-    attachedDevObj = attachedDevObj->AttachedDevice;
-  }
-
-  devObj = filterDevObj->NextDevice;
-  while (devObj->NextDevice) {
-    devObj = devObj->NextDevice;
-  }
-  filterDevExt->detourDevObj = devObj;
-  detourDevExt = (DetourDeviceExtension*)devObj->DeviceExtension;
-  if (!detourDevExt->filterDevObj) {
-    detourDevExt->filterDevObj = filterDevObj;
-  }
-
-  filterDevExt->kbdClassDevObj =
-    IoAttachDeviceToDeviceStack(filterDevObj, kbdClassDevObj);
-  if (!filterDevExt->kbdClassDevObj) goto error;
-
-  for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) {
-    filterDevExt->MajorFunction[i] =
-      (filterDevExt->kbdClassDevObj->DriverObject->MajorFunction[i]
-       == _IopInvalidDeviceRequest) ?
-      _IopInvalidDeviceRequest : filterPassThrough;
-  }
-#ifdef USE_TOUCHPAD
-  if (filterDevExt->isKeyboard == FALSE)
-  {
-    DEBUG_LOG(("filter read: GlidePoint"));
-    filterDevObj->DeviceType = FILE_DEVICE_MOUSE;
-    filterDevExt->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = filterTouchpad;
-  }
-  else
-#endif
-  {
-    DEBUG_LOG(("filter read: Keyboard"));
-    filterDevExt->MajorFunction[IRP_MJ_READ] = filterRead;
-  }
-#ifndef MAYUD_NT4
-  filterDevExt->MajorFunction[IRP_MJ_POWER] = filterPower;
-#endif // !MAYUD_NT4
-  if (g_isPnP == TRUE) {
-    filterDevExt->MajorFunction[IRP_MJ_PNP] = filterPnP;
-  }
-  filterDevObj->Flags &= ~DO_DEVICE_INITIALIZING;  
-
-  return STATUS_SUCCESS;
-
- error:
-  DEBUG_LOG(("mayuAddDevice: error"));
-  if (filterDevObj) {
-      KqFinalize(&filterDevExt->readQue);
-      IoDeleteDevice(filterDevObj);
-  }
-  return status;
-}
-
-BOOLEAN CancelKeyboardClassRead(PIRP cancelIrp, PDEVICE_OBJECT kbdClassDevObj)
-{
-  PVOID kbdClassDevExt;
-  BOOLEAN isSafe;
-  PKSPIN_LOCK SpinLock;
-  KIRQL currentIrql;
-
-  kbdClassDevExt = kbdClassDevObj->DeviceExtension;
-  SpinLock = (PKSPIN_LOCK)((ULONG)kbdClassDevExt + g_SpinLock_offset);
-  KeAcquireSpinLock(SpinLock, &currentIrql);
-  if (g_isXp == TRUE) {
-    isSafe = cancelIrp->CancelRoutine ? TRUE : FALSE;
-  } else {
-    isSafe = *(BOOLEAN*)((ULONG)kbdClassDevExt + g_RequestIsPending_offset);
-  }
-  if (isSafe == TRUE) {
-    KeReleaseSpinLock(SpinLock, currentIrql);
-    IoCancelIrp(cancelIrp);
-  } else {
-    DEBUG_LOG(("cancel irp not pending"));
-    KeReleaseSpinLock(SpinLock, currentIrql);
-  }
-  return isSafe;
-}
-
-// unload driver
-VOID mayuUnloadDriver(IN PDRIVER_OBJECT driverObject)
-{
-  KIRQL currentIrql;
-  PIRP cancelIrp;
-  PDEVICE_OBJECT devObj;
-  DetourDeviceExtension *detourDevExt;
-
-  // walk on device chain(the last one is detour device?)
-  devObj = driverObject->DeviceObject;
-  while (devObj->NextDevice) {
-    FilterDeviceExtension *filterDevExt
-      = (FilterDeviceExtension*)devObj->DeviceExtension;
-    PDEVICE_OBJECT delObj;
-    PDEVICE_OBJECT kbdClassDevObj;
-
-    // detach
-    IoDetachDevice(filterDevExt->kbdClassDevObj);
-    // cancel filter IRP_MJ_READ
-    KeAcquireSpinLock(&filterDevExt->lock, &currentIrql);
-    // TODO: at this point, the irp may be completed (but what can I do for it ?)
-    // finalize read que
-    KqFinalize(&filterDevExt->readQue);
-    cancelIrp = filterDevExt->irpq;
-    filterDevExt->irpq = NULL;
-    kbdClassDevObj = filterDevExt->kbdClassDevObj;
-    KeReleaseSpinLock(&filterDevExt->lock, currentIrql);
-    if (cancelIrp) {
-      while (CancelKeyboardClassRead(cancelIrp, kbdClassDevObj) != TRUE);
-    }
-    // delete device objects
-    delObj= devObj;
-    devObj = devObj->NextDevice;
-    IoDeleteDevice(delObj);
-  }
-
-  detourDevExt = (DetourDeviceExtension*)devObj->DeviceExtension;
-  // cancel filter IRP_MJ_READ
-  KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);
-  // TODO: at this point, the irp may be completed (but what can I do for it ?)
-  cancelIrp = detourDevExt->irpq;
-  // finalize read que
-  KqFinalize(&detourDevExt->readQue);
-  KeReleaseSpinLock(&detourDevExt->lock, currentIrql);
-  if (cancelIrp)
-    IoCancelIrp(cancelIrp);
-  // delete device objects
-  IoDeleteDevice(devObj);
-
-  // delete symbolic link
-  IoDeleteSymbolicLink(&MayuDetourWin32DeviceName);
-  DEBUG_LOG_TERM(());
-}
-
-
-///////////////////////////////////////////////////////////////////////////////
-// Cancel Functionss
-
-
-// detour read cancel
-VOID mayuDetourReadCancel(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)
-{
-  DetourDeviceExtension *devExt =
-    (DetourDeviceExtension *)deviceObject->DeviceExtension;
-  KIRQL currentIrql;
-
-  KeAcquireSpinLock(&devExt->lock, &currentIrql);
-  devExt->irpq = NULL;
-  KeReleaseSpinLock(&devExt->lock, currentIrql);
-  IoReleaseCancelSpinLock(irp->CancelIrql);
-  DEBUG_LOG(("detourReadCancel:"));
-#if 0
-  KeAcquireSpinLock(&devExt->lock, &currentIrql);
-  if (devExt->irpq && irp == deviceObject->CurrentIrp)
-    // the current request is being cancelled
-  {
-    deviceObject->CurrentIrp = NULL;
-    devExt->irpq = NULL;
-    KeReleaseSpinLock(&devExt->lock, currentIrql);
-    IoStartNextPacket(deviceObject, TRUE);
-  }
-  else
-  {
-    // Cancel a request in the device queue
-    KIRQL cancelIrql;
-    
-    IoAcquireCancelSpinLock(&cancelIrql);
-    KeRemoveEntryDeviceQueue(&deviceObject->DeviceQueue,
-                            &irp->Tail.Overlay.DeviceQueueEntry);
-    IoReleaseCancelSpinLock(cancelIrql);
-    KeReleaseSpinLock(&devExt->lock, currentIrql);
-  }
-#endif
-  
-  irp->IoStatus.Status = STATUS_CANCELLED;
-  irp->IoStatus.Information = 0;
-  IoCompleteRequest(irp, IO_KEYBOARD_INCREMENT);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Complete Functions
-
-
-// 
-NTSTATUS filterGenericCompletion(IN PDEVICE_OBJECT deviceObject,
-                                IN PIRP irp, IN PVOID context)
-{
-  UNREFERENCED_PARAMETER(deviceObject);
-  UNREFERENCED_PARAMETER(context);
-  
-  if (irp->PendingReturned)
-    IoMarkIrpPending(irp);
-  return STATUS_SUCCESS;
-}
-
-
-// 
-NTSTATUS filterReadCompletion(IN PDEVICE_OBJECT deviceObject,
-                             IN PIRP irp, IN PVOID context)
-{
-  NTSTATUS status;
-  KIRQL currentIrql, cancelIrql;
-  PIRP irpCancel = NULL;
-  FilterDeviceExtension *filterDevExt =
-    (FilterDeviceExtension*)deviceObject->DeviceExtension;
-  PDEVICE_OBJECT detourDevObj = filterDevExt->detourDevObj;
-  DetourDeviceExtension *detourDevExt =
-    (DetourDeviceExtension*)detourDevObj->DeviceExtension;
-
-  UNREFERENCED_PARAMETER(context);
-  
-  KeAcquireSpinLock(&filterDevExt->lock, &currentIrql);
-  filterDevExt->irpq = NULL;
-  KeReleaseSpinLock(&filterDevExt->lock, currentIrql);
-  if (irp->PendingReturned) {
-    status = STATUS_PENDING;
-    IoMarkIrpPending(irp);
-  } else {
-    status = STATUS_SUCCESS;
-  }
-
-  KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);
-  if (detourDevExt->isOpen && !detourDevExt->wasCleanupInitiated)
-  {
-    // if detour is opened, key datum are forwarded to detour
-    if (irp->IoStatus.Status == STATUS_SUCCESS)
-    {
-      PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(irp);
-      
-      KqEnque(&detourDevExt->readQue,
-             (KEYBOARD_INPUT_DATA *)irp->AssociatedIrp.SystemBuffer,
-             irp->IoStatus.Information / sizeof(KEYBOARD_INPUT_DATA));
-
-      irp->IoStatus.Status = STATUS_CANCELLED;
-      irp->IoStatus.Information = 0;
-      detourDevExt->filterDevObj = deviceObject;
-    }
-
-    IoAcquireCancelSpinLock(&cancelIrql);
-    if (detourDevExt->irpq) {
-      if (readq(&detourDevExt->readQue, detourDevExt->irpq) ==
-         STATUS_SUCCESS) {
-       IoSetCancelRoutine(detourDevExt->irpq, NULL);
-       IoCompleteRequest(detourDevExt->irpq, IO_KEYBOARD_INCREMENT);
-       detourDevExt->irpq = NULL;
-      }
-    }
-    IoReleaseCancelSpinLock(cancelIrql);
-    KeReleaseSpinLock(&detourDevExt->lock, currentIrql);
-
-    KeAcquireSpinLock(&filterDevExt->lock, &currentIrql);
-    status = readq(&filterDevExt->readQue, irp);
-    KeReleaseSpinLock(&filterDevExt->lock, currentIrql);
-  }
-  else
-  {
-    KeReleaseSpinLock(&detourDevExt->lock, currentIrql);
-  }
-
-  if (status == STATUS_SUCCESS)
-    irp->IoStatus.Status = STATUS_SUCCESS;
-  return irp->IoStatus.Status;
-}
-
-NTSTATUS readq(KeyQue *readQue, PIRP irp)
-{
-  if (!KqIsEmpty(readQue)) {
-    PIO_STACK_LOCATION irpSp;
-    ULONG len;
-
-    irpSp = IoGetCurrentIrpStackLocation(irp);
-    len = KqDeque(readQue,
-                 (KEYBOARD_INPUT_DATA *)irp->AssociatedIrp.SystemBuffer,
-                 irpSp->Parameters.Read.Length / sizeof(KEYBOARD_INPUT_DATA));
-    irp->IoStatus.Status = STATUS_SUCCESS;
-    irp->IoStatus.Information = len * sizeof(KEYBOARD_INPUT_DATA);
-    irpSp->Parameters.Read.Length = irp->IoStatus.Information;
-    return STATUS_SUCCESS;
-  } else {
-    irp->IoStatus.Status = STATUS_PENDING;
-    irp->IoStatus.Information = 0;
-    return STATUS_PENDING;
-  }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Dispatch Functions
-
-
-// Generic Dispatcher
-NTSTATUS mayuGenericDispatch(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)
-{
-  PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(irp);
-
-  if (deviceObject->NextDevice) {
-    FilterDeviceExtension *filterDevExt =
-      (FilterDeviceExtension *)deviceObject->DeviceExtension;
-
-#ifdef USE_TOUCHPAD
-    if (filterDevExt->isKeyboard == FALSE)
-    {
-      DEBUG_LOG(("MajorFunction: %x", irpSp->MajorFunction));
-    }
-#endif
-    return filterDevExt->MajorFunction[irpSp->MajorFunction](deviceObject, irp);
-  } else {
-    DetourDeviceExtension *detourDevExt = 
-      (DetourDeviceExtension *)deviceObject->DeviceExtension;
-
-    return detourDevExt->MajorFunction[irpSp->MajorFunction](deviceObject, irp);
-  }
-}
-
-
-// detour IRP_MJ_CREATE
-NTSTATUS detourCreate(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)
-{
-  DetourDeviceExtension *detourDevExt =
-    (DetourDeviceExtension*)deviceObject->DeviceExtension;
-
-  if (1 < InterlockedIncrement(&detourDevExt->isOpen))
-    // mayu detour device can be opend only once at a time
-  {
-    InterlockedDecrement(&detourDevExt->isOpen);
-    irp->IoStatus.Status = STATUS_INTERNAL_ERROR;
-  }
-  else
-  {
-    PIRP irpCancel;
-    KIRQL currentIrql;
-    PDEVICE_OBJECT filterDevObj;
-    
-    KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);
-    detourDevExt->wasCleanupInitiated = FALSE;
-    KqClear(&detourDevExt->readQue);
-    filterDevObj = detourDevExt->filterDevObj;
-    KeReleaseSpinLock(&detourDevExt->lock, currentIrql);
-    if (filterDevObj) {
-      FilterDeviceExtension *filterDevExt =
-       (FilterDeviceExtension*)filterDevObj->DeviceExtension;
-      PDEVICE_OBJECT kbdClassDevObj;
-
-      KeAcquireSpinLock(&filterDevExt->lock, &currentIrql);
-      irpCancel = filterDevExt->kbdClassDevObj->CurrentIrp;
-      kbdClassDevObj = filterDevExt->kbdClassDevObj;
-      KeReleaseSpinLock(&filterDevExt->lock, currentIrql);
-      if (irpCancel) {
-       CancelKeyboardClassRead(irpCancel, kbdClassDevObj);
-      }
-    }
-
-    irp->IoStatus.Status = STATUS_SUCCESS;
-  }
-  irp->IoStatus.Information = 0;
-  IoCompleteRequest(irp, IO_NO_INCREMENT);
-  return irp->IoStatus.Status;
-}
-
-
-// detour IRP_MJ_CLOSE
-NTSTATUS detourClose(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)
-{
-  DetourDeviceExtension *detourDevExt =
-    (DetourDeviceExtension*)deviceObject->DeviceExtension;
-  KIRQL currentIrql;
-
-  KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);
-  InterlockedDecrement(&detourDevExt->isOpen);
-  KeReleaseSpinLock(&detourDevExt->lock, currentIrql);
-  irp->IoStatus.Status = STATUS_SUCCESS;
-  irp->IoStatus.Information = 0;
-  IoCompleteRequest(irp, IO_NO_INCREMENT);
-  DEBUG_LOG_TERM(());
-  return STATUS_SUCCESS;
-}
-
-
-// detour IRP_MJ_READ
-NTSTATUS detourRead(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)
-{
-  NTSTATUS status;
-  PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(irp);
-  DetourDeviceExtension *detourDevExt =
-    (DetourDeviceExtension*)deviceObject->DeviceExtension;
-  KIRQL currentIrql, cancelIrql;
-
-  KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);
-  if (irpSp->Parameters.Read.Length == 0)
-    status = STATUS_SUCCESS;
-  else if (irpSp->Parameters.Read.Length % sizeof(KEYBOARD_INPUT_DATA))
-    status = STATUS_BUFFER_TOO_SMALL;
-  else
-    status = readq(&detourDevExt->readQue, irp);
-  if (status == STATUS_PENDING) {
-    IoAcquireCancelSpinLock(&cancelIrql);
-    IoMarkIrpPending(irp);
-    detourDevExt->irpq = irp;
-    IoSetCancelRoutine(irp, mayuDetourReadCancel);
-    IoReleaseCancelSpinLock(cancelIrql);
-  }
-  else {
-    IoCompleteRequest(irp, IO_KEYBOARD_INCREMENT);
-  }
-  KeReleaseSpinLock(&detourDevExt->lock, currentIrql);
-  return status;
-}
-
-
-// detour IRP_MJ_WRITE
-NTSTATUS detourWrite(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)
-{
-  NTSTATUS status;
-  PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(irp);
-  ULONG len = irpSp->Parameters.Write.Length;
-  DetourDeviceExtension *detourDevExt =
-    (DetourDeviceExtension*)deviceObject->DeviceExtension;
-  
-  irp->IoStatus.Information = 0;
-  if (len == 0)
-    status = STATUS_SUCCESS;
-  else if (len % sizeof(KEYBOARD_INPUT_DATA))
-    status = STATUS_INVALID_PARAMETER;
-  else {
-    // write to filter que
-    KIRQL cancelIrql, currentIrql;
-    PIRP irpCancel;
-    PDEVICE_OBJECT filterDevObj;
-
-    KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);
-    filterDevObj = detourDevExt->filterDevObj;
-    KeReleaseSpinLock(&detourDevExt->lock, currentIrql);
-    // enque filter que
-    if (filterDevObj) {
-      FilterDeviceExtension *filterDevExt =
-       (FilterDeviceExtension*)filterDevObj->DeviceExtension;
-      PDEVICE_OBJECT kbdClassDevObj;
-
-      KeAcquireSpinLock(&filterDevExt->lock, &currentIrql);
-
-      len /= sizeof(KEYBOARD_INPUT_DATA);
-      len = KqEnque(&filterDevExt->readQue,
-                   (KEYBOARD_INPUT_DATA *)irp->AssociatedIrp.SystemBuffer,
-                   len);
-      irp->IoStatus.Information = len * sizeof(KEYBOARD_INPUT_DATA);
-      irpSp->Parameters.Write.Length = irp->IoStatus.Information;
-      // cancel filter irp
-      irpCancel = filterDevExt->irpq; 
-      filterDevExt->irpq = NULL;
-      kbdClassDevObj = filterDevExt->kbdClassDevObj;
-      KeReleaseSpinLock(&filterDevExt->lock, currentIrql);
-      if (irpCancel) {
-       CancelKeyboardClassRead(irpCancel, kbdClassDevObj);
-      }
-      status = STATUS_SUCCESS;
-    } else {
-      irp->IoStatus.Information = 0;
-      irpSp->Parameters.Write.Length = irp->IoStatus.Information;
-      status = STATUS_CANCELLED;
-    }
-  }
-  IoCompleteRequest(irp, IO_NO_INCREMENT);
-  return status;
-}
-
-
-// detour IRP_MJ_CLEANUP
-NTSTATUS detourCleanup(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)
-{
-  KIRQL currentIrql, cancelIrql;
-  PIO_STACK_LOCATION irpSp;
-  PIRP  currentIrp = NULL, irpCancel;
-  DetourDeviceExtension *detourDevExt =
-    (DetourDeviceExtension*)deviceObject->DeviceExtension;
-
-  KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);
-  IoAcquireCancelSpinLock(&cancelIrql);
-  irpSp = IoGetCurrentIrpStackLocation(irp);
-  detourDevExt->wasCleanupInitiated = TRUE;
-  
-  // Complete all requests queued by this thread with STATUS_CANCELLED
-  currentIrp = deviceObject->CurrentIrp;
-  deviceObject->CurrentIrp = NULL;
-  detourDevExt->irpq = NULL;
-  
-  while (currentIrp != NULL)
-  {
-    IoSetCancelRoutine(currentIrp, NULL);
-    currentIrp->IoStatus.Status = STATUS_CANCELLED;
-    currentIrp->IoStatus.Information = 0;
-    
-    IoReleaseCancelSpinLock(cancelIrql);
-    KeReleaseSpinLock(&detourDevExt->lock, currentIrql);
-    IoCompleteRequest(currentIrp, IO_NO_INCREMENT);
-    KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);
-    IoAcquireCancelSpinLock(&cancelIrql);
-    
-    // Dequeue the next packet (IRP) from the device work queue.
-    {
-      PKDEVICE_QUEUE_ENTRY packet =
-       KeRemoveDeviceQueue(&deviceObject->DeviceQueue);
-      currentIrp = packet ?
-       CONTAINING_RECORD(packet, IRP, Tail.Overlay.DeviceQueueEntry) : NULL;
-    }
-  }
-  
-  IoReleaseCancelSpinLock(cancelIrql);
-  KeReleaseSpinLock(&detourDevExt->lock, currentIrql);
-  
-  // Complete the cleanup request with STATUS_SUCCESS.
-  irp->IoStatus.Status = STATUS_SUCCESS;
-  irp->IoStatus.Information = 0;
-  IoCompleteRequest(irp, IO_NO_INCREMENT);
-  
-  return STATUS_SUCCESS;
-}
-
-
-// detour IRP_MJ_DEVICE_CONTROL
-NTSTATUS detourDeviceControl(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)
-{
-  NTSTATUS status;
-  PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(irp);
-  DetourDeviceExtension *detourDevExt =
-    (DetourDeviceExtension*)deviceObject->DeviceExtension;
-  
-  irp->IoStatus.Information = 0;
-  if (irpSp->Parameters.DeviceIoControl.IoControlCode != IOCTL_MAYU_GET_LOG) DEBUG_LOG(("DeviceIoControl: %x", irpSp->Parameters.DeviceIoControl.IoControlCode));
-  status = STATUS_INVALID_DEVICE_REQUEST;
-  switch (irpSp->Parameters.DeviceIoControl.IoControlCode)
-  {
-    case IOCTL_MAYU_DETOUR_CANCEL:
-    {
-      KIRQL currentIrql;
-      PIRP irpCancel = NULL;
-      
-      KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);
-      if (detourDevExt->isOpen)
-       irpCancel = detourDevExt->irpq;
-      KeReleaseSpinLock(&detourDevExt->lock, currentIrql);
-      
-      if (irpCancel)
-       IoCancelIrp(irpCancel);// at this point, the irpCancel may be completed
-      status = STATUS_SUCCESS;
-      break;
-    }
-    case IOCTL_MAYU_GET_VERSION:
-    {
-      if (irpSp->Parameters.DeviceIoControl.OutputBufferLength <
-         MayuDriverVersion.Length)
-      {
-         status = STATUS_INVALID_PARAMETER;
-         break;
-      }
-      RtlCopyMemory(irp->AssociatedIrp.SystemBuffer,
-                   MayuDriverVersion.Buffer, MayuDriverVersion.Length);
-      irp->IoStatus.Information = MayuDriverVersion.Length;
-      DEBUG_LOG(("Version: %T", &MayuDriverVersion));
-      status = STATUS_SUCCESS;
-      break;
-    }
-    case IOCTL_MAYU_GET_LOG:
-      status = DEBUG_LOG_RETRIEVE((irp));
-      break;
-    case IOCTL_MAYU_FORCE_KEYBOARD_INPUT:
-    {
-      KIRQL currentIrql, cancelIrql;
-
-      // if detour is opened, key datum are forwarded to detour
-      if (irpSp->Parameters.DeviceIoControl.InputBufferLength %
-         sizeof(KEYBOARD_INPUT_DATA))
-      {
-       status = STATUS_INVALID_PARAMETER;
-       break;
-      }
-      KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);
-      KqEnque(&detourDevExt->readQue,
-             (KEYBOARD_INPUT_DATA *)irp->AssociatedIrp.SystemBuffer,
-             irpSp->Parameters.DeviceIoControl.InputBufferLength
-             / sizeof(KEYBOARD_INPUT_DATA));
-
-      if (detourDevExt->irpq) {
-       if (readq(&detourDevExt->readQue, detourDevExt->irpq) ==
-           STATUS_SUCCESS) {
-         IoAcquireCancelSpinLock(&cancelIrql);
-         IoSetCancelRoutine(detourDevExt->irpq, NULL);
-         IoReleaseCancelSpinLock(cancelIrql);
-         IoCompleteRequest(detourDevExt->irpq, IO_KEYBOARD_INCREMENT);
-         detourDevExt->irpq = NULL;
-       }
-      }
-      KeReleaseSpinLock(&detourDevExt->lock, currentIrql);
-      status = STATUS_SUCCESS;
-      break;
-    }
-    default:
-      status = STATUS_INVALID_DEVICE_REQUEST;
-      break;
-  }
-  irp->IoStatus.Status = status;
-  if (status != STATUS_PENDING)
-    IoCompleteRequest(irp, IO_NO_INCREMENT);
-  
-  return status;
-}
-
-
-#ifndef MAYUD_NT4
-// detour IRP_MJ_POWER
-NTSTATUS detourPower(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)
-{
-  UNREFERENCED_PARAMETER(deviceObject);
-  
-  PoStartNextPowerIrp(irp);
-  irp->IoStatus.Status = STATUS_SUCCESS;
-  irp->IoStatus.Information = 0;
-  IoCompleteRequest(irp, IO_NO_INCREMENT);
-  return STATUS_SUCCESS;
-}
-#endif // !MAYUD_NT4
-
-
-// filter IRP_MJ_READ
-NTSTATUS filterRead(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)
-{
-  NTSTATUS status;
-  PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(irp);
-  FilterDeviceExtension *filterDevExt =
-    (FilterDeviceExtension*)deviceObject->DeviceExtension;
-  DetourDeviceExtension *detourDevExt =
-    (DetourDeviceExtension*)filterDevExt->detourDevObj->DeviceExtension;
-  KIRQL currentIrql;
-  
-  KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);
-  if (detourDevExt->isOpen && !detourDevExt->wasCleanupInitiated)
-    // read from que
-  {
-    ULONG len = irpSp->Parameters.Read.Length;
-    
-    KeReleaseSpinLock(&detourDevExt->lock, currentIrql);
-    irp->IoStatus.Information = 0;
-    KeAcquireSpinLock(&filterDevExt->lock, &currentIrql);
-    if (len == 0)
-      status = STATUS_SUCCESS;
-    else if (len % sizeof(KEYBOARD_INPUT_DATA))
-      status = STATUS_BUFFER_TOO_SMALL;
-    else
-      status = readq(&filterDevExt->readQue, irp);
-    KeReleaseSpinLock(&filterDevExt->lock, currentIrql);
-    if (status != STATUS_PENDING) {
-      irp->IoStatus.Status = status;
-      IoCompleteRequest(irp, IO_NO_INCREMENT);
-      return status;
-    }
-  }
-  else
-  {
-    KeReleaseSpinLock(&detourDevExt->lock, currentIrql);
-  }
-  KeAcquireSpinLock(&filterDevExt->lock, &currentIrql);
-  filterDevExt->irpq = irp;
-  KeReleaseSpinLock(&filterDevExt->lock, currentIrql);
-  
-  *IoGetNextIrpStackLocation(irp) = *irpSp;
-  IoSetCompletionRoutine(irp, filterReadCompletion, NULL, TRUE, TRUE, TRUE);
-  return IoCallDriver(filterDevExt->kbdClassDevObj, irp);
-}
-
-
-// pass throught irp to keyboard class driver
-NTSTATUS filterPassThrough(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)
-{
-  FilterDeviceExtension *filterDevExt =
-    (FilterDeviceExtension*)deviceObject->DeviceExtension;
-
-  *IoGetNextIrpStackLocation(irp) = *IoGetCurrentIrpStackLocation(irp);
-  IoSetCompletionRoutine(irp, filterGenericCompletion,
-                        NULL, TRUE, TRUE, TRUE);
-  return IoCallDriver(filterDevExt->kbdClassDevObj, irp);
-}
-
-
-#ifndef MAYUD_NT4
-// filter IRP_MJ_POWER
-NTSTATUS filterPower(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)
-{
-  FilterDeviceExtension *filterDevExt =
-    (FilterDeviceExtension*)deviceObject->DeviceExtension;
-
-  PoStartNextPowerIrp(irp);
-  IoSkipCurrentIrpStackLocation(irp);
-  return PoCallDriver(filterDevExt->kbdClassDevObj, irp);
-}
-#endif // !MAYUD_NT4
-NTSTATUS filterPnP(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)
-{
-  PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(irp);
-  FilterDeviceExtension *filterDevExt =
-    (FilterDeviceExtension*)deviceObject->DeviceExtension;
-  DetourDeviceExtension *detourDevExt =
-    (DetourDeviceExtension*)filterDevExt->detourDevObj->DeviceExtension;
-  KIRQL currentIrql;
-  NTSTATUS status;
-  ULONG minor;
-  PIRP cancelIrp;
-  PDRIVER_OBJECT driverObject = deviceObject->DriverObject;
-
-  minor = irpSp->MinorFunction;
-  IoSkipCurrentIrpStackLocation(irp);
-  status = IoCallDriver(filterDevExt->kbdClassDevObj, irp);
-  DEBUG_LOG(("filterPnP: minor=%d(%x)", minor, minor));
-  switch (minor) {
-  case IRP_MN_SURPRISE_REMOVAL:
-  case IRP_MN_REMOVE_DEVICE:
-    KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);
-    if (detourDevExt->filterDevObj == deviceObject) {
-      PDEVICE_OBJECT devObj = deviceObject->DriverObject->DeviceObject;
-
-      DEBUG_LOG(("filterPnP: current filter(%x) was removed", deviceObject));
-      detourDevExt->filterDevObj = NULL;
-      while (devObj->NextDevice) {
-       if (devObj != deviceObject) {
-         detourDevExt->filterDevObj = devObj;
-         break;
-       }
-       devObj = devObj->NextDevice;
-      }
-      DEBUG_LOG(("filterPnP: current filter was changed to %x", detourDevExt->filterDevObj));
-    }
-    KeReleaseSpinLock(&detourDevExt->lock, currentIrql);
-    // detach
-    IoDetachDevice(filterDevExt->kbdClassDevObj);
-
-    KeAcquireSpinLock(&filterDevExt->lock, &currentIrql);
-    // TODO: at this point, the irp may be completed (but what can I do for it ?)
-    cancelIrp = filterDevExt->irpq;
-    KqFinalize(&filterDevExt->readQue);
-
-    KeReleaseSpinLock(&filterDevExt->lock, currentIrql);
-    if (cancelIrp) {
-      IoCancelIrp(cancelIrp);
-    }
-    IoDeleteDevice(deviceObject);
-    DEBUG_LOG(("delete filter device: %x", deviceObject));
-    DEBUG_LOGChain(driverObject);
-    break;
-  default:
-    break;
-  }
-  return status;
-}
-
-
-#ifdef USE_TOUCHPAD
-// 
-NTSTATUS filterTouchpadCompletion(IN PDEVICE_OBJECT deviceObject,
-                                IN PIRP irp, IN PVOID context)
-{
-  KIRQL currentIrql;
-  FilterDeviceExtension *filterDevExt =
-    (FilterDeviceExtension*)deviceObject->DeviceExtension;
-  PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(irp);
-  //PIO_STACK_LOCATION irpSp = IoGetNextIrpStackLocation(irp);
-  UCHAR *data = irp->UserBuffer;
-  UCHAR pressure;
-
-  UNREFERENCED_PARAMETER(context);
-  
-  if (irp->PendingReturned)
-    IoMarkIrpPending(irp);
-
-  if (data)
-    pressure = data[TOUCHPAD_PRESSURE_OFFSET];
-  else
-    pressure = 0;
-
-  if (data)
-  {
-    ULONG *p = (ULONG*)data;
-    //DEBUG_LOG(("UserBuffer: %2x %2x %2x %2x", data[4], data[5], data[6], data[7]));
-    //DEBUG_LOG(("UserBuffer: %x %x %x %x %x %x %x %x", p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]));
-  }
-  KeAcquireSpinLock(&filterDevExt->lock, &currentIrql);
-  if (filterDevExt->isTouched == FALSE && pressure)
-  {
-    KIRQL currentIrql, cancelIrql;
-    PDEVICE_OBJECT detourDevObj = filterDevExt->detourDevObj;
-    DetourDeviceExtension *detourDevExt =
-      (DetourDeviceExtension*)detourDevObj->DeviceExtension;
-    if (detourDevExt->isOpen)
-    {
-      KEYBOARD_INPUT_DATA PadKey = {0, TOUCHPAD_SCANCODE, 0, 0, 0};
-      KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);
-      // if detour is opened, key datum are forwarded to detour
-      KqEnque(&detourDevExt->readQue, &PadKey, 1);
-      detourDevExt->filterDevObj = deviceObject;
-
-      if (detourDevExt->irpq) {
-       if (readq(&detourDevExt->readQue, detourDevExt->irpq) ==
-           STATUS_SUCCESS) {
-         IoAcquireCancelSpinLock(&cancelIrql);
-         IoSetCancelRoutine(detourDevExt->irpq, NULL);
-         IoReleaseCancelSpinLock(cancelIrql);
-         IoCompleteRequest(detourDevExt->irpq, IO_KEYBOARD_INCREMENT);
-         detourDevExt->irpq = NULL;
-       }
-      }
-      KeReleaseSpinLock(&detourDevExt->lock, currentIrql);
-    }
-    filterDevExt->isTouched = TRUE;
-  }
-  else
-  {
-    if (filterDevExt->isTouched == TRUE && pressure == 0)
-    {
-      KIRQL currentIrql, cancelIrql;
-      PDEVICE_OBJECT detourDevObj = filterDevExt->detourDevObj;
-      DetourDeviceExtension *detourDevExt =
-       (DetourDeviceExtension*)detourDevObj->DeviceExtension;
-      if (detourDevExt->isOpen)
-      {
-       KEYBOARD_INPUT_DATA PadKey = {0, TOUCHPAD_SCANCODE, 1, 0, 0};
-       KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);
-       // if detour is opened, key datum are forwarded to detour
-       KqEnque(&detourDevExt->readQue, &PadKey, 1);
-       detourDevExt->filterDevObj = deviceObject;
-
-       if (detourDevExt->irpq) {
-         if (readq(&detourDevExt->readQue, detourDevExt->irpq) ==
-             STATUS_SUCCESS) {
-           IoAcquireCancelSpinLock(&cancelIrql);
-           IoSetCancelRoutine(detourDevExt->irpq, NULL);
-           IoReleaseCancelSpinLock(cancelIrql);
-           IoCompleteRequest(detourDevExt->irpq, IO_KEYBOARD_INCREMENT);
-           detourDevExt->irpq = NULL;
-         }
-       }
-       KeReleaseSpinLock(&detourDevExt->lock, currentIrql);
-      }
-      filterDevExt->isTouched = FALSE;
-    }
-  }
-  //DEBUG_LOG(("touchpad pressed: out=%u in=%u code=%u status=%x SystemBuffer=%x UserBuffer=%x", irpSp->Parameters.DeviceIoControl.OutputBufferLength, irpSp->Parameters.DeviceIoControl.InputBufferLength, irpSp->Parameters.DeviceIoControl.IoControlCode, irp->IoStatus.Status, irp->AssociatedIrp.SystemBuffer, irp->UserBuffer));
-  KeReleaseSpinLock(&filterDevExt->lock, currentIrql);
-  return STATUS_SUCCESS;
-}
-
-
-// filter touchpad input
-NTSTATUS filterTouchpad(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)
-{
-  FilterDeviceExtension *filterDevExt =
-    (FilterDeviceExtension*)deviceObject->DeviceExtension;
-
-  *IoGetNextIrpStackLocation(irp) = *IoGetCurrentIrpStackLocation(irp);
-  IoSetCompletionRoutine(irp, filterTouchpadCompletion,
-                        NULL, TRUE, TRUE, TRUE);
-  return IoCallDriver(filterDevExt->kbdClassDevObj, irp);
-}
-#endif
-
-
-NTSTATUS detourPnP(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)
-{
-  UNREFERENCED_PARAMETER(deviceObject);
-
-  IoSkipCurrentIrpStackLocation(irp);
-  irp->IoStatus.Status = STATUS_SUCCESS;
-  irp->IoStatus.Information = 0;
-  IoCompleteRequest(irp, IO_NO_INCREMENT);
-  return STATUS_SUCCESS;
-}
+///////////////////////////////////////////////////////////////////////////////\r
+// Driver for Madotsukai no Yu^utsu for Windows2000\r
+\r
+\r
+#include <ntddk.h>\r
+#include <ntddkbd.h>\r
+#include <devioctl.h>\r
+\r
+#pragma warning(3 : 4061 4100 4132 4701 4706)\r
+\r
+#include "ioctl.h"\r
+#include "keyque.c"\r
+\r
+//#define USE_TOUCHPAD // very experimental!\r
+\r
+#if DBG\r
+// Enable debug logging only on checked build:\r
+// We use macro to avoid function call overhead\r
+// in non-logging case, and use double paren such\r
+// as DEBUG_LOG((...)) because of va_list in macro.\r
+#include "log.h"\r
+#define DEBUG_LOG_INIT(x) mayuLogInit x\r
+#define DEBUG_LOG_TERM(x) mayuLogTerm x\r
+#define DEBUG_LOG(x) mayuLogEnque x\r
+#define DEBUG_LOG_RETRIEVE(x) mayuLogDeque x\r
+#else\r
+#define DEBUG_LOG_INIT(x)\r
+#define DEBUG_LOG_TERM(x)\r
+#define DEBUG_LOG(x)\r
+#define DEBUG_LOG_RETRIEVE(x) STATUS_INVALID_DEVICE_REQUEST\r
+#endif\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Device Extensions\r
+\r
+struct _DetourDeviceExtension;\r
+struct _FilterDeviceExtension;\r
+\r
+typedef struct _DetourDeviceExtension\r
+{\r
+  PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];\r
+\r
+  KSPIN_LOCK lock; // lock below datum\r
+  PDEVICE_OBJECT filterDevObj;\r
+  LONG isOpen;\r
+  BOOLEAN wasCleanupInitiated; //\r
+  PIRP irpq;\r
+  KeyQue readQue; // when IRP_MJ_READ, the contents of readQue are returned\r
+} DetourDeviceExtension;\r
+\r
+typedef struct _FilterDeviceExtension\r
+{\r
+  PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];\r
+  \r
+  PDEVICE_OBJECT detourDevObj;\r
+  PDEVICE_OBJECT kbdClassDevObj; // keyboard class device object\r
+  \r
+#ifdef USE_TOUCHPAD\r
+  BOOLEAN isKeyboard;\r
+#endif\r
+  KSPIN_LOCK lock; // lock below datum\r
+  PIRP irpq;\r
+  KeyQue readQue; // when IRP_MJ_READ, the contents of readQue are returned\r
+#ifdef USE_TOUCHPAD\r
+  BOOLEAN isTouched;\r
+#endif\r
+} FilterDeviceExtension;\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Protorypes (TODO)\r
+\r
+\r
+NTSTATUS DriverEntry       (IN PDRIVER_OBJECT, IN PUNICODE_STRING);\r
+NTSTATUS mayuAddDevice     (IN PDRIVER_OBJECT, IN PDEVICE_OBJECT);\r
+VOID mayuUnloadDriver      (IN PDRIVER_OBJECT);\r
+VOID mayuDetourReadCancel (IN PDEVICE_OBJECT, IN PIRP);\r
+\r
+NTSTATUS filterGenericCompletion (IN PDEVICE_OBJECT, IN PIRP, IN PVOID);\r
+NTSTATUS filterReadCompletion    (IN PDEVICE_OBJECT, IN PIRP, IN PVOID);\r
+\r
+NTSTATUS mayuGenericDispatch (IN PDEVICE_OBJECT, IN PIRP);\r
+NTSTATUS detourCreate        (IN PDEVICE_OBJECT, IN PIRP);\r
+NTSTATUS detourClose         (IN PDEVICE_OBJECT, IN PIRP);\r
+NTSTATUS detourRead          (IN PDEVICE_OBJECT, IN PIRP);\r
+NTSTATUS detourWrite         (IN PDEVICE_OBJECT, IN PIRP);\r
+NTSTATUS detourCleanup       (IN PDEVICE_OBJECT, IN PIRP);\r
+NTSTATUS detourDeviceControl (IN PDEVICE_OBJECT, IN PIRP);\r
+NTSTATUS filterRead          (IN PDEVICE_OBJECT, IN PIRP);\r
+NTSTATUS filterPassThrough   (IN PDEVICE_OBJECT, IN PIRP);\r
+NTSTATUS detourPnP           (IN PDEVICE_OBJECT, IN PIRP);\r
+NTSTATUS filterPnP           (IN PDEVICE_OBJECT, IN PIRP);\r
+#ifndef MAYUD_NT4\r
+NTSTATUS detourPower         (IN PDEVICE_OBJECT, IN PIRP);\r
+NTSTATUS filterPower         (IN PDEVICE_OBJECT, IN PIRP);\r
+#endif // !MAYUD_NT4\r
+\r
+BOOLEAN CancelKeyboardClassRead(IN PIRP, IN PDEVICE_OBJECT);\r
+NTSTATUS readq(KeyQue*, PIRP);\r
+\r
+#ifdef USE_TOUCHPAD\r
+NTSTATUS filterTouchpadCompletion (IN PDEVICE_OBJECT, IN PIRP, IN PVOID);\r
+NTSTATUS filterTouchpad      (IN PDEVICE_OBJECT, IN PIRP);\r
+#endif\r
+\r
+#ifdef ALLOC_PRAGMA\r
+#pragma alloc_text( init, DriverEntry )\r
+#endif // ALLOC_PRAGMA\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Global Constants / Variables\r
+\r
+BOOLEAN g_isPnP;\r
+BOOLEAN g_isXp;\r
+ULONG g_SpinLock_offset;\r
+ULONG g_RequestIsPending_offset;\r
+\r
+// Device names\r
+#define UnicodeString(str) { sizeof(str) - sizeof(UNICODE_NULL),       \\r
+                            sizeof(str) - sizeof(UNICODE_NULL), str }\r
+\r
+static UNICODE_STRING MayuDetourDeviceName =\r
+UnicodeString(L"\\Device\\MayuDetour0");\r
+\r
+static UNICODE_STRING MayuDetourWin32DeviceName =\r
+UnicodeString(L"\\DosDevices\\MayuDetour1");\r
+\r
+static UNICODE_STRING KeyboardClassDeviceName =\r
+UnicodeString(DD_KEYBOARD_DEVICE_NAME_U L"0");\r
+\r
+static UNICODE_STRING KeyboardClassDriverName =\r
+UnicodeString(L"\\Driver\\kbdclass");\r
+\r
+#ifdef USE_TOUCHPAD\r
+#define TOUCHPAD_PRESSURE_OFFSET 7\r
+#endif\r
+\r
+// Global Variables\r
+PDRIVER_DISPATCH _IopInvalidDeviceRequest; // Default dispatch function\r
+\r
+\r
+#define MAYUD_MODE L""\r
+static UNICODE_STRING MayuDriverVersion =\r
+UnicodeString(L"$Revision: 1.27 $" MAYUD_MODE);\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Entry / Unload\r
+\r
+void DEBUG_LOGChain(PDRIVER_OBJECT driverObject)\r
+{\r
+  PDEVICE_OBJECT deviceObject = driverObject->DeviceObject;\r
+\r
+  if (deviceObject)\r
+  {\r
+    while (deviceObject->NextDevice)\r
+    {\r
+      DEBUG_LOG(("%x->", deviceObject));\r
+      deviceObject = deviceObject->NextDevice;\r
+    }\r
+    DEBUG_LOG(("%x", deviceObject));\r
+  }\r
+  return;\r
+}\r
+\r
+// initialize driver\r
+NTSTATUS DriverEntry(IN PDRIVER_OBJECT driverObject,\r
+                    IN PUNICODE_STRING registryPath)\r
+{\r
+  NTSTATUS status;\r
+  BOOLEAN is_symbolicLinkCreated = FALSE;\r
+  ULONG i;\r
+  PDEVICE_OBJECT detourDevObj = NULL;\r
+  DetourDeviceExtension *detourDevExt = NULL;\r
+  ULONG start = 0;\r
+  RTL_QUERY_REGISTRY_TABLE query[2];\r
+  \r
+  UNREFERENCED_PARAMETER(registryPath);\r
+\r
+  DEBUG_LOG_INIT(("mayud: start logging"));\r
+\r
+  // Environment specific initialize\r
+  RtlZeroMemory(query, sizeof(query));\r
+  query[0].Name = L"Start";\r
+  query[0].Flags = RTL_QUERY_REGISTRY_DIRECT;\r
+  query[0].EntryContext = &start;\r
+  RtlQueryRegistryValues(RTL_REGISTRY_SERVICES, L"mayud", query, NULL, NULL);\r
+  if (start == 0x03) {\r
+    g_isPnP = TRUE;\r
+    DEBUG_LOG(("is PnP"));\r
+  } else {\r
+    g_isPnP = FALSE;\r
+    DEBUG_LOG(("is not PnP"));\r
+  }\r
+#ifdef MAYUD_NT4\r
+  g_isXp = FALSE;\r
+  g_SpinLock_offset = 48;\r
+  g_RequestIsPending_offset = 0;\r
+#else /* !MAYUD_NT4 */\r
+  if (IoIsWdmVersionAvailable(1, 0x20)) { // is WindowsXP\r
+    DEBUG_LOG(("is WindowsXp"));\r
+    g_isXp = TRUE;\r
+    g_SpinLock_offset = 108;\r
+    g_RequestIsPending_offset = 0;\r
+  } else if (IoIsWdmVersionAvailable(1, 0x10)) { // is Windows2000\r
+    DEBUG_LOG(("is Windows2000"));\r
+    g_isXp =FALSE;\r
+    g_SpinLock_offset = 116;\r
+    g_RequestIsPending_offset = 48;\r
+  } else { // Unknown version\r
+    DEBUG_LOG(("unknown Windows"));\r
+    status = STATUS_UNKNOWN_REVISION;\r
+    goto error;\r
+  }\r
+#endif /* MAYUD_NT4 */\r
+\r
+  // initialize global variables\r
+  _IopInvalidDeviceRequest = driverObject->MajorFunction[IRP_MJ_CREATE];\r
+  \r
+  // set major functions\r
+  driverObject->DriverUnload = mayuUnloadDriver;\r
+  if (g_isPnP == TRUE) {\r
+    driverObject->DriverExtension->AddDevice = mayuAddDevice;\r
+  }\r
+  for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)\r
+#ifdef MAYUD_NT4\r
+    if (i != IRP_MJ_POWER)\r
+#endif // MAYUD_NT4\r
+      driverObject->MajorFunction[i] = mayuGenericDispatch;\r
+  if (g_isPnP == TRUE) {\r
+    driverObject->MajorFunction[IRP_MJ_PNP] = mayuGenericDispatch;\r
+  }\r
+  \r
+  // create a device\r
+  {\r
+    // create detour device\r
+    status = IoCreateDevice(driverObject, sizeof(DetourDeviceExtension),\r
+                           &MayuDetourDeviceName, FILE_DEVICE_KEYBOARD,\r
+                           0, FALSE, &detourDevObj);\r
+    \r
+    if (!NT_SUCCESS(status)) goto error;\r
+    DEBUG_LOG(("create detour device: %x", detourDevObj));\r
+    DEBUG_LOGChain(driverObject);\r
+    detourDevObj->Flags |= DO_BUFFERED_IO;\r
+#ifndef MAYUD_NT4\r
+    detourDevObj->Flags |= DO_POWER_PAGABLE;\r
+#endif // !MAYUD_NT4\r
+\r
+    // initialize detour device extension\r
+    detourDevExt = (DetourDeviceExtension*)detourDevObj->DeviceExtension;\r
+    RtlZeroMemory(detourDevExt, sizeof(DetourDeviceExtension));\r
+    detourDevExt->filterDevObj = NULL;\r
+\r
+    KeInitializeSpinLock(&detourDevExt->lock);\r
+    detourDevExt->isOpen = FALSE;\r
+    detourDevExt->wasCleanupInitiated = FALSE;\r
+    detourDevExt->irpq = NULL;\r
+    status = KqInitialize(&detourDevExt->readQue);\r
+    if (!NT_SUCCESS(status)) goto error;\r
+    \r
+    // create symbolic link for detour\r
+    status =\r
+      IoCreateSymbolicLink(&MayuDetourWin32DeviceName, &MayuDetourDeviceName);\r
+    if (!NT_SUCCESS(status)) goto error;\r
+    is_symbolicLinkCreated = TRUE;\r
+    \r
+    if (g_isPnP == FALSE)\r
+    // attach filter device to keyboard class device\r
+    {\r
+      PFILE_OBJECT f;\r
+      PDEVICE_OBJECT kbdClassDevObj;\r
+      \r
+      status = IoGetDeviceObjectPointer(&KeyboardClassDeviceName,\r
+                                       FILE_ALL_ACCESS, &f,\r
+                                       &kbdClassDevObj);\r
+      if (!NT_SUCCESS(status)) goto error;\r
+      ObDereferenceObject(f);\r
+      status = mayuAddDevice(driverObject, kbdClassDevObj);\r
+      \r
+      // why cannot I do below ?\r
+//      status = IoAttachDevice(filterDevObj, &KeyboardClassDeviceName,\r
+//                           &filterDevExt->kbdClassDevObj);\r
+      if (!NT_SUCCESS(status)) goto error;\r
+    }\r
+    \r
+    // initialize Major Functions\r
+    for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)\r
+    {\r
+      detourDevExt->MajorFunction[i] = _IopInvalidDeviceRequest;\r
+    }\r
+\r
+    detourDevExt->MajorFunction[IRP_MJ_READ] = detourRead;\r
+    detourDevExt->MajorFunction[IRP_MJ_WRITE] = detourWrite;\r
+    detourDevExt->MajorFunction[IRP_MJ_CREATE] = detourCreate;\r
+    detourDevExt->MajorFunction[IRP_MJ_CLOSE] = detourClose;\r
+    detourDevExt->MajorFunction[IRP_MJ_CLEANUP] = detourCleanup;\r
+    detourDevExt->MajorFunction[IRP_MJ_DEVICE_CONTROL] = detourDeviceControl;\r
+\r
+#ifndef MAYUD_NT4\r
+    detourDevExt->MajorFunction[IRP_MJ_POWER] = detourPower;\r
+#endif // !MAYUD_NT4\r
+    if (g_isPnP == TRUE) {\r
+      detourDevExt->MajorFunction[IRP_MJ_PNP] = detourPnP;\r
+    }\r
+  }\r
+  detourDevObj->Flags &= ~DO_DEVICE_INITIALIZING;  \r
+  \r
+  return STATUS_SUCCESS;\r
+  \r
+  error:\r
+  {\r
+    if (is_symbolicLinkCreated)\r
+      IoDeleteSymbolicLink(&MayuDetourWin32DeviceName);\r
+    if (detourDevObj)\r
+    {\r
+      KqFinalize(&detourDevExt->readQue);\r
+      IoDeleteDevice(detourDevObj);\r
+    }\r
+  }\r
+  return status;\r
+}\r
+\r
+NTSTATUS mayuAddDevice(IN PDRIVER_OBJECT driverObject,\r
+                      IN PDEVICE_OBJECT kbdClassDevObj)\r
+{\r
+  NTSTATUS status;\r
+  PDEVICE_OBJECT devObj;\r
+  PDEVICE_OBJECT filterDevObj;\r
+  PDEVICE_OBJECT attachedDevObj;\r
+  DetourDeviceExtension *detourDevExt;\r
+  FilterDeviceExtension *filterDevExt;\r
+  ULONG i;\r
+\r
+  DEBUG_LOG(("attach to device: %x", kbdClassDevObj));\r
+  DEBUG_LOG(("type of device: %x", kbdClassDevObj->DeviceType));\r
+  DEBUG_LOG(("name of driver: %T", &(kbdClassDevObj->DriverObject->DriverName)));\r
+\r
+  // create filter device\r
+  status = IoCreateDevice(driverObject, sizeof(FilterDeviceExtension),\r
+                         NULL, FILE_DEVICE_KEYBOARD,\r
+                         0, FALSE, &filterDevObj);\r
+  DEBUG_LOG(("add filter device: %x", filterDevObj));\r
+  DEBUG_LOGChain(driverObject);\r
+  if (!NT_SUCCESS(status)) return status;\r
+  filterDevObj->Flags |= DO_BUFFERED_IO;\r
+#ifndef MAYUD_NT4\r
+  filterDevObj->Flags |= DO_POWER_PAGABLE;\r
+#endif // !MAYUD_NT4\r
+\r
+  // initialize filter device extension\r
+  filterDevExt = (FilterDeviceExtension*)filterDevObj->DeviceExtension;\r
+  RtlZeroMemory(filterDevExt, sizeof(FilterDeviceExtension));\r
+\r
+  KeInitializeSpinLock(&filterDevExt->lock);\r
+  filterDevExt->irpq = NULL;\r
+  status = KqInitialize(&filterDevExt->readQue);\r
+  if (!NT_SUCCESS(status)) goto error;\r
+#ifdef USE_TOUCHPAD\r
+  filterDevExt->isKeyboard = FALSE;\r
+  filterDevExt->isTouched = FALSE;\r
+#endif\r
+\r
+  attachedDevObj = kbdClassDevObj->AttachedDevice;\r
+  while (attachedDevObj)\r
+  {\r
+    DEBUG_LOG(("attached to %T", &(attachedDevObj->DriverObject->DriverName)));\r
+    DEBUG_LOG(("type of attched device: %x", attachedDevObj->DeviceType));\r
+#ifdef USE_TOUCHPAD\r
+    if (RtlCompareUnicodeString(&KeyboardClassDriverName, &attachedDevObj->DriverObject->DriverName, TRUE) == 0)\r
+      filterDevExt->isKeyboard = TRUE;\r
+#endif\r
+    attachedDevObj = attachedDevObj->AttachedDevice;\r
+  }\r
+\r
+  devObj = filterDevObj->NextDevice;\r
+  while (devObj->NextDevice) {\r
+    devObj = devObj->NextDevice;\r
+  }\r
+  filterDevExt->detourDevObj = devObj;\r
+  detourDevExt = (DetourDeviceExtension*)devObj->DeviceExtension;\r
+  if (!detourDevExt->filterDevObj) {\r
+    detourDevExt->filterDevObj = filterDevObj;\r
+  }\r
+\r
+  filterDevExt->kbdClassDevObj =\r
+    IoAttachDeviceToDeviceStack(filterDevObj, kbdClassDevObj);\r
+  if (!filterDevExt->kbdClassDevObj) goto error;\r
+\r
+  for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) {\r
+    filterDevExt->MajorFunction[i] =\r
+      (filterDevExt->kbdClassDevObj->DriverObject->MajorFunction[i]\r
+       == _IopInvalidDeviceRequest) ?\r
+      _IopInvalidDeviceRequest : filterPassThrough;\r
+  }\r
+#ifdef USE_TOUCHPAD\r
+  if (filterDevExt->isKeyboard == FALSE)\r
+  {\r
+    DEBUG_LOG(("filter read: GlidePoint"));\r
+    filterDevObj->DeviceType = FILE_DEVICE_MOUSE;\r
+    filterDevExt->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = filterTouchpad;\r
+  }\r
+  else\r
+#endif\r
+  {\r
+    DEBUG_LOG(("filter read: Keyboard"));\r
+    filterDevExt->MajorFunction[IRP_MJ_READ] = filterRead;\r
+  }\r
+#ifndef MAYUD_NT4\r
+  filterDevExt->MajorFunction[IRP_MJ_POWER] = filterPower;\r
+#endif // !MAYUD_NT4\r
+  if (g_isPnP == TRUE) {\r
+    filterDevExt->MajorFunction[IRP_MJ_PNP] = filterPnP;\r
+  }\r
+  filterDevObj->Flags &= ~DO_DEVICE_INITIALIZING;  \r
+\r
+  return STATUS_SUCCESS;\r
+\r
+ error:\r
+  DEBUG_LOG(("mayuAddDevice: error"));\r
+  if (filterDevObj) {\r
+      KqFinalize(&filterDevExt->readQue);\r
+      IoDeleteDevice(filterDevObj);\r
+  }\r
+  return status;\r
+}\r
+\r
+BOOLEAN CancelKeyboardClassRead(PIRP cancelIrp, PDEVICE_OBJECT kbdClassDevObj)\r
+{\r
+  PVOID kbdClassDevExt;\r
+  BOOLEAN isSafe;\r
+  PKSPIN_LOCK SpinLock;\r
+  KIRQL currentIrql;\r
+\r
+  kbdClassDevExt = kbdClassDevObj->DeviceExtension;\r
+  SpinLock = (PKSPIN_LOCK)((ULONG)kbdClassDevExt + g_SpinLock_offset);\r
+  KeAcquireSpinLock(SpinLock, &currentIrql);\r
+  if (g_isXp == TRUE) {\r
+    isSafe = cancelIrp->CancelRoutine ? TRUE : FALSE;\r
+  } else {\r
+    isSafe = *(BOOLEAN*)((ULONG)kbdClassDevExt + g_RequestIsPending_offset);\r
+  }\r
+  if (isSafe == TRUE) {\r
+    KeReleaseSpinLock(SpinLock, currentIrql);\r
+    IoCancelIrp(cancelIrp);\r
+  } else {\r
+    DEBUG_LOG(("cancel irp not pending"));\r
+    KeReleaseSpinLock(SpinLock, currentIrql);\r
+  }\r
+  return isSafe;\r
+}\r
+\r
+// unload driver\r
+VOID mayuUnloadDriver(IN PDRIVER_OBJECT driverObject)\r
+{\r
+  KIRQL currentIrql;\r
+  PIRP cancelIrp;\r
+  PDEVICE_OBJECT devObj;\r
+  DetourDeviceExtension *detourDevExt;\r
+\r
+  // walk on device chain(the last one is detour device?)\r
+  devObj = driverObject->DeviceObject;\r
+  while (devObj->NextDevice) {\r
+    FilterDeviceExtension *filterDevExt\r
+      = (FilterDeviceExtension*)devObj->DeviceExtension;\r
+    PDEVICE_OBJECT delObj;\r
+    PDEVICE_OBJECT kbdClassDevObj;\r
+\r
+    // detach\r
+    IoDetachDevice(filterDevExt->kbdClassDevObj);\r
+    // cancel filter IRP_MJ_READ\r
+    KeAcquireSpinLock(&filterDevExt->lock, &currentIrql);\r
+    // TODO: at this point, the irp may be completed (but what can I do for it ?)\r
+    // finalize read que\r
+    KqFinalize(&filterDevExt->readQue);\r
+    cancelIrp = filterDevExt->irpq;\r
+    filterDevExt->irpq = NULL;\r
+    kbdClassDevObj = filterDevExt->kbdClassDevObj;\r
+    KeReleaseSpinLock(&filterDevExt->lock, currentIrql);\r
+    if (cancelIrp) {\r
+      while (CancelKeyboardClassRead(cancelIrp, kbdClassDevObj) != TRUE);\r
+    }\r
+    // delete device objects\r
+    delObj= devObj;\r
+    devObj = devObj->NextDevice;\r
+    IoDeleteDevice(delObj);\r
+  }\r
+\r
+  detourDevExt = (DetourDeviceExtension*)devObj->DeviceExtension;\r
+  // cancel filter IRP_MJ_READ\r
+  KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);\r
+  // TODO: at this point, the irp may be completed (but what can I do for it ?)\r
+  cancelIrp = detourDevExt->irpq;\r
+  // finalize read que\r
+  KqFinalize(&detourDevExt->readQue);\r
+  KeReleaseSpinLock(&detourDevExt->lock, currentIrql);\r
+  if (cancelIrp)\r
+    IoCancelIrp(cancelIrp);\r
+  // delete device objects\r
+  IoDeleteDevice(devObj);\r
+\r
+  // delete symbolic link\r
+  IoDeleteSymbolicLink(&MayuDetourWin32DeviceName);\r
+  DEBUG_LOG_TERM(());\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Cancel Functionss\r
+\r
+\r
+// detour read cancel\r
+VOID mayuDetourReadCancel(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)\r
+{\r
+  DetourDeviceExtension *devExt =\r
+    (DetourDeviceExtension *)deviceObject->DeviceExtension;\r
+  KIRQL currentIrql;\r
+\r
+  KeAcquireSpinLock(&devExt->lock, &currentIrql);\r
+  devExt->irpq = NULL;\r
+  KeReleaseSpinLock(&devExt->lock, currentIrql);\r
+  IoReleaseCancelSpinLock(irp->CancelIrql);\r
+  DEBUG_LOG(("detourReadCancel:"));\r
+#if 0\r
+  KeAcquireSpinLock(&devExt->lock, &currentIrql);\r
+  if (devExt->irpq && irp == deviceObject->CurrentIrp)\r
+    // the current request is being cancelled\r
+  {\r
+    deviceObject->CurrentIrp = NULL;\r
+    devExt->irpq = NULL;\r
+    KeReleaseSpinLock(&devExt->lock, currentIrql);\r
+    IoStartNextPacket(deviceObject, TRUE);\r
+  }\r
+  else\r
+  {\r
+    // Cancel a request in the device queue\r
+    KIRQL cancelIrql;\r
+    \r
+    IoAcquireCancelSpinLock(&cancelIrql);\r
+    KeRemoveEntryDeviceQueue(&deviceObject->DeviceQueue,\r
+                            &irp->Tail.Overlay.DeviceQueueEntry);\r
+    IoReleaseCancelSpinLock(cancelIrql);\r
+    KeReleaseSpinLock(&devExt->lock, currentIrql);\r
+  }\r
+#endif\r
+  \r
+  irp->IoStatus.Status = STATUS_CANCELLED;\r
+  irp->IoStatus.Information = 0;\r
+  IoCompleteRequest(irp, IO_KEYBOARD_INCREMENT);\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Complete Functions\r
+\r
+\r
+// \r
+NTSTATUS filterGenericCompletion(IN PDEVICE_OBJECT deviceObject,\r
+                                IN PIRP irp, IN PVOID context)\r
+{\r
+  UNREFERENCED_PARAMETER(deviceObject);\r
+  UNREFERENCED_PARAMETER(context);\r
+  \r
+  if (irp->PendingReturned)\r
+    IoMarkIrpPending(irp);\r
+  return STATUS_SUCCESS;\r
+}\r
+\r
+\r
+// \r
+NTSTATUS filterReadCompletion(IN PDEVICE_OBJECT deviceObject,\r
+                             IN PIRP irp, IN PVOID context)\r
+{\r
+  NTSTATUS status;\r
+  KIRQL currentIrql, cancelIrql;\r
+  PIRP irpCancel = NULL;\r
+  FilterDeviceExtension *filterDevExt =\r
+    (FilterDeviceExtension*)deviceObject->DeviceExtension;\r
+  PDEVICE_OBJECT detourDevObj = filterDevExt->detourDevObj;\r
+  DetourDeviceExtension *detourDevExt =\r
+    (DetourDeviceExtension*)detourDevObj->DeviceExtension;\r
+\r
+  UNREFERENCED_PARAMETER(context);\r
+  \r
+  KeAcquireSpinLock(&filterDevExt->lock, &currentIrql);\r
+  filterDevExt->irpq = NULL;\r
+  KeReleaseSpinLock(&filterDevExt->lock, currentIrql);\r
+  if (irp->PendingReturned) {\r
+    status = STATUS_PENDING;\r
+    IoMarkIrpPending(irp);\r
+  } else {\r
+    status = STATUS_SUCCESS;\r
+  }\r
+\r
+  KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);\r
+  if (detourDevExt->isOpen && !detourDevExt->wasCleanupInitiated)\r
+  {\r
+    // if detour is opened, key datum are forwarded to detour\r
+    if (irp->IoStatus.Status == STATUS_SUCCESS)\r
+    {\r
+      PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(irp);\r
+      \r
+      KqEnque(&detourDevExt->readQue,\r
+             (KEYBOARD_INPUT_DATA *)irp->AssociatedIrp.SystemBuffer,\r
+             irp->IoStatus.Information / sizeof(KEYBOARD_INPUT_DATA));\r
+\r
+      irp->IoStatus.Status = STATUS_CANCELLED;\r
+      irp->IoStatus.Information = 0;\r
+      detourDevExt->filterDevObj = deviceObject;\r
+    }\r
+\r
+    IoAcquireCancelSpinLock(&cancelIrql);\r
+    if (detourDevExt->irpq) {\r
+      if (readq(&detourDevExt->readQue, detourDevExt->irpq) ==\r
+         STATUS_SUCCESS) {\r
+       IoSetCancelRoutine(detourDevExt->irpq, NULL);\r
+       IoCompleteRequest(detourDevExt->irpq, IO_KEYBOARD_INCREMENT);\r
+       detourDevExt->irpq = NULL;\r
+      }\r
+    }\r
+    IoReleaseCancelSpinLock(cancelIrql);\r
+    KeReleaseSpinLock(&detourDevExt->lock, currentIrql);\r
+\r
+    KeAcquireSpinLock(&filterDevExt->lock, &currentIrql);\r
+    status = readq(&filterDevExt->readQue, irp);\r
+    KeReleaseSpinLock(&filterDevExt->lock, currentIrql);\r
+  }\r
+  else\r
+  {\r
+    KeReleaseSpinLock(&detourDevExt->lock, currentIrql);\r
+  }\r
+\r
+  if (status == STATUS_SUCCESS)\r
+    irp->IoStatus.Status = STATUS_SUCCESS;\r
+  return irp->IoStatus.Status;\r
+}\r
+\r
+NTSTATUS readq(KeyQue *readQue, PIRP irp)\r
+{\r
+  if (!KqIsEmpty(readQue)) {\r
+    PIO_STACK_LOCATION irpSp;\r
+    ULONG len;\r
+\r
+    irpSp = IoGetCurrentIrpStackLocation(irp);\r
+    len = KqDeque(readQue,\r
+                 (KEYBOARD_INPUT_DATA *)irp->AssociatedIrp.SystemBuffer,\r
+                 irpSp->Parameters.Read.Length / sizeof(KEYBOARD_INPUT_DATA));\r
+    irp->IoStatus.Status = STATUS_SUCCESS;\r
+    irp->IoStatus.Information = len * sizeof(KEYBOARD_INPUT_DATA);\r
+    irpSp->Parameters.Read.Length = irp->IoStatus.Information;\r
+    return STATUS_SUCCESS;\r
+  } else {\r
+    irp->IoStatus.Status = STATUS_PENDING;\r
+    irp->IoStatus.Information = 0;\r
+    return STATUS_PENDING;\r
+  }\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Dispatch Functions\r
+\r
+\r
+// Generic Dispatcher\r
+NTSTATUS mayuGenericDispatch(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)\r
+{\r
+  PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(irp);\r
+\r
+  if (deviceObject->NextDevice) {\r
+    FilterDeviceExtension *filterDevExt =\r
+      (FilterDeviceExtension *)deviceObject->DeviceExtension;\r
+\r
+#ifdef USE_TOUCHPAD\r
+    if (filterDevExt->isKeyboard == FALSE)\r
+    {\r
+      DEBUG_LOG(("MajorFunction: %x", irpSp->MajorFunction));\r
+    }\r
+#endif\r
+    return filterDevExt->MajorFunction[irpSp->MajorFunction](deviceObject, irp);\r
+  } else {\r
+    DetourDeviceExtension *detourDevExt = \r
+      (DetourDeviceExtension *)deviceObject->DeviceExtension;\r
+\r
+    return detourDevExt->MajorFunction[irpSp->MajorFunction](deviceObject, irp);\r
+  }\r
+}\r
+\r
+\r
+// detour IRP_MJ_CREATE\r
+NTSTATUS detourCreate(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)\r
+{\r
+  DetourDeviceExtension *detourDevExt =\r
+    (DetourDeviceExtension*)deviceObject->DeviceExtension;\r
+\r
+  if (1 < InterlockedIncrement(&detourDevExt->isOpen))\r
+    // mayu detour device can be opend only once at a time\r
+  {\r
+    InterlockedDecrement(&detourDevExt->isOpen);\r
+    irp->IoStatus.Status = STATUS_INTERNAL_ERROR;\r
+  }\r
+  else\r
+  {\r
+    PIRP irpCancel;\r
+    KIRQL currentIrql;\r
+    PDEVICE_OBJECT filterDevObj;\r
+    \r
+    KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);\r
+    detourDevExt->wasCleanupInitiated = FALSE;\r
+    KqClear(&detourDevExt->readQue);\r
+    filterDevObj = detourDevExt->filterDevObj;\r
+    KeReleaseSpinLock(&detourDevExt->lock, currentIrql);\r
+    if (filterDevObj) {\r
+      FilterDeviceExtension *filterDevExt =\r
+       (FilterDeviceExtension*)filterDevObj->DeviceExtension;\r
+      PDEVICE_OBJECT kbdClassDevObj;\r
+\r
+      KeAcquireSpinLock(&filterDevExt->lock, &currentIrql);\r
+      irpCancel = filterDevExt->kbdClassDevObj->CurrentIrp;\r
+      kbdClassDevObj = filterDevExt->kbdClassDevObj;\r
+      KeReleaseSpinLock(&filterDevExt->lock, currentIrql);\r
+      if (irpCancel) {\r
+       CancelKeyboardClassRead(irpCancel, kbdClassDevObj);\r
+      }\r
+    }\r
+\r
+    irp->IoStatus.Status = STATUS_SUCCESS;\r
+  }\r
+  irp->IoStatus.Information = 0;\r
+  IoCompleteRequest(irp, IO_NO_INCREMENT);\r
+  return irp->IoStatus.Status;\r
+}\r
+\r
+\r
+// detour IRP_MJ_CLOSE\r
+NTSTATUS detourClose(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)\r
+{\r
+  DetourDeviceExtension *detourDevExt =\r
+    (DetourDeviceExtension*)deviceObject->DeviceExtension;\r
+  KIRQL currentIrql;\r
+\r
+  KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);\r
+  InterlockedDecrement(&detourDevExt->isOpen);\r
+  KeReleaseSpinLock(&detourDevExt->lock, currentIrql);\r
+  irp->IoStatus.Status = STATUS_SUCCESS;\r
+  irp->IoStatus.Information = 0;\r
+  IoCompleteRequest(irp, IO_NO_INCREMENT);\r
+  DEBUG_LOG_TERM(());\r
+  return STATUS_SUCCESS;\r
+}\r
+\r
+\r
+// detour IRP_MJ_READ\r
+NTSTATUS detourRead(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)\r
+{\r
+  NTSTATUS status;\r
+  PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(irp);\r
+  DetourDeviceExtension *detourDevExt =\r
+    (DetourDeviceExtension*)deviceObject->DeviceExtension;\r
+  KIRQL currentIrql, cancelIrql;\r
+\r
+  KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);\r
+  if (irpSp->Parameters.Read.Length == 0)\r
+    status = STATUS_SUCCESS;\r
+  else if (irpSp->Parameters.Read.Length % sizeof(KEYBOARD_INPUT_DATA))\r
+    status = STATUS_BUFFER_TOO_SMALL;\r
+  else\r
+    status = readq(&detourDevExt->readQue, irp);\r
+  if (status == STATUS_PENDING) {\r
+    IoAcquireCancelSpinLock(&cancelIrql);\r
+    IoMarkIrpPending(irp);\r
+    detourDevExt->irpq = irp;\r
+    IoSetCancelRoutine(irp, mayuDetourReadCancel);\r
+    IoReleaseCancelSpinLock(cancelIrql);\r
+  }\r
+  else {\r
+    IoCompleteRequest(irp, IO_KEYBOARD_INCREMENT);\r
+  }\r
+  KeReleaseSpinLock(&detourDevExt->lock, currentIrql);\r
+  return status;\r
+}\r
+\r
+\r
+// detour IRP_MJ_WRITE\r
+NTSTATUS detourWrite(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)\r
+{\r
+  NTSTATUS status;\r
+  PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(irp);\r
+  ULONG len = irpSp->Parameters.Write.Length;\r
+  DetourDeviceExtension *detourDevExt =\r
+    (DetourDeviceExtension*)deviceObject->DeviceExtension;\r
+  \r
+  irp->IoStatus.Information = 0;\r
+  if (len == 0)\r
+    status = STATUS_SUCCESS;\r
+  else if (len % sizeof(KEYBOARD_INPUT_DATA))\r
+    status = STATUS_INVALID_PARAMETER;\r
+  else {\r
+    // write to filter que\r
+    KIRQL cancelIrql, currentIrql;\r
+    PIRP irpCancel;\r
+    PDEVICE_OBJECT filterDevObj;\r
+\r
+    KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);\r
+    filterDevObj = detourDevExt->filterDevObj;\r
+    KeReleaseSpinLock(&detourDevExt->lock, currentIrql);\r
+    // enque filter que\r
+    if (filterDevObj) {\r
+      FilterDeviceExtension *filterDevExt =\r
+       (FilterDeviceExtension*)filterDevObj->DeviceExtension;\r
+      PDEVICE_OBJECT kbdClassDevObj;\r
+\r
+      KeAcquireSpinLock(&filterDevExt->lock, &currentIrql);\r
+\r
+      len /= sizeof(KEYBOARD_INPUT_DATA);\r
+      len = KqEnque(&filterDevExt->readQue,\r
+                   (KEYBOARD_INPUT_DATA *)irp->AssociatedIrp.SystemBuffer,\r
+                   len);\r
+      irp->IoStatus.Information = len * sizeof(KEYBOARD_INPUT_DATA);\r
+      irpSp->Parameters.Write.Length = irp->IoStatus.Information;\r
+      // cancel filter irp\r
+      irpCancel = filterDevExt->irpq; \r
+      filterDevExt->irpq = NULL;\r
+      kbdClassDevObj = filterDevExt->kbdClassDevObj;\r
+      KeReleaseSpinLock(&filterDevExt->lock, currentIrql);\r
+      if (irpCancel) {\r
+       CancelKeyboardClassRead(irpCancel, kbdClassDevObj);\r
+      }\r
+      status = STATUS_SUCCESS;\r
+    } else {\r
+      irp->IoStatus.Information = 0;\r
+      irpSp->Parameters.Write.Length = irp->IoStatus.Information;\r
+      status = STATUS_CANCELLED;\r
+    }\r
+  }\r
+  IoCompleteRequest(irp, IO_NO_INCREMENT);\r
+  return status;\r
+}\r
+\r
+\r
+// detour IRP_MJ_CLEANUP\r
+NTSTATUS detourCleanup(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)\r
+{\r
+  KIRQL currentIrql, cancelIrql;\r
+  PIO_STACK_LOCATION irpSp;\r
+  PIRP  currentIrp = NULL, irpCancel;\r
+  DetourDeviceExtension *detourDevExt =\r
+    (DetourDeviceExtension*)deviceObject->DeviceExtension;\r
+\r
+  KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);\r
+  IoAcquireCancelSpinLock(&cancelIrql);\r
+  irpSp = IoGetCurrentIrpStackLocation(irp);\r
+  detourDevExt->wasCleanupInitiated = TRUE;\r
+  \r
+  // Complete all requests queued by this thread with STATUS_CANCELLED\r
+  currentIrp = deviceObject->CurrentIrp;\r
+  deviceObject->CurrentIrp = NULL;\r
+  detourDevExt->irpq = NULL;\r
+  \r
+  while (currentIrp != NULL)\r
+  {\r
+    IoSetCancelRoutine(currentIrp, NULL);\r
+    currentIrp->IoStatus.Status = STATUS_CANCELLED;\r
+    currentIrp->IoStatus.Information = 0;\r
+    \r
+    IoReleaseCancelSpinLock(cancelIrql);\r
+    KeReleaseSpinLock(&detourDevExt->lock, currentIrql);\r
+    IoCompleteRequest(currentIrp, IO_NO_INCREMENT);\r
+    KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);\r
+    IoAcquireCancelSpinLock(&cancelIrql);\r
+    \r
+    // Dequeue the next packet (IRP) from the device work queue.\r
+    {\r
+      PKDEVICE_QUEUE_ENTRY packet =\r
+       KeRemoveDeviceQueue(&deviceObject->DeviceQueue);\r
+      currentIrp = packet ?\r
+       CONTAINING_RECORD(packet, IRP, Tail.Overlay.DeviceQueueEntry) : NULL;\r
+    }\r
+  }\r
+  \r
+  IoReleaseCancelSpinLock(cancelIrql);\r
+  KeReleaseSpinLock(&detourDevExt->lock, currentIrql);\r
+  \r
+  // Complete the cleanup request with STATUS_SUCCESS.\r
+  irp->IoStatus.Status = STATUS_SUCCESS;\r
+  irp->IoStatus.Information = 0;\r
+  IoCompleteRequest(irp, IO_NO_INCREMENT);\r
+  \r
+  return STATUS_SUCCESS;\r
+}\r
+\r
+\r
+// detour IRP_MJ_DEVICE_CONTROL\r
+NTSTATUS detourDeviceControl(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)\r
+{\r
+  NTSTATUS status;\r
+  PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(irp);\r
+  DetourDeviceExtension *detourDevExt =\r
+    (DetourDeviceExtension*)deviceObject->DeviceExtension;\r
+  \r
+  irp->IoStatus.Information = 0;\r
+  if (irpSp->Parameters.DeviceIoControl.IoControlCode != IOCTL_MAYU_GET_LOG) DEBUG_LOG(("DeviceIoControl: %x", irpSp->Parameters.DeviceIoControl.IoControlCode));\r
+  status = STATUS_INVALID_DEVICE_REQUEST;\r
+  switch (irpSp->Parameters.DeviceIoControl.IoControlCode)\r
+  {\r
+    case IOCTL_MAYU_DETOUR_CANCEL:\r
+    {\r
+      KIRQL currentIrql;\r
+      PIRP irpCancel = NULL;\r
+      \r
+      KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);\r
+      if (detourDevExt->isOpen)\r
+       irpCancel = detourDevExt->irpq;\r
+      KeReleaseSpinLock(&detourDevExt->lock, currentIrql);\r
+      \r
+      if (irpCancel)\r
+       IoCancelIrp(irpCancel);// at this point, the irpCancel may be completed\r
+      status = STATUS_SUCCESS;\r
+      break;\r
+    }\r
+    case IOCTL_MAYU_GET_VERSION:\r
+    {\r
+      if (irpSp->Parameters.DeviceIoControl.OutputBufferLength <\r
+         MayuDriverVersion.Length)\r
+      {\r
+         status = STATUS_INVALID_PARAMETER;\r
+         break;\r
+      }\r
+      RtlCopyMemory(irp->AssociatedIrp.SystemBuffer,\r
+                   MayuDriverVersion.Buffer, MayuDriverVersion.Length);\r
+      irp->IoStatus.Information = MayuDriverVersion.Length;\r
+      DEBUG_LOG(("Version: %T", &MayuDriverVersion));\r
+      status = STATUS_SUCCESS;\r
+      break;\r
+    }\r
+    case IOCTL_MAYU_GET_LOG:\r
+      status = DEBUG_LOG_RETRIEVE((irp));\r
+      break;\r
+    case IOCTL_MAYU_FORCE_KEYBOARD_INPUT:\r
+    {\r
+      KIRQL currentIrql, cancelIrql;\r
+\r
+      // if detour is opened, key datum are forwarded to detour\r
+      if (irpSp->Parameters.DeviceIoControl.InputBufferLength %\r
+         sizeof(KEYBOARD_INPUT_DATA))\r
+      {\r
+       status = STATUS_INVALID_PARAMETER;\r
+       break;\r
+      }\r
+      KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);\r
+      KqEnque(&detourDevExt->readQue,\r
+             (KEYBOARD_INPUT_DATA *)irp->AssociatedIrp.SystemBuffer,\r
+             irpSp->Parameters.DeviceIoControl.InputBufferLength\r
+             / sizeof(KEYBOARD_INPUT_DATA));\r
+\r
+      if (detourDevExt->irpq) {\r
+       if (readq(&detourDevExt->readQue, detourDevExt->irpq) ==\r
+           STATUS_SUCCESS) {\r
+         IoAcquireCancelSpinLock(&cancelIrql);\r
+         IoSetCancelRoutine(detourDevExt->irpq, NULL);\r
+         IoReleaseCancelSpinLock(cancelIrql);\r
+         IoCompleteRequest(detourDevExt->irpq, IO_KEYBOARD_INCREMENT);\r
+         detourDevExt->irpq = NULL;\r
+       }\r
+      }\r
+      KeReleaseSpinLock(&detourDevExt->lock, currentIrql);\r
+      status = STATUS_SUCCESS;\r
+      break;\r
+    }\r
+    default:\r
+      status = STATUS_INVALID_DEVICE_REQUEST;\r
+      break;\r
+  }\r
+  irp->IoStatus.Status = status;\r
+  if (status != STATUS_PENDING)\r
+    IoCompleteRequest(irp, IO_NO_INCREMENT);\r
+  \r
+  return status;\r
+}\r
+\r
+\r
+#ifndef MAYUD_NT4\r
+// detour IRP_MJ_POWER\r
+NTSTATUS detourPower(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)\r
+{\r
+  UNREFERENCED_PARAMETER(deviceObject);\r
+  \r
+  PoStartNextPowerIrp(irp);\r
+  irp->IoStatus.Status = STATUS_SUCCESS;\r
+  irp->IoStatus.Information = 0;\r
+  IoCompleteRequest(irp, IO_NO_INCREMENT);\r
+  return STATUS_SUCCESS;\r
+}\r
+#endif // !MAYUD_NT4\r
+\r
+\r
+// filter IRP_MJ_READ\r
+NTSTATUS filterRead(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)\r
+{\r
+  NTSTATUS status;\r
+  PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(irp);\r
+  FilterDeviceExtension *filterDevExt =\r
+    (FilterDeviceExtension*)deviceObject->DeviceExtension;\r
+  DetourDeviceExtension *detourDevExt =\r
+    (DetourDeviceExtension*)filterDevExt->detourDevObj->DeviceExtension;\r
+  KIRQL currentIrql;\r
+  \r
+  KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);\r
+  if (detourDevExt->isOpen && !detourDevExt->wasCleanupInitiated)\r
+    // read from que\r
+  {\r
+    ULONG len = irpSp->Parameters.Read.Length;\r
+    \r
+    KeReleaseSpinLock(&detourDevExt->lock, currentIrql);\r
+    irp->IoStatus.Information = 0;\r
+    KeAcquireSpinLock(&filterDevExt->lock, &currentIrql);\r
+    if (len == 0)\r
+      status = STATUS_SUCCESS;\r
+    else if (len % sizeof(KEYBOARD_INPUT_DATA))\r
+      status = STATUS_BUFFER_TOO_SMALL;\r
+    else\r
+      status = readq(&filterDevExt->readQue, irp);\r
+    KeReleaseSpinLock(&filterDevExt->lock, currentIrql);\r
+    if (status != STATUS_PENDING) {\r
+      irp->IoStatus.Status = status;\r
+      IoCompleteRequest(irp, IO_NO_INCREMENT);\r
+      return status;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    KeReleaseSpinLock(&detourDevExt->lock, currentIrql);\r
+  }\r
+  KeAcquireSpinLock(&filterDevExt->lock, &currentIrql);\r
+  filterDevExt->irpq = irp;\r
+  KeReleaseSpinLock(&filterDevExt->lock, currentIrql);\r
+  \r
+  *IoGetNextIrpStackLocation(irp) = *irpSp;\r
+  IoSetCompletionRoutine(irp, filterReadCompletion, NULL, TRUE, TRUE, TRUE);\r
+  return IoCallDriver(filterDevExt->kbdClassDevObj, irp);\r
+}\r
+\r
+\r
+// pass throught irp to keyboard class driver\r
+NTSTATUS filterPassThrough(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)\r
+{\r
+  FilterDeviceExtension *filterDevExt =\r
+    (FilterDeviceExtension*)deviceObject->DeviceExtension;\r
+\r
+  *IoGetNextIrpStackLocation(irp) = *IoGetCurrentIrpStackLocation(irp);\r
+  IoSetCompletionRoutine(irp, filterGenericCompletion,\r
+                        NULL, TRUE, TRUE, TRUE);\r
+  return IoCallDriver(filterDevExt->kbdClassDevObj, irp);\r
+}\r
+\r
+\r
+#ifndef MAYUD_NT4\r
+// filter IRP_MJ_POWER\r
+NTSTATUS filterPower(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)\r
+{\r
+  FilterDeviceExtension *filterDevExt =\r
+    (FilterDeviceExtension*)deviceObject->DeviceExtension;\r
+\r
+  PoStartNextPowerIrp(irp);\r
+  IoSkipCurrentIrpStackLocation(irp);\r
+  return PoCallDriver(filterDevExt->kbdClassDevObj, irp);\r
+}\r
+#endif // !MAYUD_NT4\r
+NTSTATUS filterPnP(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)\r
+{\r
+  PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(irp);\r
+  FilterDeviceExtension *filterDevExt =\r
+    (FilterDeviceExtension*)deviceObject->DeviceExtension;\r
+  DetourDeviceExtension *detourDevExt =\r
+    (DetourDeviceExtension*)filterDevExt->detourDevObj->DeviceExtension;\r
+  KIRQL currentIrql;\r
+  NTSTATUS status;\r
+  ULONG minor;\r
+  PIRP cancelIrp;\r
+  PDRIVER_OBJECT driverObject = deviceObject->DriverObject;\r
+\r
+  minor = irpSp->MinorFunction;\r
+  IoSkipCurrentIrpStackLocation(irp);\r
+  status = IoCallDriver(filterDevExt->kbdClassDevObj, irp);\r
+  DEBUG_LOG(("filterPnP: minor=%d(%x)", minor, minor));\r
+  switch (minor) {\r
+  case IRP_MN_SURPRISE_REMOVAL:\r
+  case IRP_MN_REMOVE_DEVICE:\r
+    KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);\r
+    if (detourDevExt->filterDevObj == deviceObject) {\r
+      PDEVICE_OBJECT devObj = deviceObject->DriverObject->DeviceObject;\r
+\r
+      DEBUG_LOG(("filterPnP: current filter(%x) was removed", deviceObject));\r
+      detourDevExt->filterDevObj = NULL;\r
+      while (devObj->NextDevice) {\r
+       if (devObj != deviceObject) {\r
+         detourDevExt->filterDevObj = devObj;\r
+         break;\r
+       }\r
+       devObj = devObj->NextDevice;\r
+      }\r
+      DEBUG_LOG(("filterPnP: current filter was changed to %x", detourDevExt->filterDevObj));\r
+    }\r
+    KeReleaseSpinLock(&detourDevExt->lock, currentIrql);\r
+    // detach\r
+    IoDetachDevice(filterDevExt->kbdClassDevObj);\r
+\r
+    KeAcquireSpinLock(&filterDevExt->lock, &currentIrql);\r
+    // TODO: at this point, the irp may be completed (but what can I do for it ?)\r
+    cancelIrp = filterDevExt->irpq;\r
+    KqFinalize(&filterDevExt->readQue);\r
+\r
+    KeReleaseSpinLock(&filterDevExt->lock, currentIrql);\r
+    if (cancelIrp) {\r
+      IoCancelIrp(cancelIrp);\r
+    }\r
+    IoDeleteDevice(deviceObject);\r
+    DEBUG_LOG(("delete filter device: %x", deviceObject));\r
+    DEBUG_LOGChain(driverObject);\r
+    break;\r
+  default:\r
+    break;\r
+  }\r
+  return status;\r
+}\r
+\r
+\r
+#ifdef USE_TOUCHPAD\r
+// \r
+NTSTATUS filterTouchpadCompletion(IN PDEVICE_OBJECT deviceObject,\r
+                                IN PIRP irp, IN PVOID context)\r
+{\r
+  KIRQL currentIrql;\r
+  FilterDeviceExtension *filterDevExt =\r
+    (FilterDeviceExtension*)deviceObject->DeviceExtension;\r
+  PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(irp);\r
+  //PIO_STACK_LOCATION irpSp = IoGetNextIrpStackLocation(irp);\r
+  UCHAR *data = irp->UserBuffer;\r
+  UCHAR pressure;\r
+\r
+  UNREFERENCED_PARAMETER(context);\r
+  \r
+  if (irp->PendingReturned)\r
+    IoMarkIrpPending(irp);\r
+\r
+  if (data)\r
+    pressure = data[TOUCHPAD_PRESSURE_OFFSET];\r
+  else\r
+    pressure = 0;\r
+\r
+  if (data)\r
+  {\r
+    ULONG *p = (ULONG*)data;\r
+    //DEBUG_LOG(("UserBuffer: %2x %2x %2x %2x", data[4], data[5], data[6], data[7]));\r
+    //DEBUG_LOG(("UserBuffer: %x %x %x %x %x %x %x %x", p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]));\r
+  }\r
+  KeAcquireSpinLock(&filterDevExt->lock, &currentIrql);\r
+  if (filterDevExt->isTouched == FALSE && pressure)\r
+  {\r
+    KIRQL currentIrql, cancelIrql;\r
+    PDEVICE_OBJECT detourDevObj = filterDevExt->detourDevObj;\r
+    DetourDeviceExtension *detourDevExt =\r
+      (DetourDeviceExtension*)detourDevObj->DeviceExtension;\r
+    if (detourDevExt->isOpen)\r
+    {\r
+      KEYBOARD_INPUT_DATA PadKey = {0, TOUCHPAD_SCANCODE, 0, 0, 0};\r
+      KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);\r
+      // if detour is opened, key datum are forwarded to detour\r
+      KqEnque(&detourDevExt->readQue, &PadKey, 1);\r
+      detourDevExt->filterDevObj = deviceObject;\r
+\r
+      if (detourDevExt->irpq) {\r
+       if (readq(&detourDevExt->readQue, detourDevExt->irpq) ==\r
+           STATUS_SUCCESS) {\r
+         IoAcquireCancelSpinLock(&cancelIrql);\r
+         IoSetCancelRoutine(detourDevExt->irpq, NULL);\r
+         IoReleaseCancelSpinLock(cancelIrql);\r
+         IoCompleteRequest(detourDevExt->irpq, IO_KEYBOARD_INCREMENT);\r
+         detourDevExt->irpq = NULL;\r
+       }\r
+      }\r
+      KeReleaseSpinLock(&detourDevExt->lock, currentIrql);\r
+    }\r
+    filterDevExt->isTouched = TRUE;\r
+  }\r
+  else\r
+  {\r
+    if (filterDevExt->isTouched == TRUE && pressure == 0)\r
+    {\r
+      KIRQL currentIrql, cancelIrql;\r
+      PDEVICE_OBJECT detourDevObj = filterDevExt->detourDevObj;\r
+      DetourDeviceExtension *detourDevExt =\r
+       (DetourDeviceExtension*)detourDevObj->DeviceExtension;\r
+      if (detourDevExt->isOpen)\r
+      {\r
+       KEYBOARD_INPUT_DATA PadKey = {0, TOUCHPAD_SCANCODE, 1, 0, 0};\r
+       KeAcquireSpinLock(&detourDevExt->lock, &currentIrql);\r
+       // if detour is opened, key datum are forwarded to detour\r
+       KqEnque(&detourDevExt->readQue, &PadKey, 1);\r
+       detourDevExt->filterDevObj = deviceObject;\r
+\r
+       if (detourDevExt->irpq) {\r
+         if (readq(&detourDevExt->readQue, detourDevExt->irpq) ==\r
+             STATUS_SUCCESS) {\r
+           IoAcquireCancelSpinLock(&cancelIrql);\r
+           IoSetCancelRoutine(detourDevExt->irpq, NULL);\r
+           IoReleaseCancelSpinLock(cancelIrql);\r
+           IoCompleteRequest(detourDevExt->irpq, IO_KEYBOARD_INCREMENT);\r
+           detourDevExt->irpq = NULL;\r
+         }\r
+       }\r
+       KeReleaseSpinLock(&detourDevExt->lock, currentIrql);\r
+      }\r
+      filterDevExt->isTouched = FALSE;\r
+    }\r
+  }\r
+  //DEBUG_LOG(("touchpad pressed: out=%u in=%u code=%u status=%x SystemBuffer=%x UserBuffer=%x", irpSp->Parameters.DeviceIoControl.OutputBufferLength, irpSp->Parameters.DeviceIoControl.InputBufferLength, irpSp->Parameters.DeviceIoControl.IoControlCode, irp->IoStatus.Status, irp->AssociatedIrp.SystemBuffer, irp->UserBuffer));\r
+  KeReleaseSpinLock(&filterDevExt->lock, currentIrql);\r
+  return STATUS_SUCCESS;\r
+}\r
+\r
+\r
+// filter touchpad input\r
+NTSTATUS filterTouchpad(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)\r
+{\r
+  FilterDeviceExtension *filterDevExt =\r
+    (FilterDeviceExtension*)deviceObject->DeviceExtension;\r
+\r
+  *IoGetNextIrpStackLocation(irp) = *IoGetCurrentIrpStackLocation(irp);\r
+  IoSetCompletionRoutine(irp, filterTouchpadCompletion,\r
+                        NULL, TRUE, TRUE, TRUE);\r
+  return IoCallDriver(filterDevExt->kbdClassDevObj, irp);\r
+}\r
+#endif\r
+\r
+\r
+NTSTATUS detourPnP(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)\r
+{\r
+  UNREFERENCED_PARAMETER(deviceObject);\r
+\r
+  IoSkipCurrentIrpStackLocation(irp);\r
+  irp->IoStatus.Status = STATUS_SUCCESS;\r
+  irp->IoStatus.Information = 0;\r
+  IoCompleteRequest(irp, IO_NO_INCREMENT);\r
+  return STATUS_SUCCESS;\r
+}\r
index 65de031..6380337 100644 (file)
@@ -1,7 +1,7 @@
-TARGETNAME=    mayudnt4
-TARGETTYPE=    DRIVER
-TARGETPATH=    .
-
-INCLUDES=      $(BASEDIR)\inc;.
-
-SOURCES=       mayudnt4.c ../log.c
+TARGETNAME=    mayudnt4\r
+TARGETTYPE=    DRIVER\r
+TARGETPATH=    .\r
+\r
+INCLUDES=      $(BASEDIR)\inc;.\r
+\r
+SOURCES=       mayudnt4.c ../log.c\r
index 62fab53..c03a6c3 100644 (file)
@@ -1,7 +1,7 @@
-///////////////////////////////////////////////////////////////////////////////
-// Driver for Madotsukai no Yu^utsu for WindowsNT4.0
-
-
-#define MAYUD_NT4
-#include "../mayud.c"
-
+///////////////////////////////////////////////////////////////////////////////\r
+// Driver for Madotsukai no Yu^utsu for WindowsNT4.0\r
+\r
+\r
+#define MAYUD_NT4\r
+#include "../mayud.c"\r
+\r
index 809830b..e75c45c 100755 (executable)
@@ -1,7 +1,7 @@
-TARGETNAME=    mayudrsc
-TARGETTYPE=    DRIVER
-TARGETPATH=    .
-
-INCLUDES=      $(BASEDIR)\inc;.
-
-SOURCES=       mayudrsc.c
+TARGETNAME=    mayudrsc\r
+TARGETTYPE=    DRIVER\r
+TARGETPATH=    .\r
+\r
+INCLUDES=      $(BASEDIR)\inc;.\r
+\r
+SOURCES=       mayudrsc.c\r
index 61bdabd..cab37ed 100755 (executable)
@@ -1,67 +1,67 @@
-///////////////////////////////////////////////////////////////////////////////
-// Rescue driver for Madotsukai no Yu^utsu for Windows2000/XP
-
-
-#include <ntddk.h>
-
-#pragma warning(3 : 4061 4100 4132 4701 4706)
-
-///////////////////////////////////////////////////////////////////////////////
-// Protorypes
-
-
-NTSTATUS DriverEntry       (IN PDRIVER_OBJECT, IN PUNICODE_STRING);
-NTSTATUS mayuAddDevice     (IN PDRIVER_OBJECT, IN PDEVICE_OBJECT);
-VOID mayuUnloadDriver      (IN PDRIVER_OBJECT);
-NTSTATUS mayuGenericDispatch (IN PDEVICE_OBJECT, IN PIRP);
-
-#ifdef ALLOC_PRAGMA
-#pragma alloc_text( init, DriverEntry )
-#endif // ALLOC_PRAGMA
-
-///////////////////////////////////////////////////////////////////////////////
-// Entry / Unload
-
-
-// initialize driver
-NTSTATUS DriverEntry(IN PDRIVER_OBJECT driverObject,
-                    IN PUNICODE_STRING registryPath)
-{
-  ULONG i;
-  UNREFERENCED_PARAMETER(registryPath);
-
-  // set major functions
-  driverObject->DriverUnload = mayuUnloadDriver;
-  driverObject->DriverExtension->AddDevice = mayuAddDevice;
-  for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
-    driverObject->MajorFunction[i] = mayuGenericDispatch;
-  driverObject->MajorFunction[IRP_MJ_PNP] = mayuGenericDispatch;
-  return STATUS_SUCCESS;
-}
-
-NTSTATUS mayuAddDevice(IN PDRIVER_OBJECT driverObject,
-                      IN PDEVICE_OBJECT kbdClassDevObj)
-{
-  UNREFERENCED_PARAMETER(driverObject);
-  UNREFERENCED_PARAMETER(kbdClassDevObj);
-  return STATUS_SUCCESS;
-}
-
-// unload driver
-VOID mayuUnloadDriver(IN PDRIVER_OBJECT driverObject)
-{
-  UNREFERENCED_PARAMETER(driverObject);
-}
-
-
-///////////////////////////////////////////////////////////////////////////////
-// Dispatch Functions
-
-
-// Generic Dispatcher
-NTSTATUS mayuGenericDispatch(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)
-{
-  UNREFERENCED_PARAMETER(deviceObject);
-  UNREFERENCED_PARAMETER(irp);
-  return STATUS_SUCCESS;
-}
+///////////////////////////////////////////////////////////////////////////////\r
+// Rescue driver for Madotsukai no Yu^utsu for Windows2000/XP\r
+\r
+\r
+#include <ntddk.h>\r
+\r
+#pragma warning(3 : 4061 4100 4132 4701 4706)\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Protorypes\r
+\r
+\r
+NTSTATUS DriverEntry       (IN PDRIVER_OBJECT, IN PUNICODE_STRING);\r
+NTSTATUS mayuAddDevice     (IN PDRIVER_OBJECT, IN PDEVICE_OBJECT);\r
+VOID mayuUnloadDriver      (IN PDRIVER_OBJECT);\r
+NTSTATUS mayuGenericDispatch (IN PDEVICE_OBJECT, IN PIRP);\r
+\r
+#ifdef ALLOC_PRAGMA\r
+#pragma alloc_text( init, DriverEntry )\r
+#endif // ALLOC_PRAGMA\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Entry / Unload\r
+\r
+\r
+// initialize driver\r
+NTSTATUS DriverEntry(IN PDRIVER_OBJECT driverObject,\r
+                    IN PUNICODE_STRING registryPath)\r
+{\r
+  ULONG i;\r
+  UNREFERENCED_PARAMETER(registryPath);\r
+\r
+  // set major functions\r
+  driverObject->DriverUnload = mayuUnloadDriver;\r
+  driverObject->DriverExtension->AddDevice = mayuAddDevice;\r
+  for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)\r
+    driverObject->MajorFunction[i] = mayuGenericDispatch;\r
+  driverObject->MajorFunction[IRP_MJ_PNP] = mayuGenericDispatch;\r
+  return STATUS_SUCCESS;\r
+}\r
+\r
+NTSTATUS mayuAddDevice(IN PDRIVER_OBJECT driverObject,\r
+                      IN PDEVICE_OBJECT kbdClassDevObj)\r
+{\r
+  UNREFERENCED_PARAMETER(driverObject);\r
+  UNREFERENCED_PARAMETER(kbdClassDevObj);\r
+  return STATUS_SUCCESS;\r
+}\r
+\r
+// unload driver\r
+VOID mayuUnloadDriver(IN PDRIVER_OBJECT driverObject)\r
+{\r
+  UNREFERENCED_PARAMETER(driverObject);\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Dispatch Functions\r
+\r
+\r
+// Generic Dispatcher\r
+NTSTATUS mayuGenericDispatch(IN PDEVICE_OBJECT deviceObject, IN PIRP irp)\r
+{\r
+  UNREFERENCED_PARAMETER(deviceObject);\r
+  UNREFERENCED_PARAMETER(irp);\r
+  return STATUS_SUCCESS;\r
+}\r
index efdfe6f..323ccfe 100644 (file)
@@ -1,6 +1,6 @@
-REGEDIT4
-
-[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mayud]
-"Type"=dword:00000001
-"Start"=dword:00000003
-"ErrorControl"=dword:00000000
+REGEDIT4\r
+\r
+[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mayud]\r
+"Type"=dword:00000001\r
+"Start"=dword:00000003\r
+"ErrorControl"=dword:00000000\r
index d50d150..429a382 100755 (executable)
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \91\8b\8eg\82¢\82Ì\97J\9fT - default.mayu
-# Copyright (C) 1999-2005, TAGA Nayuta <nayuta@users.sourceforge.net>
-#
-
-if ( !KBD109 ) and ( !KBD104 )
-  include "109.mayu"
-endif
-if ( KBD104 )
-  def alias \81ª = Up
-  def alias \81« = Down
-  def alias \81© = Left
-  def alias \81¨ = Right
-  def alias Yen        = BackSlash
-endif
-
-
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \83L\81[\83V\81[\83P\83\93\83X
-#
-
-keyseq $WindowClose = A-F4
-
-
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# Global \83L\81[\83}\83b\83v
-#
-
-keymap Global
- key *IC-C-Yen         = $ToggleIME            # IME ON/OFF \82ð\82·\82é\83L\81[\82Ì\8ew\92è
- key C-S-M     C-A-M   = Applications          # \83A\83v\83\8a\83P\81[\83V\83\87\83\93\83L\81[
- key C-S-L     C-A-L   = &WindowLower          # \83E\83B\83\93\83h\83E\82ð\88ê\94Ô\89º\82Ö
- key C-S-R     C-A-R   = &WindowRaise          # \83E\83B\83\93\83h\83E\82ð\88ê\94Ô\8fã\82Ö
-# key C-S-R     C-A-R  = &WindowToggleTopMost &Wait(200) &WindowToggleTopMost
- key C-S-Z     C-A-Z   = &WindowMaximize       # \83E\83B\83\93\83h\83E\82Ì\8dÅ\91å\89» (IE\91S\89æ\96Ê)
- key C-S-I     C-A-I   = &WindowMinimize       # \83E\83B\83\93\83h\83E\82Ì\8dÅ\8f¬\89»
- key C-S-X     C-A-X   = &WindowVMaximize      # \83E\83B\83\93\83h\83E\82Ì\8fc\8dÅ\91å\89»
- key C-S-C     C-A-C   = &WindowHMaximize      # \83E\83B\83\93\83h\83E\82Ì\89¡\8dÅ\91å\89»
- key C-S-Left  C-A-Left        = &WindowMove(-16, 0)   # \83E\83B\83\93\83h\83E\82Ì\88Ú\93®
- key C-S-Right C-A-Right= &WindowMove(16, 0)   #       \81V
- key C-S-Up    C-A-Up  = &WindowMove(0, -16)   #       \81V
- key C-S-Down  C-A-Down        = &WindowMove(0, 16)    #       \81V
- key C-S-A-Left                = &WindowMove(-1, 0)    #       \81V
- key C-S-A-Right       = &WindowMove(1, 0)     #       \81V
- key C-S-A-Up          = &WindowMove(0, -1)    #       \81V
- key C-S-A-Down                = &WindowMove(0, 1)     #       \81V
- key W-Left            = &MouseMove(-16, 0)    # \83}\83E\83X\82Ì\88Ú\93®
- key W-Right           = &MouseMove(16, 0)     #       \81V
- key W-Up              = &MouseMove(0, -16)    #       \81V
- key W-Down            = &MouseMove(0, 16)     #       \81V
- key W-A-C-Left                = &MouseMove(-1, 0)     #       \81V
- key W-A-C-Right       = &MouseMove(1, 0)      #       \81V
- key W-A-C-Up          = &MouseMove(0, -1)     #       \81V
- key W-A-C-Down                = &MouseMove(0, 1)      #       \81V
- key C-A-A             = &WindowClingToLeft    # \83E\83B\83\93\83h\83E\82ð\8d\82É\8añ\82¹\82é
- key C-A-E             = &WindowClingToRight   # \83E\83B\83\93\83h\83E\82ð\89E\82É\8añ\82¹\82é
- key C-A-P             = &WindowClingToTop     # \83E\83B\83\93\83h\83E\82ð\8fã\82É\8añ\82¹\82é
- key C-A-N             = &WindowClingToBottom  # \83E\83B\83\93\83h\83E\82ð\89º\82É\8añ\82¹\82é
- key C-A-V             = &WindowMoveVisibly    # \83E\83B\83\93\83h\83E\82ð\8c©\82¦\82é\88Ê\92u\82Ö\88Ú\93®
- key C-S-K     C-A-K   = $WindowClose          # \83E\83B\83\93\83h\83E\82ð\95Â\82\82é
- key C-S-T             = &WindowToggleTopMost  # \8dÅ\91O\96Ê\83g\83O\83\8b
- key C-S-D             = &WindowIdentify &MayuDialog(Log, SHOW)
-                                               # \83E\83B\83\93\83h\83E\82Ì\91f\90«\82ð\92²\82×\82é
- key C-S-H             = &WindowSetAlpha(70)   # \83E\83B\83\93\83h\83E\82Ì\94¼\93§\96¾\89»
- key C-S-A-H           = &WindowSetAlpha(-1)   # \94¼\93§\96¾\89»\91S\82Ä\89ð\8f\9c
- key C-S-U             = &WindowRedraw         # \83E\83B\83\93\83h\83E\82Ì\8dÄ\95`\89æ
- key C-S-S             = &LoadSetting &HelpMessage(Mayu, "\8dÄ\93Ç\8d\9e\8a®\97¹") # \90Ý\92è\83t\83@\83C\83\8b\82Ì\93Ç\82Ý\8d\9e\82Ý
- key C-S-F1            = &InvestigateCommand   # WM_COMMAND \82Ì\92²\8d¸
- if ( ! EmacsMove/ShiftSelection )
-   key C-S-A   C-S-B   = &WindowClingToLeft    # \83E\83B\83\93\83h\83E\82ð\8d\82É\8añ\82¹\82é
-   key C-S-F   C-S-E   = &WindowClingToRight   # \83E\83B\83\93\83h\83E\82ð\89E\82É\8añ\82¹\82é
-   key C-S-P           = &WindowClingToTop     # \83E\83B\83\93\83h\83E\82ð\8fã\82É\8añ\82¹\82é
-   key C-S-N           = &WindowClingToBottom  # \83E\83B\83\93\83h\83E\82ð\89º\82É\8añ\82¹\82é
-   key C-S-V           = &WindowMoveVisibly    # \83E\83B\83\93\83h\83E\82ð\8c©\82¦\82é\88Ê\92u\82Ö\88Ú\93®
- endif
-
- if ( KBD109 ) and ( ! KBD104on109 )
-   key *\94¼\8ap/\91S\8ap      = *Esc                  # Esc \82Æ\94¼\8ap/\91S\8ap\82Ì\93ü\82ê\91Ö\82¦
-   key *E0\94¼\8ap/\91S\8ap    = *Esc                  # Esc \82Æ\94¼\8ap/\91S\8ap\82Ì\93ü\82ê\91Ö\82¦
-   key *Esc            = *\94¼\8ap/\91S\8ap            #       \81V
- endif
-
- if ( KBD109 )
-   mod control += \89p\90\94                         # \89p\90\94\82ð Control \82É
-   key *\89p\90\94           = *LControl             #       \81V
-   mod control += E0\89p\90\94                               # \89p\90\94\82ð Control \82É
-   key *E0\89p\90\94         = *LControl             #       \81V
- else
-   mod control += CapsLock                     # CapsLock \82ð Control \82É
-   key *CapsLock       = *LControl             #       \81V
- endif
-
- if ( GANA )
-   if ( KBD109 )
-     mod alt += !!\96³\95Ï\8a·                       # \96³\95Ï\8a·\82ð Alt \82É
-     key *\96³\95Ï\8a·       = *\96³\95Ï\8a·               #       \81V
-     key A-\96³\95Ï\8a·      = \96³\95Ï\8a·                #       \81V
-     key IC-A-K                = \96³\95Ï\8a·                # IME \82Å\95Ï\8a·\92\86\82Ì A-K \82Í\96³\95Ï\8a·
-     key *IC-\95Ï\8a·      = $ToggleIME            # IME ON/OFF \82ð\82·\82é\83L\81[\82Ì\8ew\92è
-   endif
-   key *ScrollLock     = $CapsLock             # ScrollLock \82ð CapsLock \82É
-   key C-\81ª            = W-\81ª                  # for VD
-   key C-\81«            = W-\81«                  #       \81V
-   key C-\81©            = W-\81©                  #       \81V
-   key C-\81¨            = W-\81¨                  #       \81V
- endif
-
-keymap2 GlobalEscape : Global = &KeymapParent
- event prefixed                = &HelpMessage("Global", "ESC-")
- event before-key-down = &HelpMessage
- key M-C-G             = &Ignore
-
-keymap Global
- if ( MAP-ESCAPE-TO-META )
-   key Escape          = &Prefix(GlobalEscape) &EditNextModifier(M-)
-   if ( KBD109 ) and ( ! KBD104on109 )
-     key \94¼\8ap/\91S\8ap     = &Prefix(GlobalEscape) &EditNextModifier(M-)
-   endif
- endif
-
-
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \91S\82Ä(\82Å\82Í\82È\82¢\82ª\82¾\82¢\82½\82¢)\83f\83t\83H\83\8b\83g\82Ì\83L\81[\83}\83b\83v\82Ì\92è\8b`
-#
-
-keymap KeymapDefault = &Default
- if ( KBD109 )
-   mod control += \89p\90\94                         # \89p\90\94\82ð Control \82É
-   key *\89p\90\94           = *LControl             #       \81V
-   mod control += E0\89p\90\94                               # \89p\90\94\82ð Control \82É
-   key *E0\89p\90\94         = *LControl             #       \81V
- else
-   mod control += CapsLock                     # CapsLock \82ð Control \82É
-   key *CapsLock       = *LControl             #       \81V
- endif
- if ( GANA )
-   if ( KBD109 )
-     mod alt += !!\96³\95Ï\8a·                       # \96³\95Ï\8a·\82ð Alt \82É
-     key *\96³\95Ï\8a·       = *\96³\95Ï\8a·               #       \81V
-     key A-\96³\95Ï\8a·      = \96³\95Ï\8a·                #       \81V
-     key IC-A-K                = \96³\95Ï\8a·                # IME \82Å\95Ï\8a·\92\86\82Ì A-K \82Í\96³\95Ï\8a·
-   endif
- endif
-
-
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \83R\83\93\83g\83\8d\81[\83\8b\82Ì\90Ý\92è
-#
-
-include        "emacsedit.mayu"
-
-window EditControl     /:(Edit|TEdit|RichEdit(20[AW])?)$/ : EmacsEdit
-window SysListView32   /:SysListView32$/ : EmacsMove
-window SysTreeView32   /:SysTreeView32$/ : EmacsMove
-window ComboBox        /:ComboBox(:Edit)?$/ : EmacsEdit
- key M-N M-P           = A-Down                # \83h\83\8d\83b\83v\83_\83E\83\93\83\81\83j\83\85\81[\82ð\8aJ\82­
-
-
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# Windows \82Ì\88ê\94Ê\93I\90Ý\92è
-#
-
- keyseq $WM_VSCROLL/SB_PAGEUP          = &PostMessage(ToItself, 277, 2, 0)
- keyseq $WM_VSCROLL/SB_PAGEDOWN                = &PostMessage(ToItself, 277, 3, 0)
-
-keymap2        GeneralC-X : EmacsC-X
- key C-S               = C-S                   # \8fã\8f\91\82«\95Û\91¶(S)
- key C-W               = LAlt F A              # \96¼\91O\82ð\95t\82¯\82Ä\95Û\91¶(A)...
- key C-F               = C-O                   # \8aJ\82­(O)...
- key K                 = C-N                   # \90V\8bK\8dì\90¬(N)
- key C-C               = LAlt F X              # \8fI\97¹(X)
-# key C-C              = A-Q                   # \8fI\97¹(X)
-# key C-C              = $WindowClose          # \8fI\97¹(X)
-
-
-## \83_\83C\83A\83\8d\83O\83{\83b\83N\83X .........................................................
-
-window DialogBox       /:#32770:/ : Global
- key C-G               = Escape
-
-
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# MDI \8fã\82Ì\83E\83B\83\93\83h\83E\82Ì\90Ý\92è
-#
-
-keymap2 MDI-WindowOperation : Global
- key C-S-L     C-A-L   = &WindowLower(MDI)             # \83E\83B\83\93\83h\83E\82ð\88ê\94Ô\89º\82Ö
- key C-S-R     C-A-R   = &WindowRaise(MDI)             # \83E\83B\83\93\83h\83E\82ð\88ê\94Ô\8fã\82Ö
- key C-S-Z     C-A-Z   = &WindowMaximize(MDI)          # \83E\83B\83\93\83h\83E\82Ì\8dÅ\91å\89»
- key C-S-I     C-A-I   = &WindowMinimize(MDI)          # \83E\83B\83\93\83h\83E\82Ì\8dÅ\8f¬\89»
- key C-S-X     C-A-X   = &WindowVMaximize(MDI)         # \83E\83B\83\93\83h\83E\82Ì\8fc\8dÅ\91å\89»
- key C-S-C     C-A-C   = &WindowHMaximize(MDI)         # \83E\83B\83\93\83h\83E\82Ì\89¡\8dÅ\91å\89»
- key C-S-Left  C-A-Left        = &WindowMove(-16, 0, MDI)      # \83E\83B\83\93\83h\83E\82Ì\88Ú\93®
- key C-S-Right C-A-Right= &WindowMove(16, 0, MDI)      #       \81V
- key C-S-Up    C-A-Up  = &WindowMove(0, -16, MDI)      #       \81V
- key C-S-Down  C-A-Down        = &WindowMove(0, 16, MDI)       #       \81V
- key C-S-A-Left                = &WindowMove(-1, 0, MDI)       #       \81V
- key C-S-A-Right       = &WindowMove(1, 0, MDI)        #       \81V
- key C-S-A-Up          = &WindowMove(0, -1, MDI)       #       \81V
- key C-S-A-Down                = &WindowMove(0, 1, MDI)        #       \81V
- key C-S-A C-S-B C-A-A = &WindowClingToLeft(MDI)       # \83E\83B\83\93\83h\83E\8d\82É\8añ\82¹\82é
- key C-S-E C-S-F C-A-E = &WindowClingToRight(MDI)      # \83E\83B\83\93\83h\83E\89E\82É\8añ\82¹\82é
- key C-S-P     C-A-P   = &WindowClingToTop(MDI)        # \83E\83B\83\93\83h\83E\8fã\82É\8añ\82¹\82é
- key C-S-N     C-A-N   = &WindowClingToBottom(MDI)     # \83E\83B\83\93\83h\83E\89º\82É\8añ\82¹\82é
- key C-S-V     C-A-V   = &WindowMoveVisibly(MDI)       # \83E\83B\83\93\83h\83E\8c©\82¦\82é\88Ê\92u
- key C-S-K     C-A-K   = C-F4                          # \83E\83B\83\93\83h\83E\82ð\95Â\82\82é
-
-window MDI     /:MDIClient:/ : Global
- key C-S-Q     C-A-Q   = &Prefix(MDI-WindowOperation)
-
-
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \8ae\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Ì\90Ý\92è
-#
-
-
-## \91\8b\8eg\82¢\82Ì\97J\9fT ...............................................................
-## http://mayu.sourceforge.net
-
-# \89¼\91z\83L\81[\92²\8d¸\83E\83B\83\93\83h\83E\82Å\82Í\91S\82Ä\83f\83t\83H\83\8b\83g
-window MayuInvestigate /mayu\.exe:#32770:mayuFocus$/ : KeymapDefault
-
-# \83\8d\83O\83E\83B\83\93\83h\83E Esc \82Å\95Â\82\82ç\82ê\82é\82æ\82¤\82É
-window MayuLog ( /mayu\.exe:#32770:Button/ \
-               && /\83\8d\83O - \91\8b\8eg\82¢\82Ì\97J\9fT/ ) : Global
- key C-G               = $WindowClose
- key Esc               = $WindowClose
-
-
-## Console ....................................................................
-
- keyseq $ConsoleWindowClass/copy       = &PostMessage(ToItself, 274, 65520, 0)
- keyseq $ConsoleWindowClass/paste      = &PostMessage(ToItself, 274, 65521, 0)
- keyseq $ConsoleWindowClass/region     = &PostMessage(ToItself, 274, 65522, 0)
- keyseq $ConsoleWindowClass/scroll     = &PostMessage(ToItself, 274, 65523, 0)
- keyseq $ConsoleWindowClass/search     = &PostMessage(ToItself, 274, 65524, 0)
- keyseq $ConsoleWindowClass/select-all = &PostMessage(ToItself, 274, 65525, 0)
-
-window  ConsoleWindowClass /^ConsoleWindowClass$/ : Global
- key C-S-K     C-A-K   = A-Space C             # \83E\83B\83\93\83h\83E\82ð\95Â\82\82é
- key S-Insert          = $ConsoleWindowClass/paste
- key S-Prior           = $WM_VSCROLL/SB_PAGEUP
- key S-Next            = $WM_VSCROLL/SB_PAGEDOWN
- key S-~NL-Num9                = $WM_VSCROLL/SB_PAGEUP
- key S-~NL-Num3                = $WM_VSCROLL/SB_PAGEDOWN
-
-
-## Explorer, Internet Explorer ................................................
-
- keyseq $Explorer/show-folder-bar = &PostMessage(ToMainWindow, 273, 41525, 0)
-
-window ExplorerList /EXPLORER.*:SHELLDLL_DefView:.*SysListView32$/ \
-                       : SysListView32
- key S-R               = F2                    # \96¼\91O\82Ì\95Ï\8dX
- key C-S-Z             = &Sync&WindowMaximize  # \83E\83B\83\93\83h\83E\82Ì\8dÅ\91å\89»
- key C-A-Z             = C-&WindowMaximize     # \83E\83B\83\93\83h\83E\82Ì\91S\89æ\96Ê\89»
- key M-E               = $Explorer/show-folder-bar # \83t\83H\83\8b\83_\82ð\95\\8e¦
-
-window ExplorerTree /EXPLORER.*:BaseBar:.*SysTreeView32$/ : SysTreeView32
- key S-R               = F2                    # \96¼\91O\82Ì\95Ï\8dX
- key C-S-Z             = &Sync&WindowMaximize  # \83E\83B\83\93\83h\83E\82Ì\8dÅ\91å\89»
- key C-A-Z             = C-&WindowMaximize     # \83E\83B\83\93\83h\83E\82Ì\91S\89æ\96Ê\89»
- key M-E               = $Explorer/show-folder-bar # \83t\83H\83\8b\83_\82ð\95\\8e¦
-
-window InternetExplorer /:Internet Explorer_Server$/ : EmacsEdit
- key C-S-Z             = &Sync&WindowMaximize  # \83E\83B\83\93\83h\83E\82Ì\8dÅ\91å\89»
- key C-A-Z             = C-&WindowMaximize     # \83E\83B\83\93\83h\83E\82Ì\91S\89æ\96Ê\89»
-
-window MicrosoftJava   /:Microsoft VM For Java\(TM\) Host Window Class:/ \
-       : EmacsEdit
-
-
-## Emacs ......................................................................
-## http://www.gnu.org/software/emacs/windows/ntemacs.html
-
-keymap Emacsen : Global
- key C-Yen             = &Default
- if ( MAP-ESCAPE-TO-META )                     # ESC \82ª M- \82É\82È\82é\82Ì\82ð\91j\8e~\82·\82é
-   if ( KBD109 ) and ( ! KBD104on109 )
-     key *\94¼\8ap/\91S\8ap    = *Esc
-     key *E0\94¼\8ap/\91S\8ap  = *Esc
-     key *Esc          = *\94¼\8ap/\91S\8ap
-   else
-     key Escape                = &Default
-   endif
- endif
-
-window Meadow  /:Meadow$/ : Emacsen
- key IC-M-X            = $ToggleIME M-X
-window MULE    /:MULE$/ : Emacsen
-window Emacs   /:Emacs$/ : Emacsen
-
-
-## Notepad ....................................................................
-
- keyseq $Notepad/new           = &PostMessage(ToParentWindow, 273, 9, 0)
- keyseq $Notepad/open          = &PostMessage(ToParentWindow, 273, 10, 0)
- keyseq $Notepad/save-as       = &PostMessage(ToParentWindow, 273, 1, 0)
-
-keymap2        NotepadC-X : GeneralC-X
- event prefixed                = &HelpMessage("\83\81\83\82\92  C-x-", \
-       "C-x C-s\t\8fã\8f\91\82«\95Û\91¶\r\n"       \
-       "C-x C-f\t\8aJ\82­\t\r\n"           \
-       "C-x k\t\t\90V\8bK\8dì\90¬\r\n"         \
-       "C-x C-c\t\8fI\97¹")
- event before-key-down = &HelpMessage
- key C-S               = $Notepad/save-as      # \8fã\8f\91\82«\95Û\91¶(S)
- key C-F               = $Notepad/open         # \8aJ\82­(O)...
- key K                 = $Notepad/new          # \90V\8bK\8dì\90¬(N)
- key C-C               = $WindowClose          # \83\81\83\82\92 \82Ì\8fI\97¹(X)
-
-window Notepad /:Notepad:Edit$/ : EmacsEdit
- if ( !ZXCV ) key C-X  = &Prefix(NotepadC-X)
- key C-S               = F3                    # \8c\9f\8dõ(F)...
- key M-J               = C-G                   # \8ds\82Ö\88Ú\93®
-
-
-## ASTEC-X ....................................................................
-## http://www.astec.co.jp/
-
- keyseq $ASTEC-X/copy-to-x     = &PostMessage(ToItself, 274, 16, 0)
-
-window ASTEC-X /:ASTEC-X$/ : Global
- key C-Yen             = &Default
- key *IC-IL-C-Yen      = $ToggleIME            # IME\82ª\83I\83\93\82È\82ç\82ÎIME\82ð\83I\83t
-
-
-## Becky! Internet Mail .......................................................
-## http://www.rimarts.co.jp/index-j.html
-
-window BeckyInternetMail /Rebecca\.exe:BeckyComposeFrameClass:/ : EmacsEdit
- if ( !ZXCV ) key C-X  = &Prefix(GeneralC-X)
-
-window BeckyInternetMail2 /B2\.exe:Becky2ComposeFrame:/ : EmacsEdit
- if ( !ZXCV ) key C-X  = &Prefix(GeneralC-X)
-
-
-## Microsoft Power Point ......................................................
-
-keymap2        PowerPointC-X : GeneralC-X
- key C-C               = $WindowClose          # \8fI\97¹(X)
-
-window PowerPoint /POWERPNT\.EXE:.*:(paneClassDC|REComboBox20W|RichEdit20W)$/\
-                       : EmacsEdit
- if ( !ZXCV ) key C-X  = &Prefix(PowerPointC-X)
-
-window PowerPoint2 /POWERPNT\.EXE:PP9FrameClass.*/ : EmacsEdit
- if ( !ZXCV ) key C-X  = &Prefix(PowerPointC-X)
-
-## Microsoft Visual Basic 6.0 .................................................
-
-window VisualBasic /vb6\.exe:.*:VbaWindow$/ : EmacsEdit
- if ( !ZXCV ) key C-X  = &Prefix(GeneralC-X)
-
-
-## Microsoft Word .............................................................
-
-window MicrosoftWord /WINWORD\.EXE:.*:_WwG$/ : EmacsEdit
- if ( !ZXCV ) key C-X  = &Prefix(GeneralC-X)
-
-
-## Microsoft Excel ............................................................
-
-window MicrosoftExcel /EXCEL\.EXE:XLMAIN:/ : EmacsEdit
- if ( !ZXCV ) key C-X  = &Prefix(GeneralC-X)
-
-
-## Microsoft Pinball ..........................................................
-
-window MSPinball /PINBALL\.EXE:1c7c22a0-9576-11ce-bf80-444553540000$/ : Global
- key A-Enter           = F4
-
-
-## Netscape Navigator .........................................................
-## http://www.netscape.com/
-
-window NetscapeNavigator /Netscape\.exe:/ : Global
- key C-H               = BackSpace             # BackSpace
- key C-S               = C-F                   # \8c\9f\8dõ
-
-
-## Mozilla ....................................................................
-## http://www.mozilla.org/
-
-window Mozilla /:MozillaWindowClass$/ : EmacsEdit
-
-
-## Personal Dictionary ........................................................
-## http://member.nifty.ne.jp/TaN/
-
-window PersonalDictionary /PDICW32\.EXE:PDICW:ComboBox:Edit/ : EmacsEdit
- key C-K               = S-End S-Delete        # \8ds\96\96\82Ü\82Å\8dí\8f\9c
- key C-Y               = S-Insert              # PASTE
-
-
-## Real Player ................................................................
-## http://www.real.com/
-
-window RealPlayer /realplay.exe:PNGUIClass/ : Global
- key A-Enter           = LAlt V Z F
- key C-R               = C-P
-
-
-## TeraTerm ...................................................................
-## http://hp.vector.co.jp/authors/VA002416/
-
-window TeraTerm /TTermPRO\.exe:VTWin32$/ : Global
- key C-Slash           = C-S-HyphenMinus       # C-_ \82ð\93ü\97Í
- key S-Prior           = C-Prior               # \83X\83N\83\8d\81[\83\8b
- key S-Next            = C-Next                # \83X\83N\83\8d\81[\83\8b
- key IC-M-X    IL-M-X  = $ToggleIME M-X        # for emacs
- if ( KBD109 )
-   key C-S-ReverseSolidus = C-S-HyphenMinus    # C-_ \82ð\93ü\97Í
- endif
-
-
-## Waffle .....................................................................
-## http://sakura.tsg.ne.jp/~tjkawa/witalk2/
-## Emacs \95\97\83L\81[\83o\83C\83\93\83f\83B\83\93\83O\82É\82µ\82Ä\82¨\82­\82±\82Æ
-
- keyseq        $WaffleMark/cancel              = Left Right
-
-window Waffle /WITALK2\.EXE:.*:RichEdit(20A)?$/ : Global
-keymap2        WaffleMark : Waffle = $WaffleMark/cancel &KeymapParent
-
-keymap Waffle
- key Home              = &Default              # \95\93ª
- key End               = &Default              # \95\96\96
- key C-Space           = &Prefix(WaffleMark)   # Mark
- key C-A               = &Default              # \8ds\93ª
- key C-B               = &Default              # \81©
- key C-C               = &Default              # (Waffle Prefix)
- key M-B               = &Default              # \81©(\92P\8cê)
- key C-D               = &Default              # \8dí\8f\9c
- key M-D               = &Default              # \8dí\8f\9c(\92P\8cê)
- key C-E               = &Default              # \8ds\96\96
- key C-F               = &Default              # \81¨
- key M-F               = &Default              # \81¨(\92P\8cê)
- key C-G               = &Default              # CANCEL
- key C-H               = &Default              # BS
- key C-J               = &Default              # RETURN
- key C-K               = &Default              # \8ds\96\96\82Ü\82Å\8dí\8f\9c
- key M-L               = &Default              # \8f¬\95\8e\9a
- key C-M               = &Default              # RETURN
- key C-N               = &Default              # \81«
- key C-O               = &Default              # \88ê\8ds\91\9d\82â\82·
- key C-P               = &Default              # \81ª
- key C-Q               = &Prefix(KeymapDefault) # mayu \82É\8d\89E\82³\82ê\82È\82¢\83L\81[\93ü\97Í
- key C-S               = &Default              # \8c\9f\8dõ
- key C-T               = &Default              # \95\8e\9a\93ü\82ê\91Ö\82¦
- key C-V               = Next                  # \8e\9f\95Å (Waffle \82Ì\83o\83O?)
- key M-V               = &Default              # \91O\95Å
- key C-W               = &Default              # CUT
- key M-W               = &Default              # COPY
- key C-Y               = &Default              # PASTE
- key M-U               = &Default              # \91å\95\8e\9a
- key S-Home            = &Default              # \95\93ª(\91I\91ð)
- key S-End             = &Default              # \95\96\96(\91I\91ð)
- key S-M-Comma         = &Default              # \95\93ª
- key S-M-Period                = &Default              # \95\96\96
- key M-BackSpace       = &Default              # BS(\92P\8cê)
- key C-Slash           = &Default              # UNDO
-
-keymap2        WaffleMark
- key Home              = S-C-Home      &Prefix(WaffleMark)     # \95\93ª
- key End               = S-C-End       &Prefix(WaffleMark)     # \95\96\96
- key C-A               = S-Home        &Prefix(WaffleMark)     # \8ds\93ª
- key C-B               = S-Left        &Prefix(WaffleMark)     # \81©
- key M-B               = S-C-Left      &Prefix(WaffleMark)     # \81©(\92P\8cê)
- key C-E               = S-End &Prefix(WaffleMark)             # \8ds\96\96
- key C-F               = S-Right       &Prefix(WaffleMark)     # \81¨
- key M-F               = S-C-Right     &Prefix(WaffleMark)     # \81¨(\92P\8cê)
- key C-G               = $WaffleMark/cancel &Undefined         # \83L\83\83\83\93\83Z\83\8b
- key C-N               = S-Down        &Prefix(WaffleMark)     # \81«
- key C-P               = S-Up          &Prefix(WaffleMark)     # \81ª
- key C-V               = S-Next        &Prefix(WaffleMark)     # \8e\9f\95Å
- key M-V               = S-Prior       &Prefix(WaffleMark)     # \91O\95Å
- key C-W               = C-W Left Right                        # CUT
- key M-W               = M-W Left Right                        # COPY
- key S-M-Comma         = S-C-Home      &Prefix(WaffleMark)     # \95\93ª
- key S-M-Period                = S-C-End       &Prefix(WaffleMark)     # \95\96\96
- key Left              = S-Left        &Prefix(WaffleMark)     # \81©
- key Up                        = S-Up          &Prefix(WaffleMark)     # \81ª
- key Right             = S-Right       &Prefix(WaffleMark)     # \81¨
- key Down              = S-Down        &Prefix(WaffleMark)     # \81«
-
-
-## Xyzzy ......................................................................
-## http://www.jsdlab.co.jp/~kamei/
-
-window Xyzzy /xyzzy\.exe:/ : Global
- key C-S-K     C-A-K   = C-X C-C               # \83E\83B\83\93\83h\83E\82ð\95Â\82\82é
-
-
-## Windows Media Player .......................................................
-
-window WindowsMediaPlayer /mplayer2.*:(Media Player 2|VideoRenderer)/ : Global
- key C-A               = Space         # Play
- key C-R               = Space         # Play
- key C-P               = Space         # Pause
- key C-S               = Period        # Stop
-
-
-## Windows Mine Sweeper .......................................................
-
-window WindowsMineSweeper /winmine.exe:\83}\83C\83\93\83X\83C\81[\83p$/ : Global
- key D-Z               = &VK(RButton)
- key U-Z               = &Ignore
- key D-X               = &VK(MButton)
- key U-X               = &Ignore
- key D-C               = &VK(LButton)
- key U-C               = &Ignore
- key Q                 = F2
- key Num1              = &MouseMove(-16,  16)
- key Num2              = &MouseMove(  0,  16)
- key Num3              = &MouseMove( 16,  16)
- key Num4              = &MouseMove(-16,   0)
- key Num6              = &MouseMove( 16,   0)
- key Num7              = &MouseMove(-16, -16)
- key Num8              = &MouseMove(  0, -16)
- key Num9              = &MouseMove( 16, -16)
-
-
-## ICQ2000 ....................................................................
-## http://web.icq.com/
-
-if ( GANA )
-  window ICQMessageSession \
-       ( /ICQ\.exe:#32770:Edit$/ && /Message Session/ ) : EmacsEdit
-   key Enter           = M-S
-endif
-
-
-## Acrobat Reader .............................................................
-## http://www.adobe.co.jp/support/custsupport/library/acrwin.html
-
-window AcrobatReader /AcroRd32.exe:.*:MDIClient:/ : EmacsMove
- key Space             = PageDown
- key BS                        = PageUp
-
-
-## Edmax ......................................................................
-## http://www.bekkoame.ne.jp/~t.mzaki/
-
-window EdMax-edit /edmax\.exe:.*Afx:400000:b:0:1900010:0$/ : EmacsEdit
-
-
-## VisualBasic ................................................................
-
-window VBTextBox /:ThunderRT6FormDC:(ThunderRT6TextBox|RichTextWndClass)$/ \
-       : EmacsEdit
-
-## StarOffice/StarSuite/OpenOffice ............................................
-
-window StarOffice /soffice\.exe:SALFRAME$/ : EmacsEdit
-
-## Opera ......................................................................
-
-window Opera /Opera\.exe:/ : EmacsEdit
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# \91\8b\8eg\82¢\82Ì\97J\9fT - default.mayu\r
+# Copyright (C) 1999-2005, TAGA Nayuta <nayuta@users.sourceforge.net>\r
+#\r
+\r
+if ( !KBD109 ) and ( !KBD104 )\r
+  include "109.mayu"\r
+endif\r
+if ( KBD104 )\r
+  def alias \81ª = Up\r
+  def alias \81« = Down\r
+  def alias \81© = Left\r
+  def alias \81¨ = Right\r
+  def alias Yen        = BackSlash\r
+endif\r
+\r
+\r
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# \83L\81[\83V\81[\83P\83\93\83X\r
+#\r
+\r
+keyseq $WindowClose = A-F4\r
+\r
+\r
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# Global \83L\81[\83}\83b\83v\r
+#\r
+\r
+keymap Global\r
+ key *IC-C-Yen         = $ToggleIME            # IME ON/OFF \82ð\82·\82é\83L\81[\82Ì\8ew\92è\r
+ key C-S-M     C-A-M   = Applications          # \83A\83v\83\8a\83P\81[\83V\83\87\83\93\83L\81[\r
+ key C-S-L     C-A-L   = &WindowLower          # \83E\83B\83\93\83h\83E\82ð\88ê\94Ô\89º\82Ö\r
+ key C-S-R     C-A-R   = &WindowRaise          # \83E\83B\83\93\83h\83E\82ð\88ê\94Ô\8fã\82Ö\r
+# key C-S-R     C-A-R  = &WindowToggleTopMost &Wait(200) &WindowToggleTopMost\r
+ key C-S-Z     C-A-Z   = &WindowMaximize       # \83E\83B\83\93\83h\83E\82Ì\8dÅ\91å\89» (IE\91S\89æ\96Ê)\r
+ key C-S-I     C-A-I   = &WindowMinimize       # \83E\83B\83\93\83h\83E\82Ì\8dÅ\8f¬\89»\r
+ key C-S-X     C-A-X   = &WindowVMaximize      # \83E\83B\83\93\83h\83E\82Ì\8fc\8dÅ\91å\89»\r
+ key C-S-C     C-A-C   = &WindowHMaximize      # \83E\83B\83\93\83h\83E\82Ì\89¡\8dÅ\91å\89»\r
+ key C-S-Left  C-A-Left        = &WindowMove(-16, 0)   # \83E\83B\83\93\83h\83E\82Ì\88Ú\93®\r
+ key C-S-Right C-A-Right= &WindowMove(16, 0)   #       \81V\r
+ key C-S-Up    C-A-Up  = &WindowMove(0, -16)   #       \81V\r
+ key C-S-Down  C-A-Down        = &WindowMove(0, 16)    #       \81V\r
+ key C-S-A-Left                = &WindowMove(-1, 0)    #       \81V\r
+ key C-S-A-Right       = &WindowMove(1, 0)     #       \81V\r
+ key C-S-A-Up          = &WindowMove(0, -1)    #       \81V\r
+ key C-S-A-Down                = &WindowMove(0, 1)     #       \81V\r
+ key W-Left            = &MouseMove(-16, 0)    # \83}\83E\83X\82Ì\88Ú\93®\r
+ key W-Right           = &MouseMove(16, 0)     #       \81V\r
+ key W-Up              = &MouseMove(0, -16)    #       \81V\r
+ key W-Down            = &MouseMove(0, 16)     #       \81V\r
+ key W-A-C-Left                = &MouseMove(-1, 0)     #       \81V\r
+ key W-A-C-Right       = &MouseMove(1, 0)      #       \81V\r
+ key W-A-C-Up          = &MouseMove(0, -1)     #       \81V\r
+ key W-A-C-Down                = &MouseMove(0, 1)      #       \81V\r
+ key C-A-A             = &WindowClingToLeft    # \83E\83B\83\93\83h\83E\82ð\8d\82É\8añ\82¹\82é\r
+ key C-A-E             = &WindowClingToRight   # \83E\83B\83\93\83h\83E\82ð\89E\82É\8añ\82¹\82é\r
+ key C-A-P             = &WindowClingToTop     # \83E\83B\83\93\83h\83E\82ð\8fã\82É\8añ\82¹\82é\r
+ key C-A-N             = &WindowClingToBottom  # \83E\83B\83\93\83h\83E\82ð\89º\82É\8añ\82¹\82é\r
+ key C-A-V             = &WindowMoveVisibly    # \83E\83B\83\93\83h\83E\82ð\8c©\82¦\82é\88Ê\92u\82Ö\88Ú\93®\r
+ key C-S-K     C-A-K   = $WindowClose          # \83E\83B\83\93\83h\83E\82ð\95Â\82\82é\r
+ key C-S-T             = &WindowToggleTopMost  # \8dÅ\91O\96Ê\83g\83O\83\8b\r
+ key C-S-D             = &WindowIdentify &MayuDialog(Log, SHOW)\r
+                                               # \83E\83B\83\93\83h\83E\82Ì\91f\90«\82ð\92²\82×\82é\r
+ key C-S-H             = &WindowSetAlpha(70)   # \83E\83B\83\93\83h\83E\82Ì\94¼\93§\96¾\89»\r
+ key C-S-A-H           = &WindowSetAlpha(-1)   # \94¼\93§\96¾\89»\91S\82Ä\89ð\8f\9c\r
+ key C-S-U             = &WindowRedraw         # \83E\83B\83\93\83h\83E\82Ì\8dÄ\95`\89æ\r
+ key C-S-S             = &LoadSetting &HelpMessage(Mayu, "\8dÄ\93Ç\8d\9e\8a®\97¹") # \90Ý\92è\83t\83@\83C\83\8b\82Ì\93Ç\82Ý\8d\9e\82Ý\r
+ key C-S-F1            = &InvestigateCommand   # WM_COMMAND \82Ì\92²\8d¸\r
+ if ( ! EmacsMove/ShiftSelection )\r
+   key C-S-A   C-S-B   = &WindowClingToLeft    # \83E\83B\83\93\83h\83E\82ð\8d\82É\8añ\82¹\82é\r
+   key C-S-F   C-S-E   = &WindowClingToRight   # \83E\83B\83\93\83h\83E\82ð\89E\82É\8añ\82¹\82é\r
+   key C-S-P           = &WindowClingToTop     # \83E\83B\83\93\83h\83E\82ð\8fã\82É\8añ\82¹\82é\r
+   key C-S-N           = &WindowClingToBottom  # \83E\83B\83\93\83h\83E\82ð\89º\82É\8añ\82¹\82é\r
+   key C-S-V           = &WindowMoveVisibly    # \83E\83B\83\93\83h\83E\82ð\8c©\82¦\82é\88Ê\92u\82Ö\88Ú\93®\r
+ endif\r
+\r
+ if ( KBD109 ) and ( ! KBD104on109 )\r
+   key *\94¼\8ap/\91S\8ap      = *Esc                  # Esc \82Æ\94¼\8ap/\91S\8ap\82Ì\93ü\82ê\91Ö\82¦\r
+   key *E0\94¼\8ap/\91S\8ap    = *Esc                  # Esc \82Æ\94¼\8ap/\91S\8ap\82Ì\93ü\82ê\91Ö\82¦\r
+   key *Esc            = *\94¼\8ap/\91S\8ap            #       \81V\r
+ endif\r
+\r
+ if ( KBD109 )\r
+   mod control += \89p\90\94                         # \89p\90\94\82ð Control \82É\r
+   key *\89p\90\94           = *LControl             #       \81V\r
+   mod control += E0\89p\90\94                               # \89p\90\94\82ð Control \82É\r
+   key *E0\89p\90\94         = *LControl             #       \81V\r
+ else\r
+   mod control += CapsLock                     # CapsLock \82ð Control \82É\r
+   key *CapsLock       = *LControl             #       \81V\r
+ endif\r
+\r
+ if ( GANA )\r
+   if ( KBD109 )\r
+     mod alt += !!\96³\95Ï\8a·                       # \96³\95Ï\8a·\82ð Alt \82É\r
+     key *\96³\95Ï\8a·       = *\96³\95Ï\8a·               #       \81V\r
+     key A-\96³\95Ï\8a·      = \96³\95Ï\8a·                #       \81V\r
+     key IC-A-K                = \96³\95Ï\8a·                # IME \82Å\95Ï\8a·\92\86\82Ì A-K \82Í\96³\95Ï\8a·\r
+     key *IC-\95Ï\8a·      = $ToggleIME            # IME ON/OFF \82ð\82·\82é\83L\81[\82Ì\8ew\92è\r
+   endif\r
+   key *ScrollLock     = $CapsLock             # ScrollLock \82ð CapsLock \82É\r
+   key C-\81ª            = W-\81ª                  # for VD\r
+   key C-\81«            = W-\81«                  #       \81V\r
+   key C-\81©            = W-\81©                  #       \81V\r
+   key C-\81¨            = W-\81¨                  #       \81V\r
+ endif\r
+\r
+keymap2 GlobalEscape : Global = &KeymapParent\r
+ event prefixed                = &HelpMessage("Global", "ESC-")\r
+ event before-key-down = &HelpMessage\r
+ key M-C-G             = &Ignore\r
+\r
+keymap Global\r
+ if ( MAP-ESCAPE-TO-META )\r
+   key Escape          = &Prefix(GlobalEscape) &EditNextModifier(M-)\r
+   if ( KBD109 ) and ( ! KBD104on109 )\r
+     key \94¼\8ap/\91S\8ap     = &Prefix(GlobalEscape) &EditNextModifier(M-)\r
+   endif\r
+ endif\r
+\r
+\r
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# \91S\82Ä(\82Å\82Í\82È\82¢\82ª\82¾\82¢\82½\82¢)\83f\83t\83H\83\8b\83g\82Ì\83L\81[\83}\83b\83v\82Ì\92è\8b`\r
+#\r
+\r
+keymap KeymapDefault = &Default\r
+ if ( KBD109 )\r
+   mod control += \89p\90\94                         # \89p\90\94\82ð Control \82É\r
+   key *\89p\90\94           = *LControl             #       \81V\r
+   mod control += E0\89p\90\94                               # \89p\90\94\82ð Control \82É\r
+   key *E0\89p\90\94         = *LControl             #       \81V\r
+ else\r
+   mod control += CapsLock                     # CapsLock \82ð Control \82É\r
+   key *CapsLock       = *LControl             #       \81V\r
+ endif\r
+ if ( GANA )\r
+   if ( KBD109 )\r
+     mod alt += !!\96³\95Ï\8a·                       # \96³\95Ï\8a·\82ð Alt \82É\r
+     key *\96³\95Ï\8a·       = *\96³\95Ï\8a·               #       \81V\r
+     key A-\96³\95Ï\8a·      = \96³\95Ï\8a·                #       \81V\r
+     key IC-A-K                = \96³\95Ï\8a·                # IME \82Å\95Ï\8a·\92\86\82Ì A-K \82Í\96³\95Ï\8a·\r
+   endif\r
+ endif\r
+\r
+\r
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# \83R\83\93\83g\83\8d\81[\83\8b\82Ì\90Ý\92è\r
+#\r
+\r
+include        "emacsedit.mayu"\r
+\r
+window EditControl     /:(Edit|TEdit|RichEdit(20[AW])?)$/ : EmacsEdit\r
+window SysListView32   /:SysListView32$/ : EmacsMove\r
+window SysTreeView32   /:SysTreeView32$/ : EmacsMove\r
+window ComboBox        /:ComboBox(:Edit)?$/ : EmacsEdit\r
+ key M-N M-P           = A-Down                # \83h\83\8d\83b\83v\83_\83E\83\93\83\81\83j\83\85\81[\82ð\8aJ\82­\r
+\r
+\r
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# Windows \82Ì\88ê\94Ê\93I\90Ý\92è\r
+#\r
+\r
+ keyseq $WM_VSCROLL/SB_PAGEUP          = &PostMessage(ToItself, 277, 2, 0)\r
+ keyseq $WM_VSCROLL/SB_PAGEDOWN                = &PostMessage(ToItself, 277, 3, 0)\r
+\r
+keymap2        GeneralC-X : EmacsC-X\r
+ key C-S               = C-S                   # \8fã\8f\91\82«\95Û\91¶(S)\r
+ key C-W               = LAlt F A              # \96¼\91O\82ð\95t\82¯\82Ä\95Û\91¶(A)...\r
+ key C-F               = C-O                   # \8aJ\82­(O)...\r
+ key K                 = C-N                   # \90V\8bK\8dì\90¬(N)\r
+ key C-C               = LAlt F X              # \8fI\97¹(X)\r
+# key C-C              = A-Q                   # \8fI\97¹(X)\r
+# key C-C              = $WindowClose          # \8fI\97¹(X)\r
+\r
+\r
+## \83_\83C\83A\83\8d\83O\83{\83b\83N\83X .........................................................\r
+\r
+window DialogBox       /:#32770:/ : Global\r
+ key C-G               = Escape\r
+\r
+\r
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# MDI \8fã\82Ì\83E\83B\83\93\83h\83E\82Ì\90Ý\92è\r
+#\r
+\r
+keymap2 MDI-WindowOperation : Global\r
+ key C-S-L     C-A-L   = &WindowLower(MDI)             # \83E\83B\83\93\83h\83E\82ð\88ê\94Ô\89º\82Ö\r
+ key C-S-R     C-A-R   = &WindowRaise(MDI)             # \83E\83B\83\93\83h\83E\82ð\88ê\94Ô\8fã\82Ö\r
+ key C-S-Z     C-A-Z   = &WindowMaximize(MDI)          # \83E\83B\83\93\83h\83E\82Ì\8dÅ\91å\89»\r
+ key C-S-I     C-A-I   = &WindowMinimize(MDI)          # \83E\83B\83\93\83h\83E\82Ì\8dÅ\8f¬\89»\r
+ key C-S-X     C-A-X   = &WindowVMaximize(MDI)         # \83E\83B\83\93\83h\83E\82Ì\8fc\8dÅ\91å\89»\r
+ key C-S-C     C-A-C   = &WindowHMaximize(MDI)         # \83E\83B\83\93\83h\83E\82Ì\89¡\8dÅ\91å\89»\r
+ key C-S-Left  C-A-Left        = &WindowMove(-16, 0, MDI)      # \83E\83B\83\93\83h\83E\82Ì\88Ú\93®\r
+ key C-S-Right C-A-Right= &WindowMove(16, 0, MDI)      #       \81V\r
+ key C-S-Up    C-A-Up  = &WindowMove(0, -16, MDI)      #       \81V\r
+ key C-S-Down  C-A-Down        = &WindowMove(0, 16, MDI)       #       \81V\r
+ key C-S-A-Left                = &WindowMove(-1, 0, MDI)       #       \81V\r
+ key C-S-A-Right       = &WindowMove(1, 0, MDI)        #       \81V\r
+ key C-S-A-Up          = &WindowMove(0, -1, MDI)       #       \81V\r
+ key C-S-A-Down                = &WindowMove(0, 1, MDI)        #       \81V\r
+ key C-S-A C-S-B C-A-A = &WindowClingToLeft(MDI)       # \83E\83B\83\93\83h\83E\8d\82É\8añ\82¹\82é\r
+ key C-S-E C-S-F C-A-E = &WindowClingToRight(MDI)      # \83E\83B\83\93\83h\83E\89E\82É\8añ\82¹\82é\r
+ key C-S-P     C-A-P   = &WindowClingToTop(MDI)        # \83E\83B\83\93\83h\83E\8fã\82É\8añ\82¹\82é\r
+ key C-S-N     C-A-N   = &WindowClingToBottom(MDI)     # \83E\83B\83\93\83h\83E\89º\82É\8añ\82¹\82é\r
+ key C-S-V     C-A-V   = &WindowMoveVisibly(MDI)       # \83E\83B\83\93\83h\83E\8c©\82¦\82é\88Ê\92u\r
+ key C-S-K     C-A-K   = C-F4                          # \83E\83B\83\93\83h\83E\82ð\95Â\82\82é\r
+\r
+window MDI     /:MDIClient:/ : Global\r
+ key C-S-Q     C-A-Q   = &Prefix(MDI-WindowOperation)\r
+\r
+\r
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# \8ae\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Ì\90Ý\92è\r
+#\r
+\r
+\r
+## \91\8b\8eg\82¢\82Ì\97J\9fT ...............................................................\r
+## http://mayu.sourceforge.net\r
+\r
+# \89¼\91z\83L\81[\92²\8d¸\83E\83B\83\93\83h\83E\82Å\82Í\91S\82Ä\83f\83t\83H\83\8b\83g\r
+window MayuInvestigate /mayu\.exe:#32770:mayuFocus$/ : KeymapDefault\r
+\r
+# \83\8d\83O\83E\83B\83\93\83h\83E Esc \82Å\95Â\82\82ç\82ê\82é\82æ\82¤\82É\r
+window MayuLog ( /mayu\.exe:#32770:Button/ \\r
+               && /\83\8d\83O - \91\8b\8eg\82¢\82Ì\97J\9fT/ ) : Global\r
+ key C-G               = $WindowClose\r
+ key Esc               = $WindowClose\r
+\r
+\r
+## Console ....................................................................\r
+\r
+ keyseq $ConsoleWindowClass/copy       = &PostMessage(ToItself, 274, 65520, 0)\r
+ keyseq $ConsoleWindowClass/paste      = &PostMessage(ToItself, 274, 65521, 0)\r
+ keyseq $ConsoleWindowClass/region     = &PostMessage(ToItself, 274, 65522, 0)\r
+ keyseq $ConsoleWindowClass/scroll     = &PostMessage(ToItself, 274, 65523, 0)\r
+ keyseq $ConsoleWindowClass/search     = &PostMessage(ToItself, 274, 65524, 0)\r
+ keyseq $ConsoleWindowClass/select-all = &PostMessage(ToItself, 274, 65525, 0)\r
+\r
+window  ConsoleWindowClass /^ConsoleWindowClass$/ : Global\r
+ key C-S-K     C-A-K   = A-Space C             # \83E\83B\83\93\83h\83E\82ð\95Â\82\82é\r
+ key S-Insert          = $ConsoleWindowClass/paste\r
+ key S-Prior           = $WM_VSCROLL/SB_PAGEUP\r
+ key S-Next            = $WM_VSCROLL/SB_PAGEDOWN\r
+ key S-~NL-Num9                = $WM_VSCROLL/SB_PAGEUP\r
+ key S-~NL-Num3                = $WM_VSCROLL/SB_PAGEDOWN\r
+\r
+\r
+## Explorer, Internet Explorer ................................................\r
+\r
+ keyseq $Explorer/show-folder-bar = &PostMessage(ToMainWindow, 273, 41525, 0)\r
+\r
+window ExplorerList /EXPLORER.*:SHELLDLL_DefView:.*SysListView32$/ \\r
+                       : SysListView32\r
+ key S-R               = F2                    # \96¼\91O\82Ì\95Ï\8dX\r
+ key C-S-Z             = &Sync&WindowMaximize  # \83E\83B\83\93\83h\83E\82Ì\8dÅ\91å\89»\r
+ key C-A-Z             = C-&WindowMaximize     # \83E\83B\83\93\83h\83E\82Ì\91S\89æ\96Ê\89»\r
+ key M-E               = $Explorer/show-folder-bar # \83t\83H\83\8b\83_\82ð\95\\8e¦\r
+\r
+window ExplorerTree /EXPLORER.*:BaseBar:.*SysTreeView32$/ : SysTreeView32\r
+ key S-R               = F2                    # \96¼\91O\82Ì\95Ï\8dX\r
+ key C-S-Z             = &Sync&WindowMaximize  # \83E\83B\83\93\83h\83E\82Ì\8dÅ\91å\89»\r
+ key C-A-Z             = C-&WindowMaximize     # \83E\83B\83\93\83h\83E\82Ì\91S\89æ\96Ê\89»\r
+ key M-E               = $Explorer/show-folder-bar # \83t\83H\83\8b\83_\82ð\95\\8e¦\r
+\r
+window InternetExplorer /:Internet Explorer_Server$/ : EmacsEdit\r
+ key C-S-Z             = &Sync&WindowMaximize  # \83E\83B\83\93\83h\83E\82Ì\8dÅ\91å\89»\r
+ key C-A-Z             = C-&WindowMaximize     # \83E\83B\83\93\83h\83E\82Ì\91S\89æ\96Ê\89»\r
+\r
+window MicrosoftJava   /:Microsoft VM For Java\(TM\) Host Window Class:/ \\r
+       : EmacsEdit\r
+\r
+\r
+## Emacs ......................................................................\r
+## http://www.gnu.org/software/emacs/windows/ntemacs.html\r
+\r
+keymap Emacsen : Global\r
+ key C-Yen             = &Default\r
+ if ( MAP-ESCAPE-TO-META )                     # ESC \82ª M- \82É\82È\82é\82Ì\82ð\91j\8e~\82·\82é\r
+   if ( KBD109 ) and ( ! KBD104on109 )\r
+     key *\94¼\8ap/\91S\8ap    = *Esc\r
+     key *E0\94¼\8ap/\91S\8ap  = *Esc\r
+     key *Esc          = *\94¼\8ap/\91S\8ap\r
+   else\r
+     key Escape                = &Default\r
+   endif\r
+ endif\r
+\r
+window Meadow  /:Meadow$/ : Emacsen\r
+ key IC-M-X            = $ToggleIME M-X\r
+window MULE    /:MULE$/ : Emacsen\r
+window Emacs   /:Emacs$/ : Emacsen\r
+\r
+\r
+## Notepad ....................................................................\r
+\r
+ keyseq $Notepad/new           = &PostMessage(ToParentWindow, 273, 9, 0)\r
+ keyseq $Notepad/open          = &PostMessage(ToParentWindow, 273, 10, 0)\r
+ keyseq $Notepad/save-as       = &PostMessage(ToParentWindow, 273, 1, 0)\r
+\r
+keymap2        NotepadC-X : GeneralC-X\r
+ event prefixed                = &HelpMessage("\83\81\83\82\92  C-x-", \\r
+       "C-x C-s\t\8fã\8f\91\82«\95Û\91¶\r\n"       \\r
+       "C-x C-f\t\8aJ\82­\t\r\n"           \\r
+       "C-x k\t\t\90V\8bK\8dì\90¬\r\n"         \\r
+       "C-x C-c\t\8fI\97¹")\r
+ event before-key-down = &HelpMessage\r
+ key C-S               = $Notepad/save-as      # \8fã\8f\91\82«\95Û\91¶(S)\r
+ key C-F               = $Notepad/open         # \8aJ\82­(O)...\r
+ key K                 = $Notepad/new          # \90V\8bK\8dì\90¬(N)\r
+ key C-C               = $WindowClose          # \83\81\83\82\92 \82Ì\8fI\97¹(X)\r
+\r
+window Notepad /:Notepad:Edit$/ : EmacsEdit\r
+ if ( !ZXCV ) key C-X  = &Prefix(NotepadC-X)\r
+ key C-S               = F3                    # \8c\9f\8dõ(F)...\r
+ key M-J               = C-G                   # \8ds\82Ö\88Ú\93®\r
+\r
+\r
+## ASTEC-X ....................................................................\r
+## http://www.astec.co.jp/\r
+\r
+ keyseq $ASTEC-X/copy-to-x     = &PostMessage(ToItself, 274, 16, 0)\r
+\r
+window ASTEC-X /:ASTEC-X$/ : Global\r
+ key C-Yen             = &Default\r
+ key *IC-IL-C-Yen      = $ToggleIME            # IME\82ª\83I\83\93\82È\82ç\82ÎIME\82ð\83I\83t\r
+\r
+\r
+## Becky! Internet Mail .......................................................\r
+## http://www.rimarts.co.jp/index-j.html\r
+\r
+window BeckyInternetMail /Rebecca\.exe:BeckyComposeFrameClass:/ : EmacsEdit\r
+ if ( !ZXCV ) key C-X  = &Prefix(GeneralC-X)\r
+\r
+window BeckyInternetMail2 /B2\.exe:Becky2ComposeFrame:/ : EmacsEdit\r
+ if ( !ZXCV ) key C-X  = &Prefix(GeneralC-X)\r
+\r
+\r
+## Microsoft Power Point ......................................................\r
+\r
+keymap2        PowerPointC-X : GeneralC-X\r
+ key C-C               = $WindowClose          # \8fI\97¹(X)\r
+\r
+window PowerPoint /POWERPNT\.EXE:.*:(paneClassDC|REComboBox20W|RichEdit20W)$/\\r
+                       : EmacsEdit\r
+ if ( !ZXCV ) key C-X  = &Prefix(PowerPointC-X)\r
+\r
+window PowerPoint2 /POWERPNT\.EXE:PP9FrameClass.*/ : EmacsEdit\r
+ if ( !ZXCV ) key C-X  = &Prefix(PowerPointC-X)\r
+\r
+## Microsoft Visual Basic 6.0 .................................................\r
+\r
+window VisualBasic /vb6\.exe:.*:VbaWindow$/ : EmacsEdit\r
+ if ( !ZXCV ) key C-X  = &Prefix(GeneralC-X)\r
+\r
+\r
+## Microsoft Word .............................................................\r
+\r
+window MicrosoftWord /WINWORD\.EXE:.*:_WwG$/ : EmacsEdit\r
+ if ( !ZXCV ) key C-X  = &Prefix(GeneralC-X)\r
+\r
+\r
+## Microsoft Excel ............................................................\r
+\r
+window MicrosoftExcel /EXCEL\.EXE:XLMAIN:/ : EmacsEdit\r
+ if ( !ZXCV ) key C-X  = &Prefix(GeneralC-X)\r
+\r
+\r
+## Microsoft Pinball ..........................................................\r
+\r
+window MSPinball /PINBALL\.EXE:1c7c22a0-9576-11ce-bf80-444553540000$/ : Global\r
+ key A-Enter           = F4\r
+\r
+\r
+## Netscape Navigator .........................................................\r
+## http://www.netscape.com/\r
+\r
+window NetscapeNavigator /Netscape\.exe:/ : Global\r
+ key C-H               = BackSpace             # BackSpace\r
+ key C-S               = C-F                   # \8c\9f\8dõ\r
+\r
+\r
+## Mozilla ....................................................................\r
+## http://www.mozilla.org/\r
+\r
+window Mozilla /:MozillaWindowClass$/ : EmacsEdit\r
+\r
+\r
+## Personal Dictionary ........................................................\r
+## http://member.nifty.ne.jp/TaN/\r
+\r
+window PersonalDictionary /PDICW32\.EXE:PDICW:ComboBox:Edit/ : EmacsEdit\r
+ key C-K               = S-End S-Delete        # \8ds\96\96\82Ü\82Å\8dí\8f\9c\r
+ key C-Y               = S-Insert              # PASTE\r
+\r
+\r
+## Real Player ................................................................\r
+## http://www.real.com/\r
+\r
+window RealPlayer /realplay.exe:PNGUIClass/ : Global\r
+ key A-Enter           = LAlt V Z F\r
+ key C-R               = C-P\r
+\r
+\r
+## TeraTerm ...................................................................\r
+## http://hp.vector.co.jp/authors/VA002416/\r
+\r
+window TeraTerm /TTermPRO\.exe:VTWin32$/ : Global\r
+ key C-Slash           = C-S-HyphenMinus       # C-_ \82ð\93ü\97Í\r
+ key S-Prior           = C-Prior               # \83X\83N\83\8d\81[\83\8b\r
+ key S-Next            = C-Next                # \83X\83N\83\8d\81[\83\8b\r
+ key IC-M-X    IL-M-X  = $ToggleIME M-X        # for emacs\r
+ if ( KBD109 )\r
+   key C-S-ReverseSolidus = C-S-HyphenMinus    # C-_ \82ð\93ü\97Í\r
+ endif\r
+\r
+\r
+## Waffle .....................................................................\r
+## http://sakura.tsg.ne.jp/~tjkawa/witalk2/\r
+## Emacs \95\97\83L\81[\83o\83C\83\93\83f\83B\83\93\83O\82É\82µ\82Ä\82¨\82­\82±\82Æ\r
+\r
+ keyseq        $WaffleMark/cancel              = Left Right\r
+\r
+window Waffle /WITALK2\.EXE:.*:RichEdit(20A)?$/ : Global\r
+keymap2        WaffleMark : Waffle = $WaffleMark/cancel &KeymapParent\r
+\r
+keymap Waffle\r
+ key Home              = &Default              # \95\93ª\r
+ key End               = &Default              # \95\96\96\r
+ key C-Space           = &Prefix(WaffleMark)   # Mark\r
+ key C-A               = &Default              # \8ds\93ª\r
+ key C-B               = &Default              # \81©\r
+ key C-C               = &Default              # (Waffle Prefix)\r
+ key M-B               = &Default              # \81©(\92P\8cê)\r
+ key C-D               = &Default              # \8dí\8f\9c\r
+ key M-D               = &Default              # \8dí\8f\9c(\92P\8cê)\r
+ key C-E               = &Default              # \8ds\96\96\r
+ key C-F               = &Default              # \81¨\r
+ key M-F               = &Default              # \81¨(\92P\8cê)\r
+ key C-G               = &Default              # CANCEL\r
+ key C-H               = &Default              # BS\r
+ key C-J               = &Default              # RETURN\r
+ key C-K               = &Default              # \8ds\96\96\82Ü\82Å\8dí\8f\9c\r
+ key M-L               = &Default              # \8f¬\95\8e\9a\r
+ key C-M               = &Default              # RETURN\r
+ key C-N               = &Default              # \81«\r
+ key C-O               = &Default              # \88ê\8ds\91\9d\82â\82·\r
+ key C-P               = &Default              # \81ª\r
+ key C-Q               = &Prefix(KeymapDefault) # mayu \82É\8d\89E\82³\82ê\82È\82¢\83L\81[\93ü\97Í\r
+ key C-S               = &Default              # \8c\9f\8dõ\r
+ key C-T               = &Default              # \95\8e\9a\93ü\82ê\91Ö\82¦\r
+ key C-V               = Next                  # \8e\9f\95Å (Waffle \82Ì\83o\83O?)\r
+ key M-V               = &Default              # \91O\95Å\r
+ key C-W               = &Default              # CUT\r
+ key M-W               = &Default              # COPY\r
+ key C-Y               = &Default              # PASTE\r
+ key M-U               = &Default              # \91å\95\8e\9a\r
+ key S-Home            = &Default              # \95\93ª(\91I\91ð)\r
+ key S-End             = &Default              # \95\96\96(\91I\91ð)\r
+ key S-M-Comma         = &Default              # \95\93ª\r
+ key S-M-Period                = &Default              # \95\96\96\r
+ key M-BackSpace       = &Default              # BS(\92P\8cê)\r
+ key C-Slash           = &Default              # UNDO\r
+\r
+keymap2        WaffleMark\r
+ key Home              = S-C-Home      &Prefix(WaffleMark)     # \95\93ª\r
+ key End               = S-C-End       &Prefix(WaffleMark)     # \95\96\96\r
+ key C-A               = S-Home        &Prefix(WaffleMark)     # \8ds\93ª\r
+ key C-B               = S-Left        &Prefix(WaffleMark)     # \81©\r
+ key M-B               = S-C-Left      &Prefix(WaffleMark)     # \81©(\92P\8cê)\r
+ key C-E               = S-End &Prefix(WaffleMark)             # \8ds\96\96\r
+ key C-F               = S-Right       &Prefix(WaffleMark)     # \81¨\r
+ key M-F               = S-C-Right     &Prefix(WaffleMark)     # \81¨(\92P\8cê)\r
+ key C-G               = $WaffleMark/cancel &Undefined         # \83L\83\83\83\93\83Z\83\8b\r
+ key C-N               = S-Down        &Prefix(WaffleMark)     # \81«\r
+ key C-P               = S-Up          &Prefix(WaffleMark)     # \81ª\r
+ key C-V               = S-Next        &Prefix(WaffleMark)     # \8e\9f\95Å\r
+ key M-V               = S-Prior       &Prefix(WaffleMark)     # \91O\95Å\r
+ key C-W               = C-W Left Right                        # CUT\r
+ key M-W               = M-W Left Right                        # COPY\r
+ key S-M-Comma         = S-C-Home      &Prefix(WaffleMark)     # \95\93ª\r
+ key S-M-Period                = S-C-End       &Prefix(WaffleMark)     # \95\96\96\r
+ key Left              = S-Left        &Prefix(WaffleMark)     # \81©\r
+ key Up                        = S-Up          &Prefix(WaffleMark)     # \81ª\r
+ key Right             = S-Right       &Prefix(WaffleMark)     # \81¨\r
+ key Down              = S-Down        &Prefix(WaffleMark)     # \81«\r
+\r
+\r
+## Xyzzy ......................................................................\r
+## http://www.jsdlab.co.jp/~kamei/\r
+\r
+window Xyzzy /xyzzy\.exe:/ : Global\r
+ key C-S-K     C-A-K   = C-X C-C               # \83E\83B\83\93\83h\83E\82ð\95Â\82\82é\r
+\r
+\r
+## Windows Media Player .......................................................\r
+\r
+window WindowsMediaPlayer /mplayer2.*:(Media Player 2|VideoRenderer)/ : Global\r
+ key C-A               = Space         # Play\r
+ key C-R               = Space         # Play\r
+ key C-P               = Space         # Pause\r
+ key C-S               = Period        # Stop\r
+\r
+\r
+## Windows Mine Sweeper .......................................................\r
+\r
+window WindowsMineSweeper /winmine.exe:\83}\83C\83\93\83X\83C\81[\83p$/ : Global\r
+ key D-Z               = &VK(RButton)\r
+ key U-Z               = &Ignore\r
+ key D-X               = &VK(MButton)\r
+ key U-X               = &Ignore\r
+ key D-C               = &VK(LButton)\r
+ key U-C               = &Ignore\r
+ key Q                 = F2\r
+ key Num1              = &MouseMove(-16,  16)\r
+ key Num2              = &MouseMove(  0,  16)\r
+ key Num3              = &MouseMove( 16,  16)\r
+ key Num4              = &MouseMove(-16,   0)\r
+ key Num6              = &MouseMove( 16,   0)\r
+ key Num7              = &MouseMove(-16, -16)\r
+ key Num8              = &MouseMove(  0, -16)\r
+ key Num9              = &MouseMove( 16, -16)\r
+\r
+\r
+## ICQ2000 ....................................................................\r
+## http://web.icq.com/\r
+\r
+if ( GANA )\r
+  window ICQMessageSession \\r
+       ( /ICQ\.exe:#32770:Edit$/ && /Message Session/ ) : EmacsEdit\r
+   key Enter           = M-S\r
+endif\r
+\r
+\r
+## Acrobat Reader .............................................................\r
+## http://www.adobe.co.jp/support/custsupport/library/acrwin.html\r
+\r
+window AcrobatReader /AcroRd32.exe:.*:MDIClient:/ : EmacsMove\r
+ key Space             = PageDown\r
+ key BS                        = PageUp\r
+\r
+\r
+## Edmax ......................................................................\r
+## http://www.bekkoame.ne.jp/~t.mzaki/\r
+\r
+window EdMax-edit /edmax\.exe:.*Afx:400000:b:0:1900010:0$/ : EmacsEdit\r
+\r
+\r
+## VisualBasic ................................................................\r
+\r
+window VBTextBox /:ThunderRT6FormDC:(ThunderRT6TextBox|RichTextWndClass)$/ \\r
+       : EmacsEdit\r
+\r
+## StarOffice/StarSuite/OpenOffice ............................................\r
+\r
+window StarOffice /soffice\.exe:SALFRAME$/ : EmacsEdit\r
+\r
+## Opera ......................................................................\r
+\r
+window Opera /Opera\.exe:/ : EmacsEdit\r
index 2ee8647..892d11e 100644 (file)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// dlgeditsetting.cpp
-
-
-#include "misc.h"
-#include "mayurc.h"
-#include "windowstool.h"
-#include "dlgeditsetting.h"
-#include "layoutmanager.h"
-#include <windowsx.h>
-
-
-///
-class DlgEditSetting : public LayoutManager
-{
-  HWND m_hwndMayuPathName;                     ///
-  HWND m_hwndMayuPath;                         ///
-  HWND m_hwndSymbols;                          ///
-
-  DlgEditSettingData *m_data;                  ///
-
-public:
-  ///
-  DlgEditSetting(HWND i_hwnd)
-    : LayoutManager(i_hwnd),
-      m_hwndMayuPathName(NULL),
-      m_hwndMayuPath(NULL),
-      m_hwndSymbols(NULL),
-      m_data(NULL)
-  {
-  }
-  
-  /// WM_INITDIALOG
-  BOOL wmInitDialog(HWND /* focus */, LPARAM i_lParam)
-  {
-    m_data = reinterpret_cast<DlgEditSettingData *>(i_lParam);
-    
-    setSmallIcon(m_hwnd, IDI_ICON_mayu);
-    setBigIcon(m_hwnd, IDI_ICON_mayu);
-    
-    CHECK_TRUE( m_hwndMayuPathName
-               = GetDlgItem(m_hwnd, IDC_EDIT_mayuPathName) );
-    CHECK_TRUE( m_hwndMayuPath = GetDlgItem(m_hwnd, IDC_EDIT_mayuPath) );
-    CHECK_TRUE( m_hwndSymbols = GetDlgItem(m_hwnd, IDC_EDIT_symbols) );
-
-    SetWindowText(m_hwndMayuPathName, m_data->m_name.c_str());
-    SetWindowText(m_hwndMayuPath, m_data->m_filename.c_str());
-    SetWindowText(m_hwndSymbols, m_data->m_symbols.c_str());
-    
-    restrictSmallestSize();
-    
-    // set layout manager
-    typedef LayoutManager LM;
-
-    addItem(GetDlgItem(m_hwnd, IDC_STATIC_mayuPathName));
-    addItem(GetDlgItem(m_hwnd, IDC_EDIT_mayuPathName),
-           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE,
-           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_TOP_EDGE);
-    addItem(GetDlgItem(m_hwnd, IDC_STATIC_mayuPathNameComment),
-           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_TOP_EDGE,
-           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_TOP_EDGE);
-
-    addItem(GetDlgItem(m_hwnd, IDC_STATIC_mayuPath));
-    addItem(GetDlgItem(m_hwnd, IDC_EDIT_mayuPath),
-           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE,
-           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_TOP_EDGE);
-    addItem(GetDlgItem(m_hwnd, IDC_BUTTON_browse),
-           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_TOP_EDGE,
-           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_TOP_EDGE);
-
-    addItem(GetDlgItem(m_hwnd, IDC_STATIC_symbols));
-    addItem(GetDlgItem(m_hwnd, IDC_EDIT_symbols),
-           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE,
-           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_TOP_EDGE);
-    addItem(GetDlgItem(m_hwnd, IDC_STATIC_symbolsComment),
-           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_TOP_EDGE,
-           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_TOP_EDGE);
-    
-    addItem(GetDlgItem(m_hwnd, IDOK),
-           LM::ORIGIN_CENTER, LM::ORIGIN_TOP_EDGE,
-           LM::ORIGIN_CENTER, LM::ORIGIN_TOP_EDGE);
-    addItem(GetDlgItem(m_hwnd, IDCANCEL),
-           LM::ORIGIN_CENTER, LM::ORIGIN_TOP_EDGE,
-           LM::ORIGIN_CENTER, LM::ORIGIN_TOP_EDGE);
-
-    restrictSmallestSize(LM::RESTRICT_BOTH);
-    restrictLargestSize(LM::RESTRICT_VERTICALLY);
-    
-    return TRUE;
-  }
-  
-  /// WM_CLOSE
-  BOOL wmClose()
-  {
-    CHECK_TRUE( EndDialog(m_hwnd, 0) );
-    return TRUE;
-  }
-
-  /// WM_COMMAND
-  BOOL wmCommand(int /* i_notify_code */, int i_id, HWND /* i_hwnd_control */)
-  {
-    _TCHAR buf[GANA_MAX_PATH];
-    switch (i_id)
-    {
-      case IDC_BUTTON_browse:
-      {
-       tstring title = loadString(IDS_openMayu);
-       tstring filter = loadString(IDS_openMayuFilter);
-       for (size_t i = 0; i < filter.size(); ++ i)
-         if (filter[i] == _T('|'))
-           filter[i] = _T('\0');
-
-       _tcscpy(buf, _T(".mayu"));
-       OPENFILENAME of;
-       memset(&of, 0, sizeof(of));
-       of.lStructSize = sizeof(of);
-       of.hwndOwner = m_hwnd;
-       of.lpstrFilter = filter.c_str();
-       of.nFilterIndex = 1;
-       of.lpstrFile = buf;
-       of.nMaxFile = NUMBER_OF(buf);
-       of.lpstrTitle = title.c_str();
-       of.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST |
-         OFN_HIDEREADONLY | OFN_PATHMUSTEXIST;
-       if (GetOpenFileName(&of))
-         SetWindowText(m_hwndMayuPath, buf);
-       return TRUE;
-      }
-      
-      case IDOK:
-      {
-       GetWindowText(m_hwndMayuPathName, buf, NUMBER_OF(buf));
-       m_data->m_name = buf;
-       GetWindowText(m_hwndMayuPath, buf, NUMBER_OF(buf));
-       m_data->m_filename = buf;
-       GetWindowText(m_hwndSymbols, buf, NUMBER_OF(buf));
-       m_data->m_symbols = buf;
-       CHECK_TRUE( EndDialog(m_hwnd, 1) );
-       return TRUE;
-      }
-      
-      case IDCANCEL:
-      {
-       CHECK_TRUE( EndDialog(m_hwnd, 0) );
-       return TRUE;
-      }
-    }
-    return FALSE;
-  }
-};
-
-
-//
-#ifdef MAYU64
-INT_PTR CALLBACK dlgEditSetting_dlgProc(HWND i_hwnd, UINT i_message,
-#else
-BOOL CALLBACK dlgEditSetting_dlgProc(HWND i_hwnd, UINT i_message,
-#endif
-                                    WPARAM i_wParam, LPARAM i_lParam)
-{
-  DlgEditSetting *wc;
-  getUserData(i_hwnd, &wc);
-  if (!wc)
-    switch (i_message)
-    {
-      case WM_INITDIALOG:
-       wc = setUserData(i_hwnd, new DlgEditSetting(i_hwnd));
-       return wc->wmInitDialog(
-         reinterpret_cast<HWND>(i_wParam), i_lParam);
-    }
-  else
-    switch (i_message)
-    {
-      case WM_COMMAND:
-       return wc->wmCommand(HIWORD(i_wParam), LOWORD(i_wParam),
-                            reinterpret_cast<HWND>(i_lParam));
-      case WM_CLOSE:
-       return wc->wmClose();
-      case WM_NCDESTROY:
-       delete wc;
-       return TRUE;
-      default:
-       return wc->defaultWMHandler(i_message, i_wParam, i_lParam);
-    }
-  return FALSE;
-}
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// dlgeditsetting.cpp\r
+\r
+\r
+#include "misc.h"\r
+#include "mayurc.h"\r
+#include "windowstool.h"\r
+#include "dlgeditsetting.h"\r
+#include "layoutmanager.h"\r
+#include <windowsx.h>\r
+\r
+\r
+///\r
+class DlgEditSetting : public LayoutManager\r
+{\r
+  HWND m_hwndMayuPathName;                     ///\r
+  HWND m_hwndMayuPath;                         ///\r
+  HWND m_hwndSymbols;                          ///\r
+\r
+  DlgEditSettingData *m_data;                  ///\r
+\r
+public:\r
+  ///\r
+  DlgEditSetting(HWND i_hwnd)\r
+    : LayoutManager(i_hwnd),\r
+      m_hwndMayuPathName(NULL),\r
+      m_hwndMayuPath(NULL),\r
+      m_hwndSymbols(NULL),\r
+      m_data(NULL)\r
+  {\r
+  }\r
+  \r
+  /// WM_INITDIALOG\r
+  BOOL wmInitDialog(HWND /* focus */, LPARAM i_lParam)\r
+  {\r
+    m_data = reinterpret_cast<DlgEditSettingData *>(i_lParam);\r
+    \r
+    setSmallIcon(m_hwnd, IDI_ICON_mayu);\r
+    setBigIcon(m_hwnd, IDI_ICON_mayu);\r
+    \r
+    CHECK_TRUE( m_hwndMayuPathName\r
+               = GetDlgItem(m_hwnd, IDC_EDIT_mayuPathName) );\r
+    CHECK_TRUE( m_hwndMayuPath = GetDlgItem(m_hwnd, IDC_EDIT_mayuPath) );\r
+    CHECK_TRUE( m_hwndSymbols = GetDlgItem(m_hwnd, IDC_EDIT_symbols) );\r
+\r
+    SetWindowText(m_hwndMayuPathName, m_data->m_name.c_str());\r
+    SetWindowText(m_hwndMayuPath, m_data->m_filename.c_str());\r
+    SetWindowText(m_hwndSymbols, m_data->m_symbols.c_str());\r
+    \r
+    restrictSmallestSize();\r
+    \r
+    // set layout manager\r
+    typedef LayoutManager LM;\r
+\r
+    addItem(GetDlgItem(m_hwnd, IDC_STATIC_mayuPathName));\r
+    addItem(GetDlgItem(m_hwnd, IDC_EDIT_mayuPathName),\r
+           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE,\r
+           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_TOP_EDGE);\r
+    addItem(GetDlgItem(m_hwnd, IDC_STATIC_mayuPathNameComment),\r
+           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_TOP_EDGE,\r
+           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_TOP_EDGE);\r
+\r
+    addItem(GetDlgItem(m_hwnd, IDC_STATIC_mayuPath));\r
+    addItem(GetDlgItem(m_hwnd, IDC_EDIT_mayuPath),\r
+           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE,\r
+           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_TOP_EDGE);\r
+    addItem(GetDlgItem(m_hwnd, IDC_BUTTON_browse),\r
+           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_TOP_EDGE,\r
+           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_TOP_EDGE);\r
+\r
+    addItem(GetDlgItem(m_hwnd, IDC_STATIC_symbols));\r
+    addItem(GetDlgItem(m_hwnd, IDC_EDIT_symbols),\r
+           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE,\r
+           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_TOP_EDGE);\r
+    addItem(GetDlgItem(m_hwnd, IDC_STATIC_symbolsComment),\r
+           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_TOP_EDGE,\r
+           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_TOP_EDGE);\r
+    \r
+    addItem(GetDlgItem(m_hwnd, IDOK),\r
+           LM::ORIGIN_CENTER, LM::ORIGIN_TOP_EDGE,\r
+           LM::ORIGIN_CENTER, LM::ORIGIN_TOP_EDGE);\r
+    addItem(GetDlgItem(m_hwnd, IDCANCEL),\r
+           LM::ORIGIN_CENTER, LM::ORIGIN_TOP_EDGE,\r
+           LM::ORIGIN_CENTER, LM::ORIGIN_TOP_EDGE);\r
+\r
+    restrictSmallestSize(LM::RESTRICT_BOTH);\r
+    restrictLargestSize(LM::RESTRICT_VERTICALLY);\r
+    \r
+    return TRUE;\r
+  }\r
+  \r
+  /// WM_CLOSE\r
+  BOOL wmClose()\r
+  {\r
+    CHECK_TRUE( EndDialog(m_hwnd, 0) );\r
+    return TRUE;\r
+  }\r
+\r
+  /// WM_COMMAND\r
+  BOOL wmCommand(int /* i_notify_code */, int i_id, HWND /* i_hwnd_control */)\r
+  {\r
+    _TCHAR buf[GANA_MAX_PATH];\r
+    switch (i_id)\r
+    {\r
+      case IDC_BUTTON_browse:\r
+      {\r
+       tstring title = loadString(IDS_openMayu);\r
+       tstring filter = loadString(IDS_openMayuFilter);\r
+       for (size_t i = 0; i < filter.size(); ++ i)\r
+         if (filter[i] == _T('|'))\r
+           filter[i] = _T('\0');\r
+\r
+       _tcscpy(buf, _T(".mayu"));\r
+       OPENFILENAME of;\r
+       memset(&of, 0, sizeof(of));\r
+       of.lStructSize = sizeof(of);\r
+       of.hwndOwner = m_hwnd;\r
+       of.lpstrFilter = filter.c_str();\r
+       of.nFilterIndex = 1;\r
+       of.lpstrFile = buf;\r
+       of.nMaxFile = NUMBER_OF(buf);\r
+       of.lpstrTitle = title.c_str();\r
+       of.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST |\r
+         OFN_HIDEREADONLY | OFN_PATHMUSTEXIST;\r
+       if (GetOpenFileName(&of))\r
+         SetWindowText(m_hwndMayuPath, buf);\r
+       return TRUE;\r
+      }\r
+      \r
+      case IDOK:\r
+      {\r
+       GetWindowText(m_hwndMayuPathName, buf, NUMBER_OF(buf));\r
+       m_data->m_name = buf;\r
+       GetWindowText(m_hwndMayuPath, buf, NUMBER_OF(buf));\r
+       m_data->m_filename = buf;\r
+       GetWindowText(m_hwndSymbols, buf, NUMBER_OF(buf));\r
+       m_data->m_symbols = buf;\r
+       CHECK_TRUE( EndDialog(m_hwnd, 1) );\r
+       return TRUE;\r
+      }\r
+      \r
+      case IDCANCEL:\r
+      {\r
+       CHECK_TRUE( EndDialog(m_hwnd, 0) );\r
+       return TRUE;\r
+      }\r
+    }\r
+    return FALSE;\r
+  }\r
+};\r
+\r
+\r
+//\r
+#ifdef MAYU64\r
+INT_PTR CALLBACK dlgEditSetting_dlgProc(HWND i_hwnd, UINT i_message,\r
+#else\r
+BOOL CALLBACK dlgEditSetting_dlgProc(HWND i_hwnd, UINT i_message,\r
+#endif\r
+                                    WPARAM i_wParam, LPARAM i_lParam)\r
+{\r
+  DlgEditSetting *wc;\r
+  getUserData(i_hwnd, &wc);\r
+  if (!wc)\r
+    switch (i_message)\r
+    {\r
+      case WM_INITDIALOG:\r
+       wc = setUserData(i_hwnd, new DlgEditSetting(i_hwnd));\r
+       return wc->wmInitDialog(\r
+         reinterpret_cast<HWND>(i_wParam), i_lParam);\r
+    }\r
+  else\r
+    switch (i_message)\r
+    {\r
+      case WM_COMMAND:\r
+       return wc->wmCommand(HIWORD(i_wParam), LOWORD(i_wParam),\r
+                            reinterpret_cast<HWND>(i_lParam));\r
+      case WM_CLOSE:\r
+       return wc->wmClose();\r
+      case WM_NCDESTROY:\r
+       delete wc;\r
+       return TRUE;\r
+      default:\r
+       return wc->defaultWMHandler(i_message, i_wParam, i_lParam);\r
+    }\r
+  return FALSE;\r
+}\r
index 77cf7ad..382e93c 100644 (file)
@@ -1,29 +1,29 @@
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// dlgeditsetting.h
-
-
-#ifndef _DLGEDITSETTING_H
-#  define _DLGEDITSETTING_H
-
-#  include "stringtool.h"
-
-
-/// dialog procedure of "Edit Setting" dialog box
-#ifdef MAYU64
-INT_PTR CALLBACK dlgEditSetting_dlgProc(
-#else
-BOOL CALLBACK dlgEditSetting_dlgProc(
-#endif
-  HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam);
-
-/// parameters for "Edit Setting" dialog box
-class DlgEditSettingData
-{
-public:
-  tstringi m_name;                             /// setting name
-  tstringi m_filename;                         /// filename of setting
-  tstringi m_symbols;          /// symbol list (-Dsymbol1;-Dsymbol2;-D...)
-};
-
-
-#endif // !_DLGEDITSETTING_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// dlgeditsetting.h\r
+\r
+\r
+#ifndef _DLGEDITSETTING_H\r
+#  define _DLGEDITSETTING_H\r
+\r
+#  include "stringtool.h"\r
+\r
+\r
+/// dialog procedure of "Edit Setting" dialog box\r
+#ifdef MAYU64\r
+INT_PTR CALLBACK dlgEditSetting_dlgProc(\r
+#else\r
+BOOL CALLBACK dlgEditSetting_dlgProc(\r
+#endif\r
+  HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam);\r
+\r
+/// parameters for "Edit Setting" dialog box\r
+class DlgEditSettingData\r
+{\r
+public:\r
+  tstringi m_name;                             /// setting name\r
+  tstringi m_filename;                         /// filename of setting\r
+  tstringi m_symbols;          /// symbol list (-Dsymbol1;-Dsymbol2;-D...)\r
+};\r
+\r
+\r
+#endif // !_DLGEDITSETTING_H\r
index 27fed65..4098426 100644 (file)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// dlginvestigate.cpp
-
-
-#include "misc.h"
-#include "engine.h"
-#include "focus.h"
-#include "hook.h"
-#include "mayurc.h"
-#include "stringtool.h"
-#include "target.h"
-#include "windowstool.h"
-#include "vkeytable.h"
-#include "dlginvestigate.h"
-#include <iomanip>
-
-
-///
-class DlgInvestigate
-{
-  HWND m_hwnd;                                 ///
-  UINT m_WM_MAYU_MESSAGE;                      ///
-  DlgInvestigateData m_data;                   /// 
-  
-public:
-  ///
-  DlgInvestigate(HWND i_hwnd)
-    : m_hwnd(i_hwnd),
-      m_WM_MAYU_MESSAGE(RegisterWindowMessage(
-                           addSessionId(WM_MAYU_MESSAGE_NAME).c_str()))
-  {
-    m_data.m_engine = NULL;
-    m_data.m_hwndLog = NULL;
-  }
-  
-  /// WM_INITDIALOG
-  BOOL wmInitDialog(HWND /* i_focus */, LPARAM i_lParam)
-  {
-    m_data = *reinterpret_cast<DlgInvestigateData *>(i_lParam);
-    setSmallIcon(m_hwnd, IDI_ICON_mayu);
-    setBigIcon(m_hwnd, IDI_ICON_mayu);
-    return TRUE;
-  }
-  
-  /// WM_DESTROY
-  BOOL wmDestroy()
-  {
-    unsetSmallIcon(m_hwnd);
-    unsetBigIcon(m_hwnd);
-    return TRUE;
-  }
-  
-  /// WM_CLOSE
-  BOOL wmClose()
-  {
-    ShowWindow(m_hwnd, SW_HIDE);
-    return TRUE;
-  }
-
-  /// WM_COMMAND
-  BOOL wmCommand(int /* i_notifyCode */, int i_id, HWND /* i_hwndControl */)
-  {
-    switch (i_id)
-    {
-      case IDOK:
-      {
-       ShowWindow(m_hwnd, SW_HIDE);
-       return TRUE;
-      }
-    }
-    return FALSE;
-  }
-
-  /// WM_focusNotify
-  BOOL wmFocusNotify(bool i_isFocused, HWND i_hwndFocus)
-  {
-    if (m_data.m_engine &&
-       i_hwndFocus == GetDlgItem(m_hwnd, IDC_CUSTOM_scancode))
-      m_data.m_engine->enableLogMode(i_isFocused);
-    return TRUE;
-  }
-  
-  /// WM_targetNotify
-  BOOL wmTargetNotify(HWND i_hwndTarget)
-  {
-    _TCHAR className[GANA_MAX_ATOM_LENGTH];
-    bool ok = false;
-    if (GetClassName(i_hwndTarget, className, NUMBER_OF(className)))
-    {
-      if (_tcsicmp(className, _T("ConsoleWindowClass")) == 0)
-      {
-       _TCHAR titleName[1024];
-       if (GetWindowText(i_hwndTarget, titleName, NUMBER_OF(titleName)) == 0)
-         titleName[0] = _T('\0');
-       {
-         Acquire a(&m_data.m_engine->m_log, 1);
-         m_data.m_engine->m_log << _T("HWND:\t") << std::hex
-                                << reinterpret_cast<int>(i_hwndTarget)
-                                << std::dec << std::endl;
-       }
-       Acquire a(&m_data.m_engine->m_log, 0);
-       m_data.m_engine->m_log << _T("CLASS:\t") << className << std::endl;
-       m_data.m_engine->m_log << _T("TITLE:\t") << titleName << std::endl;
-       ok = true;
-      }
-    }
-    if (!ok)
-      CHECK_TRUE( PostMessage(i_hwndTarget, m_WM_MAYU_MESSAGE,
-                             MayuMessage_notifyName, 0) );
-    return TRUE;
-  }
-  
-  /// WM_vkeyNotify
-  BOOL wmVkeyNotify(int i_nVirtKey, int /* i_repeatCount */,
-                   BYTE /* i_scanCode */, bool i_isExtended,
-                   bool /* i_isAltDown */, bool i_isKeyup)
-  {
-    Acquire a(&m_data.m_engine->m_log, 0);
-    m_data.m_engine->m_log
-      << (i_isExtended ? _T(" E-") : _T("   "))
-      << _T("0x") << std::hex << std::setw(2) << std::setfill(_T('0'))
-      << i_nVirtKey << std::dec << _T("  &VK( ")
-      << (i_isExtended ? _T("E-") : _T("  "))
-      << (i_isKeyup ? _T("U-") : _T("D-"));
-    
-    for (const VKeyTable *vkt = g_vkeyTable; vkt->m_name; ++ vkt)
-    {
-      if (vkt->m_code == i_nVirtKey)
-      {
-       m_data.m_engine->m_log << vkt->m_name << _T(" )") << std::endl;
-       return TRUE;
-      }
-    }
-    m_data.m_engine->m_log << _T("0x") << std::hex << std::setw(2)
-                          << std::setfill(_T('0')) << i_nVirtKey << std::dec
-                          << _T(" )") << std::endl;
-    return TRUE;
-  }
-
-  BOOL wmMove(int /* i_x */, int /* i_y */)
-  {
-    RECT rc1, rc2;
-    GetWindowRect(m_hwnd, &rc1);
-    GetWindowRect(m_data.m_hwndLog, &rc2);
-    
-    MoveWindow(m_data.m_hwndLog, rc1.left, rc1.bottom,
-              rcWidth(&rc2), rcHeight(&rc2), TRUE);
-    
-    return TRUE;
-  }
-};
-
-
-//
-#ifdef MAYU64
-INT_PTR CALLBACK dlgInvestigate_dlgProc(HWND i_hwnd, UINT i_message,
-#else
-BOOL CALLBACK dlgInvestigate_dlgProc(HWND i_hwnd, UINT i_message,
-#endif
-                                    WPARAM i_wParam, LPARAM i_lParam)
-{
-  DlgInvestigate *wc;
-  getUserData(i_hwnd, &wc);
-  if (!wc)
-    switch (i_message)
-    {
-      case WM_INITDIALOG:
-       wc = setUserData(i_hwnd, new DlgInvestigate(i_hwnd));
-       return wc->wmInitDialog(reinterpret_cast<HWND>(i_wParam), i_lParam);
-    }
-  else
-    switch (i_message)
-    {
-      case WM_MOVE:
-       return wc->wmMove(static_cast<short>(LOWORD(i_lParam)),
-                         static_cast<short>(HIWORD(i_lParam)));
-      case WM_COMMAND:
-       return wc->wmCommand(HIWORD(i_wParam), LOWORD(i_wParam),
-                            reinterpret_cast<HWND>(i_lParam));
-      case WM_CLOSE:
-       return wc->wmClose();
-      case WM_DESTROY:
-       return wc->wmDestroy();
-      case WM_APP_notifyFocus:
-       return wc->wmFocusNotify(!!i_wParam,
-                                reinterpret_cast<HWND>(i_lParam));
-      case WM_APP_targetNotify:
-       return wc->wmTargetNotify(reinterpret_cast<HWND>(i_lParam));
-      case WM_APP_notifyVKey:
-       return wc->wmVkeyNotify(
-         static_cast<int>(i_wParam), static_cast<int>(i_lParam & 0xffff),
-         static_cast<BYTE>((i_lParam >> 16) & 0xff),
-         !!(i_lParam & (1 << 24)),
-         !!(i_lParam & (1 << 29)),
-         !!(i_lParam & (1 << 31)));
-      case WM_NCDESTROY:
-       delete wc;
-       return TRUE;
-    }
-  return FALSE;
-}
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// dlginvestigate.cpp\r
+\r
+\r
+#include "misc.h"\r
+#include "engine.h"\r
+#include "focus.h"\r
+#include "hook.h"\r
+#include "mayurc.h"\r
+#include "stringtool.h"\r
+#include "target.h"\r
+#include "windowstool.h"\r
+#include "vkeytable.h"\r
+#include "dlginvestigate.h"\r
+#include <iomanip>\r
+\r
+\r
+///\r
+class DlgInvestigate\r
+{\r
+  HWND m_hwnd;                                 ///\r
+  UINT m_WM_MAYU_MESSAGE;                      ///\r
+  DlgInvestigateData m_data;                   /// \r
+  \r
+public:\r
+  ///\r
+  DlgInvestigate(HWND i_hwnd)\r
+    : m_hwnd(i_hwnd),\r
+      m_WM_MAYU_MESSAGE(RegisterWindowMessage(\r
+                           addSessionId(WM_MAYU_MESSAGE_NAME).c_str()))\r
+  {\r
+    m_data.m_engine = NULL;\r
+    m_data.m_hwndLog = NULL;\r
+  }\r
+  \r
+  /// WM_INITDIALOG\r
+  BOOL wmInitDialog(HWND /* i_focus */, LPARAM i_lParam)\r
+  {\r
+    m_data = *reinterpret_cast<DlgInvestigateData *>(i_lParam);\r
+    setSmallIcon(m_hwnd, IDI_ICON_mayu);\r
+    setBigIcon(m_hwnd, IDI_ICON_mayu);\r
+    return TRUE;\r
+  }\r
+  \r
+  /// WM_DESTROY\r
+  BOOL wmDestroy()\r
+  {\r
+    unsetSmallIcon(m_hwnd);\r
+    unsetBigIcon(m_hwnd);\r
+    return TRUE;\r
+  }\r
+  \r
+  /// WM_CLOSE\r
+  BOOL wmClose()\r
+  {\r
+    ShowWindow(m_hwnd, SW_HIDE);\r
+    return TRUE;\r
+  }\r
+\r
+  /// WM_COMMAND\r
+  BOOL wmCommand(int /* i_notifyCode */, int i_id, HWND /* i_hwndControl */)\r
+  {\r
+    switch (i_id)\r
+    {\r
+      case IDOK:\r
+      {\r
+       ShowWindow(m_hwnd, SW_HIDE);\r
+       return TRUE;\r
+      }\r
+    }\r
+    return FALSE;\r
+  }\r
+\r
+  /// WM_focusNotify\r
+  BOOL wmFocusNotify(bool i_isFocused, HWND i_hwndFocus)\r
+  {\r
+    if (m_data.m_engine &&\r
+       i_hwndFocus == GetDlgItem(m_hwnd, IDC_CUSTOM_scancode))\r
+      m_data.m_engine->enableLogMode(i_isFocused);\r
+    return TRUE;\r
+  }\r
+  \r
+  /// WM_targetNotify\r
+  BOOL wmTargetNotify(HWND i_hwndTarget)\r
+  {\r
+    _TCHAR className[GANA_MAX_ATOM_LENGTH];\r
+    bool ok = false;\r
+    if (GetClassName(i_hwndTarget, className, NUMBER_OF(className)))\r
+    {\r
+      if (_tcsicmp(className, _T("ConsoleWindowClass")) == 0)\r
+      {\r
+       _TCHAR titleName[1024];\r
+       if (GetWindowText(i_hwndTarget, titleName, NUMBER_OF(titleName)) == 0)\r
+         titleName[0] = _T('\0');\r
+       {\r
+         Acquire a(&m_data.m_engine->m_log, 1);\r
+         m_data.m_engine->m_log << _T("HWND:\t") << std::hex\r
+                                << reinterpret_cast<int>(i_hwndTarget)\r
+                                << std::dec << std::endl;\r
+       }\r
+       Acquire a(&m_data.m_engine->m_log, 0);\r
+       m_data.m_engine->m_log << _T("CLASS:\t") << className << std::endl;\r
+       m_data.m_engine->m_log << _T("TITLE:\t") << titleName << std::endl;\r
+       ok = true;\r
+      }\r
+    }\r
+    if (!ok)\r
+      CHECK_TRUE( PostMessage(i_hwndTarget, m_WM_MAYU_MESSAGE,\r
+                             MayuMessage_notifyName, 0) );\r
+    return TRUE;\r
+  }\r
+  \r
+  /// WM_vkeyNotify\r
+  BOOL wmVkeyNotify(int i_nVirtKey, int /* i_repeatCount */,\r
+                   BYTE /* i_scanCode */, bool i_isExtended,\r
+                   bool /* i_isAltDown */, bool i_isKeyup)\r
+  {\r
+    Acquire a(&m_data.m_engine->m_log, 0);\r
+    m_data.m_engine->m_log\r
+      << (i_isExtended ? _T(" E-") : _T("   "))\r
+      << _T("0x") << std::hex << std::setw(2) << std::setfill(_T('0'))\r
+      << i_nVirtKey << std::dec << _T("  &VK( ")\r
+      << (i_isExtended ? _T("E-") : _T("  "))\r
+      << (i_isKeyup ? _T("U-") : _T("D-"));\r
+    \r
+    for (const VKeyTable *vkt = g_vkeyTable; vkt->m_name; ++ vkt)\r
+    {\r
+      if (vkt->m_code == i_nVirtKey)\r
+      {\r
+       m_data.m_engine->m_log << vkt->m_name << _T(" )") << std::endl;\r
+       return TRUE;\r
+      }\r
+    }\r
+    m_data.m_engine->m_log << _T("0x") << std::hex << std::setw(2)\r
+                          << std::setfill(_T('0')) << i_nVirtKey << std::dec\r
+                          << _T(" )") << std::endl;\r
+    return TRUE;\r
+  }\r
+\r
+  BOOL wmMove(int /* i_x */, int /* i_y */)\r
+  {\r
+    RECT rc1, rc2;\r
+    GetWindowRect(m_hwnd, &rc1);\r
+    GetWindowRect(m_data.m_hwndLog, &rc2);\r
+    \r
+    MoveWindow(m_data.m_hwndLog, rc1.left, rc1.bottom,\r
+              rcWidth(&rc2), rcHeight(&rc2), TRUE);\r
+    \r
+    return TRUE;\r
+  }\r
+};\r
+\r
+\r
+//\r
+#ifdef MAYU64\r
+INT_PTR CALLBACK dlgInvestigate_dlgProc(HWND i_hwnd, UINT i_message,\r
+#else\r
+BOOL CALLBACK dlgInvestigate_dlgProc(HWND i_hwnd, UINT i_message,\r
+#endif\r
+                                    WPARAM i_wParam, LPARAM i_lParam)\r
+{\r
+  DlgInvestigate *wc;\r
+  getUserData(i_hwnd, &wc);\r
+  if (!wc)\r
+    switch (i_message)\r
+    {\r
+      case WM_INITDIALOG:\r
+       wc = setUserData(i_hwnd, new DlgInvestigate(i_hwnd));\r
+       return wc->wmInitDialog(reinterpret_cast<HWND>(i_wParam), i_lParam);\r
+    }\r
+  else\r
+    switch (i_message)\r
+    {\r
+      case WM_MOVE:\r
+       return wc->wmMove(static_cast<short>(LOWORD(i_lParam)),\r
+                         static_cast<short>(HIWORD(i_lParam)));\r
+      case WM_COMMAND:\r
+       return wc->wmCommand(HIWORD(i_wParam), LOWORD(i_wParam),\r
+                            reinterpret_cast<HWND>(i_lParam));\r
+      case WM_CLOSE:\r
+       return wc->wmClose();\r
+      case WM_DESTROY:\r
+       return wc->wmDestroy();\r
+      case WM_APP_notifyFocus:\r
+       return wc->wmFocusNotify(!!i_wParam,\r
+                                reinterpret_cast<HWND>(i_lParam));\r
+      case WM_APP_targetNotify:\r
+       return wc->wmTargetNotify(reinterpret_cast<HWND>(i_lParam));\r
+      case WM_APP_notifyVKey:\r
+       return wc->wmVkeyNotify(\r
+         static_cast<int>(i_wParam), static_cast<int>(i_lParam & 0xffff),\r
+         static_cast<BYTE>((i_lParam >> 16) & 0xff),\r
+         !!(i_lParam & (1 << 24)),\r
+         !!(i_lParam & (1 << 29)),\r
+         !!(i_lParam & (1 << 31)));\r
+      case WM_NCDESTROY:\r
+       delete wc;\r
+       return TRUE;\r
+    }\r
+  return FALSE;\r
+}\r
index 3b04e4d..b02f2de 100644 (file)
@@ -1,30 +1,30 @@
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// dlginvestigate.h
-
-
-#ifndef _DLGINVESTIGATE_H
-#  define _DLGINVESTIGATE_H
-
-#  include <windows.h>
-
-
-/// dialog procedure of "Investigate" dialog box
-#ifdef MAYU64
-INT_PTR CALLBACK dlgInvestigate_dlgProc(
-#else
-BOOL CALLBACK dlgInvestigate_dlgProc(
-#endif
-  HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam);
-
-class Engine;
-
-/// parameters for "Investigate" dialog box
-class DlgInvestigateData
-{
-public:
-  Engine *m_engine;                            /// engine
-  HWND m_hwndLog;                              /// log
-};
-
-
-#endif // !_DLGINVESTIGATE_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// dlginvestigate.h\r
+\r
+\r
+#ifndef _DLGINVESTIGATE_H\r
+#  define _DLGINVESTIGATE_H\r
+\r
+#  include <windows.h>\r
+\r
+\r
+/// dialog procedure of "Investigate" dialog box\r
+#ifdef MAYU64\r
+INT_PTR CALLBACK dlgInvestigate_dlgProc(\r
+#else\r
+BOOL CALLBACK dlgInvestigate_dlgProc(\r
+#endif\r
+  HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam);\r
+\r
+class Engine;\r
+\r
+/// parameters for "Investigate" dialog box\r
+class DlgInvestigateData\r
+{\r
+public:\r
+  Engine *m_engine;                            /// engine\r
+  HWND m_hwndLog;                              /// log\r
+};\r
+\r
+\r
+#endif // !_DLGINVESTIGATE_H\r
index f24e428..f9e5a9d 100644 (file)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// dlglog.cpp
-
-
-#include "misc.h"
-#include "mayu.h"
-#include "mayurc.h"
-#include "registry.h"
-#include "windowstool.h"
-#include "msgstream.h"
-#include "layoutmanager.h"
-#include "dlglog.h"
-#include <windowsx.h>
-
-
-///
-class DlgLog : public LayoutManager
-{
-  HWND m_hwndEdit;                             ///
-  HWND m_hwndTaskTray;                         /// tasktray window
-  LOGFONT m_lf;                                        ///
-  HFONT m_hfontOriginal;                       ///
-  HFONT m_hfont;                               ///
-  tomsgstream *m_log;                          ///
-  
-public:
-  ///
-  DlgLog(HWND i_hwnd)
-    : LayoutManager(i_hwnd),
-      m_hwndEdit(GetDlgItem(m_hwnd, IDC_EDIT_log)),
-      m_hwndTaskTray(NULL),
-      m_hfontOriginal(GetWindowFont(m_hwnd)),
-      m_hfont(NULL)
-  {
-  }
-  
-  /// WM_INITDIALOG
-  BOOL wmInitDialog(HWND /* i_focus */, LPARAM i_lParam)
-  {
-    DlgLogData *dld = reinterpret_cast<DlgLogData *>(i_lParam);
-    m_log = dld->m_log;
-    m_hwndTaskTray = dld->m_hwndTaskTray;
-    
-    // set icons
-    setSmallIcon(m_hwnd, IDI_ICON_mayu);
-    setBigIcon(m_hwnd, IDI_ICON_mayu);
-    
-    // set font
-    Registry::read(MAYU_REGISTRY_ROOT, _T("logFont"), &m_lf,
-                  loadString(IDS_logFont));
-    m_hfont = CreateFontIndirect(&m_lf);
-    SetWindowFont(m_hwndEdit, m_hfont, false);
-    
-    // resize
-    RECT rc;
-    CHECK_TRUE( GetClientRect(m_hwnd, &rc) );
-    wmSize(0, (short)rc.right, (short)rc.bottom);
-
-    // debug level
-    bool isChecked =
-      (IsDlgButtonChecked(m_hwnd, IDC_CHECK_detail) == BST_CHECKED);
-    m_log->setDebugLevel(isChecked ? 1 : 0);
-
-    // set layout manager
-    typedef LayoutManager LM;
-    addItem(GetDlgItem(m_hwnd, IDOK),
-           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_BOTTOM_EDGE,
-           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_BOTTOM_EDGE);
-    addItem(GetDlgItem(m_hwnd, IDC_EDIT_log),
-           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE,
-           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_BOTTOM_EDGE);
-    addItem(GetDlgItem(m_hwnd, IDC_BUTTON_clearLog),
-           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_BOTTOM_EDGE,
-           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_BOTTOM_EDGE);
-    addItem(GetDlgItem(m_hwnd, IDC_BUTTON_changeFont),
-           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_BOTTOM_EDGE,
-           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_BOTTOM_EDGE);
-    addItem(GetDlgItem(m_hwnd, IDC_CHECK_detail),
-           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_BOTTOM_EDGE,
-           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_BOTTOM_EDGE);
-    restrictSmallestSize();
-
-    // enlarge window
-    GetWindowRect(m_hwnd, &rc);
-    rc.bottom += (rc.bottom - rc.top) * 3;
-    MoveWindow(m_hwnd, rc.left, rc.top,
-              rc.right - rc.left, rc.bottom - rc.top, true);
-    return TRUE;
-  }
-
-  /// WM_DESTROY
-  BOOL wmDestroy()
-  {
-    // unset font
-    SetWindowFont(m_hwndEdit, m_hfontOriginal, false);
-    DeleteObject(m_hfont);
-    
-    // unset icons
-    unsetBigIcon(m_hwnd);
-    unsetSmallIcon(m_hwnd);
-    return TRUE;
-  }
-  
-  /// WM_CLOSE
-  BOOL wmClose()
-  {
-    ShowWindow(m_hwnd, SW_HIDE);
-    return TRUE;
-  }
-
-  /// WM_COMMAND
-  BOOL wmCommand(int /* i_notifyCode */, int i_id, HWND /* i_hwndControl */)
-  {
-    switch (i_id)
-    {
-      case IDOK:
-      {
-       ShowWindow(m_hwnd, SW_HIDE);
-       return TRUE;
-      }
-      
-      case IDC_BUTTON_clearLog:
-      {
-       Edit_SetSel(m_hwndEdit, 0, Edit_GetTextLength(m_hwndEdit));
-       Edit_ReplaceSel(m_hwndEdit, _T(""));
-       SendMessage(m_hwndTaskTray, WM_APP_dlglogNotify,
-                   DlgLogNotify_logCleared, 0);
-       return TRUE;
-      }
-      
-      case IDC_BUTTON_changeFont:
-      {
-       CHOOSEFONT cf;
-       memset(&cf, 0, sizeof(cf));
-       cf.lStructSize = sizeof(cf);
-       cf.hwndOwner = m_hwnd;
-       cf.lpLogFont = &m_lf;
-       cf.Flags = CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS;
-       if (ChooseFont(&cf))
-       {
-         HFONT hfontNew = CreateFontIndirect(&m_lf);
-         SetWindowFont(m_hwnd, hfontNew, true);
-         DeleteObject(m_hfont);
-         m_hfont = hfontNew;
-         Registry::write(MAYU_REGISTRY_ROOT, _T("logFont"), m_lf);
-       }
-       return TRUE;
-      }
-      
-      case IDC_CHECK_detail:
-      {
-       bool isChecked =
-         (IsDlgButtonChecked(m_hwnd, IDC_CHECK_detail) == BST_CHECKED);
-       m_log->setDebugLevel(isChecked ? 1 : 0);
-       return TRUE;
-      }
-    }
-    return FALSE;
-  }
-};
-
-
-//
-#ifdef MAYU64
-INT_PTR CALLBACK dlgLog_dlgProc(HWND i_hwnd, UINT i_message,
-#else
-BOOL CALLBACK dlgLog_dlgProc(HWND i_hwnd, UINT i_message,
-#endif
-                            WPARAM i_wParam, LPARAM i_lParam)
-{
-  DlgLog *wc;
-  getUserData(i_hwnd, &wc);
-  if (!wc)
-    switch (i_message)
-    {
-      case WM_INITDIALOG:
-       wc = setUserData(i_hwnd, new DlgLog(i_hwnd));
-       return wc->wmInitDialog(reinterpret_cast<HWND>(i_wParam), i_lParam);
-    }
-  else
-    switch (i_message)
-    {
-      case WM_COMMAND:
-       return wc->wmCommand(HIWORD(i_wParam), LOWORD(i_wParam),
-                            reinterpret_cast<HWND>(i_lParam));
-      case WM_CLOSE:
-       return wc->wmClose();
-      case WM_DESTROY:
-       return wc->wmDestroy();
-      case WM_NCDESTROY:
-       delete wc;
-       return TRUE;
-      default:
-       return wc->defaultWMHandler(i_message, i_wParam, i_lParam);
-    }
-  return FALSE;
-}
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// dlglog.cpp\r
+\r
+\r
+#include "misc.h"\r
+#include "mayu.h"\r
+#include "mayurc.h"\r
+#include "registry.h"\r
+#include "windowstool.h"\r
+#include "msgstream.h"\r
+#include "layoutmanager.h"\r
+#include "dlglog.h"\r
+#include <windowsx.h>\r
+\r
+\r
+///\r
+class DlgLog : public LayoutManager\r
+{\r
+  HWND m_hwndEdit;                             ///\r
+  HWND m_hwndTaskTray;                         /// tasktray window\r
+  LOGFONT m_lf;                                        ///\r
+  HFONT m_hfontOriginal;                       ///\r
+  HFONT m_hfont;                               ///\r
+  tomsgstream *m_log;                          ///\r
+  \r
+public:\r
+  ///\r
+  DlgLog(HWND i_hwnd)\r
+    : LayoutManager(i_hwnd),\r
+      m_hwndEdit(GetDlgItem(m_hwnd, IDC_EDIT_log)),\r
+      m_hwndTaskTray(NULL),\r
+      m_hfontOriginal(GetWindowFont(m_hwnd)),\r
+      m_hfont(NULL)\r
+  {\r
+  }\r
+  \r
+  /// WM_INITDIALOG\r
+  BOOL wmInitDialog(HWND /* i_focus */, LPARAM i_lParam)\r
+  {\r
+    DlgLogData *dld = reinterpret_cast<DlgLogData *>(i_lParam);\r
+    m_log = dld->m_log;\r
+    m_hwndTaskTray = dld->m_hwndTaskTray;\r
+    \r
+    // set icons\r
+    setSmallIcon(m_hwnd, IDI_ICON_mayu);\r
+    setBigIcon(m_hwnd, IDI_ICON_mayu);\r
+    \r
+    // set font\r
+    Registry::read(MAYU_REGISTRY_ROOT, _T("logFont"), &m_lf,\r
+                  loadString(IDS_logFont));\r
+    m_hfont = CreateFontIndirect(&m_lf);\r
+    SetWindowFont(m_hwndEdit, m_hfont, false);\r
+    \r
+    // resize\r
+    RECT rc;\r
+    CHECK_TRUE( GetClientRect(m_hwnd, &rc) );\r
+    wmSize(0, (short)rc.right, (short)rc.bottom);\r
+\r
+    // debug level\r
+    bool isChecked =\r
+      (IsDlgButtonChecked(m_hwnd, IDC_CHECK_detail) == BST_CHECKED);\r
+    m_log->setDebugLevel(isChecked ? 1 : 0);\r
+\r
+    // set layout manager\r
+    typedef LayoutManager LM;\r
+    addItem(GetDlgItem(m_hwnd, IDOK),\r
+           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_BOTTOM_EDGE,\r
+           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_BOTTOM_EDGE);\r
+    addItem(GetDlgItem(m_hwnd, IDC_EDIT_log),\r
+           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE,\r
+           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_BOTTOM_EDGE);\r
+    addItem(GetDlgItem(m_hwnd, IDC_BUTTON_clearLog),\r
+           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_BOTTOM_EDGE,\r
+           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_BOTTOM_EDGE);\r
+    addItem(GetDlgItem(m_hwnd, IDC_BUTTON_changeFont),\r
+           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_BOTTOM_EDGE,\r
+           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_BOTTOM_EDGE);\r
+    addItem(GetDlgItem(m_hwnd, IDC_CHECK_detail),\r
+           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_BOTTOM_EDGE,\r
+           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_BOTTOM_EDGE);\r
+    restrictSmallestSize();\r
+\r
+    // enlarge window\r
+    GetWindowRect(m_hwnd, &rc);\r
+    rc.bottom += (rc.bottom - rc.top) * 3;\r
+    MoveWindow(m_hwnd, rc.left, rc.top,\r
+              rc.right - rc.left, rc.bottom - rc.top, true);\r
+    return TRUE;\r
+  }\r
+\r
+  /// WM_DESTROY\r
+  BOOL wmDestroy()\r
+  {\r
+    // unset font\r
+    SetWindowFont(m_hwndEdit, m_hfontOriginal, false);\r
+    DeleteObject(m_hfont);\r
+    \r
+    // unset icons\r
+    unsetBigIcon(m_hwnd);\r
+    unsetSmallIcon(m_hwnd);\r
+    return TRUE;\r
+  }\r
+  \r
+  /// WM_CLOSE\r
+  BOOL wmClose()\r
+  {\r
+    ShowWindow(m_hwnd, SW_HIDE);\r
+    return TRUE;\r
+  }\r
+\r
+  /// WM_COMMAND\r
+  BOOL wmCommand(int /* i_notifyCode */, int i_id, HWND /* i_hwndControl */)\r
+  {\r
+    switch (i_id)\r
+    {\r
+      case IDOK:\r
+      {\r
+       ShowWindow(m_hwnd, SW_HIDE);\r
+       return TRUE;\r
+      }\r
+      \r
+      case IDC_BUTTON_clearLog:\r
+      {\r
+       Edit_SetSel(m_hwndEdit, 0, Edit_GetTextLength(m_hwndEdit));\r
+       Edit_ReplaceSel(m_hwndEdit, _T(""));\r
+       SendMessage(m_hwndTaskTray, WM_APP_dlglogNotify,\r
+                   DlgLogNotify_logCleared, 0);\r
+       return TRUE;\r
+      }\r
+      \r
+      case IDC_BUTTON_changeFont:\r
+      {\r
+       CHOOSEFONT cf;\r
+       memset(&cf, 0, sizeof(cf));\r
+       cf.lStructSize = sizeof(cf);\r
+       cf.hwndOwner = m_hwnd;\r
+       cf.lpLogFont = &m_lf;\r
+       cf.Flags = CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS;\r
+       if (ChooseFont(&cf))\r
+       {\r
+         HFONT hfontNew = CreateFontIndirect(&m_lf);\r
+         SetWindowFont(m_hwnd, hfontNew, true);\r
+         DeleteObject(m_hfont);\r
+         m_hfont = hfontNew;\r
+         Registry::write(MAYU_REGISTRY_ROOT, _T("logFont"), m_lf);\r
+       }\r
+       return TRUE;\r
+      }\r
+      \r
+      case IDC_CHECK_detail:\r
+      {\r
+       bool isChecked =\r
+         (IsDlgButtonChecked(m_hwnd, IDC_CHECK_detail) == BST_CHECKED);\r
+       m_log->setDebugLevel(isChecked ? 1 : 0);\r
+       return TRUE;\r
+      }\r
+    }\r
+    return FALSE;\r
+  }\r
+};\r
+\r
+\r
+//\r
+#ifdef MAYU64\r
+INT_PTR CALLBACK dlgLog_dlgProc(HWND i_hwnd, UINT i_message,\r
+#else\r
+BOOL CALLBACK dlgLog_dlgProc(HWND i_hwnd, UINT i_message,\r
+#endif\r
+                            WPARAM i_wParam, LPARAM i_lParam)\r
+{\r
+  DlgLog *wc;\r
+  getUserData(i_hwnd, &wc);\r
+  if (!wc)\r
+    switch (i_message)\r
+    {\r
+      case WM_INITDIALOG:\r
+       wc = setUserData(i_hwnd, new DlgLog(i_hwnd));\r
+       return wc->wmInitDialog(reinterpret_cast<HWND>(i_wParam), i_lParam);\r
+    }\r
+  else\r
+    switch (i_message)\r
+    {\r
+      case WM_COMMAND:\r
+       return wc->wmCommand(HIWORD(i_wParam), LOWORD(i_wParam),\r
+                            reinterpret_cast<HWND>(i_lParam));\r
+      case WM_CLOSE:\r
+       return wc->wmClose();\r
+      case WM_DESTROY:\r
+       return wc->wmDestroy();\r
+      case WM_NCDESTROY:\r
+       delete wc;\r
+       return TRUE;\r
+      default:\r
+       return wc->defaultWMHandler(i_message, i_wParam, i_lParam);\r
+    }\r
+  return FALSE;\r
+}\r
index 305eb85..54d8cd9 100644 (file)
--- a/dlglog.h
+++ b/dlglog.h
@@ -1,39 +1,39 @@
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// dlglog.h
-
-
-#ifndef _DLGLOG_H
-#  define _DLGLOG_H
-
-#  include <windows.h>
-#  include "msgstream.h"
-
-
-//
-#ifdef MAYU64
-INT_PTR CALLBACK dlgLog_dlgProc(
-#else
-BOOL CALLBACK dlgLog_dlgProc(
-#endif
-  HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam);
-
-enum
-{
-  ///
-  WM_APP_dlglogNotify = WM_APP + 115,
-};
-
-enum DlgLogNotify
-{
-  DlgLogNotify_logCleared,                     ///
-};
-
-/// parameters for "Investigate" dialog box
-class DlgLogData
-{
-public:
-  tomsgstream *m_log;                          /// log stream
-  HWND m_hwndTaskTray;                         /// tasktray window
-};
-
-#endif // !_DLGLOG_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// dlglog.h\r
+\r
+\r
+#ifndef _DLGLOG_H\r
+#  define _DLGLOG_H\r
+\r
+#  include <windows.h>\r
+#  include "msgstream.h"\r
+\r
+\r
+//\r
+#ifdef MAYU64\r
+INT_PTR CALLBACK dlgLog_dlgProc(\r
+#else\r
+BOOL CALLBACK dlgLog_dlgProc(\r
+#endif\r
+  HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam);\r
+\r
+enum\r
+{\r
+  ///\r
+  WM_APP_dlglogNotify = WM_APP + 115,\r
+};\r
+\r
+enum DlgLogNotify\r
+{\r
+  DlgLogNotify_logCleared,                     ///\r
+};\r
+\r
+/// parameters for "Investigate" dialog box\r
+class DlgLogData\r
+{\r
+public:\r
+  tomsgstream *m_log;                          /// log stream\r
+  HWND m_hwndTaskTray;                         /// tasktray window\r
+};\r
+\r
+#endif // !_DLGLOG_H\r
index 5d4a418..cd99da6 100644 (file)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// dlgsetting.cpp
-
-
-#include "misc.h"
-
-#include "mayu.h"
-#include "mayurc.h"
-#include "registry.h"
-#include "stringtool.h"
-#include "windowstool.h"
-#include "setting.h"
-#include "dlgeditsetting.h"
-#include "layoutmanager.h"
-
-#include <commctrl.h>
-#include <windowsx.h>
-
-
-///
-class DlgSetting : public LayoutManager
-{
-  HWND m_hwndMayuPaths;                                ///
-  
-  ///
-  Registry m_reg;
-
-  typedef DlgEditSettingData Data;             ///
-
-  ///
-  void insertItem(int i_index, const Data &i_data)
-  {
-    LVITEM item;
-    item.mask = LVIF_TEXT;
-    item.iItem = i_index;
-    
-    item.iSubItem = 0;
-    item.pszText = const_cast<_TCHAR *>(i_data.m_name.c_str());
-    CHECK_TRUE( ListView_InsertItem(m_hwndMayuPaths, &item) != -1 );
-
-    ListView_SetItemText(m_hwndMayuPaths, i_index, 1,
-                        const_cast<_TCHAR *>(i_data.m_filename.c_str()));
-    ListView_SetItemText(m_hwndMayuPaths, i_index, 2,
-                        const_cast<_TCHAR *>(i_data.m_symbols.c_str()));
-  }
-  
-  ///
-  void setItem(int i_index, const Data &i_data)
-  {
-    ListView_SetItemText(m_hwndMayuPaths, i_index, 0,
-                        const_cast<_TCHAR *>(i_data.m_name.c_str()));
-    ListView_SetItemText(m_hwndMayuPaths, i_index, 1,
-                        const_cast<_TCHAR *>(i_data.m_filename.c_str()));
-    ListView_SetItemText(m_hwndMayuPaths, i_index, 2,
-                        const_cast<_TCHAR *>(i_data.m_symbols.c_str()));
-  }
-
-  ///
-  void getItem(int i_index, Data *o_data)
-  {
-    _TCHAR buf[GANA_MAX_PATH];
-    LVITEM item;
-    item.mask = LVIF_TEXT;
-    item.iItem = i_index;
-    item.pszText = buf;
-    item.cchTextMax = NUMBER_OF(buf);
-    
-    item.iSubItem = 0;
-    CHECK_TRUE( ListView_GetItem(m_hwndMayuPaths, &item) );
-    o_data->m_name = item.pszText;
-    
-    item.iSubItem = 1;
-    CHECK_TRUE( ListView_GetItem(m_hwndMayuPaths, &item) );
-    o_data->m_filename = item.pszText;
-
-    item.iSubItem = 2;
-    CHECK_TRUE( ListView_GetItem(m_hwndMayuPaths, &item) );
-    o_data->m_symbols = item.pszText;
-  }
-
-  ///
-  void setSelectedItem(int i_index)
-  {
-    ListView_SetItemState(m_hwndMayuPaths, i_index,
-                         LVIS_SELECTED, LVIS_SELECTED);
-  }
-
-  ///
-  int getSelectedItem()
-  {
-    if (ListView_GetSelectedCount(m_hwndMayuPaths) == 0)
-      return -1;
-    for (int i = 0; ; ++ i)
-    {
-      if (ListView_GetItemState(m_hwndMayuPaths, i, LVIS_SELECTED))
-       return i;
-    }
-  }
-
-public:
-  ///
-  DlgSetting(HWND i_hwnd)
-    : LayoutManager(i_hwnd),
-      m_hwndMayuPaths(NULL),
-      m_reg(MAYU_REGISTRY_ROOT)
-  {
-  }
-  
-  /// WM_INITDIALOG
-  BOOL wmInitDialog(HWND /* i_focus */, LPARAM /* i_lParam */)
-  {
-    setSmallIcon(m_hwnd, IDI_ICON_mayu);
-    setBigIcon(m_hwnd, IDI_ICON_mayu);
-    
-    CHECK_TRUE( m_hwndMayuPaths = GetDlgItem(m_hwnd, IDC_LIST_mayuPaths) );
-
-    // create list view colmn
-    RECT rc;
-    GetClientRect(m_hwndMayuPaths, &rc);
-    
-    LVCOLUMN lvc; 
-    lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT; 
-    lvc.fmt = LVCFMT_LEFT; 
-    lvc.cx = (rc.right - rc.left) / 3;
-
-    tstringi str = loadString(IDS_mayuPathName);
-    lvc.pszText = const_cast<_TCHAR *>(str.c_str());
-    CHECK( 0 ==, ListView_InsertColumn(m_hwndMayuPaths, 0, &lvc) );
-    str = loadString(IDS_mayuPath);
-    lvc.pszText = const_cast<_TCHAR *>(str.c_str());
-    CHECK( 1 ==, ListView_InsertColumn(m_hwndMayuPaths, 1, &lvc) );
-    str = loadString(IDS_mayuSymbols);
-    lvc.pszText = const_cast<_TCHAR *>(str.c_str());
-    CHECK( 2 ==, ListView_InsertColumn(m_hwndMayuPaths, 2, &lvc) );
-
-    Data data;
-    insertItem(0, data);                               // TODO: why ?
-    
-    // set list view
-    tregex split(_T("^([^;]*);([^;]*);(.*)$"));
-    tstringi dot_mayu;
-    int i;
-    for (i = 0; i < MAX_MAYU_REGISTRY_ENTRIES; ++ i)
-    {
-      _TCHAR buf[100];
-      _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), i);
-      if (!m_reg.read(buf, &dot_mayu))
-       break;
-
-      tsmatch what;
-      if (boost::regex_match(dot_mayu, what, split))
-      {
-       data.m_name = what.str(1);
-       data.m_filename = what.str(2);
-       data.m_symbols = what.str(3);
-       insertItem(i, data);
-      }
-    }
-
-    CHECK_TRUE( ListView_DeleteItem(m_hwndMayuPaths, i) );     // TODO: why ?
-
-    // arrange list view size
-    ListView_SetColumnWidth(m_hwndMayuPaths, 0, LVSCW_AUTOSIZE);
-    ListView_SetColumnWidth(m_hwndMayuPaths, 1, LVSCW_AUTOSIZE);
-    ListView_SetColumnWidth(m_hwndMayuPaths, 2, LVSCW_AUTOSIZE);
-
-    ListView_SetExtendedListViewStyle(m_hwndMayuPaths, LVS_EX_FULLROWSELECT);
-
-    // set selection
-    int index;
-    m_reg.read(_T(".mayuIndex"), &index, 0);
-    setSelectedItem(index);
-
-    // set layout manager
-    typedef LayoutManager LM;
-    addItem(GetDlgItem(m_hwnd, IDC_STATIC_mayuPaths),
-           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE,
-           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_BOTTOM_EDGE);
-    addItem(GetDlgItem(m_hwnd, IDC_LIST_mayuPaths),
-           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE,
-           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_BOTTOM_EDGE);
-    addItem(GetDlgItem(m_hwnd, IDC_BUTTON_up),
-           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_CENTER,
-           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_CENTER);
-    addItem(GetDlgItem(m_hwnd, IDC_BUTTON_down),
-           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_CENTER,
-           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_CENTER);
-    addItem(GetDlgItem(m_hwnd, IDC_BUTTON_add),
-           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,
-           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);
-    addItem(GetDlgItem(m_hwnd, IDC_BUTTON_edit),
-           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,
-           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);
-    addItem(GetDlgItem(m_hwnd, IDC_BUTTON_delete),
-           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,
-           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);
-    addItem(GetDlgItem(m_hwnd, IDCANCEL),
-           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,
-           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);
-    addItem(GetDlgItem(m_hwnd, IDOK),
-           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,
-           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);
-    restrictSmallestSize();
-    return TRUE;
-  }
-
-  /// WM_CLOSE
-  BOOL wmClose()
-  {
-    EndDialog(m_hwnd, 0);
-    return TRUE;
-  }
-
-  /// WM_NOTIFY
-  BOOL wmNotify(int i_id, NMHDR *i_nmh)
-  {
-    switch (i_id)
-    {
-      case IDC_LIST_mayuPaths:
-       if (i_nmh->code == NM_DBLCLK)
-         FORWARD_WM_COMMAND(m_hwnd, IDC_BUTTON_edit, NULL, 0, SendMessage);
-       return TRUE;
-    }
-    return TRUE;
-  }
-  
-  /// WM_COMMAND
-  BOOL wmCommand(int /* i_notifyCode */, int i_id, HWND /* i_hwndControl */)
-  {
-    _TCHAR buf[GANA_MAX_PATH];
-    switch (i_id)
-    {
-      case IDC_BUTTON_up:
-      case IDC_BUTTON_down:
-      {
-       int count = ListView_GetItemCount(m_hwndMayuPaths);
-       if (count < 2)
-         return TRUE;
-       int index = getSelectedItem();
-       if (index < 0 ||
-           (i_id == IDC_BUTTON_up && index == 0) ||
-           (i_id == IDC_BUTTON_down && index == count - 1))
-         return TRUE;
-
-       int target = (i_id == IDC_BUTTON_up) ? index - 1 : index + 1;
-
-       Data dataIndex, dataTarget;
-       getItem(index, &dataIndex);
-       getItem(target, &dataTarget);
-       setItem(index, dataTarget);
-       setItem(target, dataIndex);
-       
-       setSelectedItem(target);
-       return TRUE;
-      }
-      
-      case IDC_BUTTON_add:
-      {
-       Data data;
-       int index = getSelectedItem();
-       if (0 <= index)
-         getItem(index, &data);
-       if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_editSetting),
-                          m_hwnd, dlgEditSetting_dlgProc, (LPARAM)&data))
-         if (!data.m_name.empty())
-         {
-           insertItem(0, data);
-           setSelectedItem(0);
-         }
-       return TRUE;
-      }
-      
-      case IDC_BUTTON_delete:
-      {
-       int index = getSelectedItem();
-       if (0 <= index)
-       {
-         CHECK_TRUE( ListView_DeleteItem(m_hwndMayuPaths, index) );
-         int count = ListView_GetItemCount(m_hwndMayuPaths);
-         if (count == 0)
-           ;
-         else if (count == index)
-           setSelectedItem(index - 1);
-         else
-           setSelectedItem(index);
-       }
-       return TRUE;
-      }
-      
-      case IDC_BUTTON_edit:
-      {
-       Data data;
-       int index = getSelectedItem();
-       if (index < 0)
-         return TRUE;
-       getItem(index, &data);
-       if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_editSetting),
-                          m_hwnd, dlgEditSetting_dlgProc, (LPARAM)&data))
-       {
-         setItem(index, data);
-         setSelectedItem(index);
-       }
-       return TRUE;
-      }
-      
-      case IDOK:
-      {
-       int count = ListView_GetItemCount(m_hwndMayuPaths);
-       int index;
-       for (index = 0; index < count; ++ index)
-       {
-         _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), index);
-         Data data;
-         getItem(index, &data);
-         m_reg.write(buf, data.m_name + _T(";") +
-                     data.m_filename + _T(";") + data.m_symbols);
-       }
-       for (; ; ++ index)
-       {
-         _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), index);
-         if (!m_reg.remove(buf))
-           break;
-       }
-       index = getSelectedItem();
-       if (index < 0)
-         index = 0;
-       m_reg.write(_T(".mayuIndex"), index);
-       EndDialog(m_hwnd, 1);
-       return TRUE;
-      }
-      
-      case IDCANCEL:
-      {
-       CHECK_TRUE( EndDialog(m_hwnd, 0) );
-       return TRUE;
-      }
-    }
-    return FALSE;
-  }
-};
-
-
-//
-#ifdef MAYU64
-INT_PTR CALLBACK dlgSetting_dlgProc(
-#else
-BOOL CALLBACK dlgSetting_dlgProc(
-#endif
-  HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam)
-{
-  DlgSetting *wc;
-  getUserData(i_hwnd, &wc);
-  if (!wc)
-    switch (i_message)
-    {
-      case WM_INITDIALOG:
-       wc = setUserData(i_hwnd, new DlgSetting(i_hwnd));
-       return wc->wmInitDialog(reinterpret_cast<HWND>(i_wParam), i_lParam);
-    }
-  else
-    switch (i_message)
-    {
-      case WM_COMMAND:
-       return wc->wmCommand(HIWORD(i_wParam), LOWORD(i_wParam),
-                            reinterpret_cast<HWND>(i_lParam));
-      case WM_CLOSE:
-       return wc->wmClose();
-      case WM_NCDESTROY:
-       delete wc;
-       return TRUE;
-      case WM_NOTIFY:
-       return wc->wmNotify(static_cast<int>(i_wParam),
-                           reinterpret_cast<NMHDR *>(i_lParam));
-      default:
-       return wc->defaultWMHandler(i_message, i_wParam, i_lParam);
-    }
-  return FALSE;
-}
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// dlgsetting.cpp\r
+\r
+\r
+#include "misc.h"\r
+\r
+#include "mayu.h"\r
+#include "mayurc.h"\r
+#include "registry.h"\r
+#include "stringtool.h"\r
+#include "windowstool.h"\r
+#include "setting.h"\r
+#include "dlgeditsetting.h"\r
+#include "layoutmanager.h"\r
+\r
+#include <commctrl.h>\r
+#include <windowsx.h>\r
+\r
+\r
+///\r
+class DlgSetting : public LayoutManager\r
+{\r
+  HWND m_hwndMayuPaths;                                ///\r
+  \r
+  ///\r
+  Registry m_reg;\r
+\r
+  typedef DlgEditSettingData Data;             ///\r
+\r
+  ///\r
+  void insertItem(int i_index, const Data &i_data)\r
+  {\r
+    LVITEM item;\r
+    item.mask = LVIF_TEXT;\r
+    item.iItem = i_index;\r
+    \r
+    item.iSubItem = 0;\r
+    item.pszText = const_cast<_TCHAR *>(i_data.m_name.c_str());\r
+    CHECK_TRUE( ListView_InsertItem(m_hwndMayuPaths, &item) != -1 );\r
+\r
+    ListView_SetItemText(m_hwndMayuPaths, i_index, 1,\r
+                        const_cast<_TCHAR *>(i_data.m_filename.c_str()));\r
+    ListView_SetItemText(m_hwndMayuPaths, i_index, 2,\r
+                        const_cast<_TCHAR *>(i_data.m_symbols.c_str()));\r
+  }\r
+  \r
+  ///\r
+  void setItem(int i_index, const Data &i_data)\r
+  {\r
+    ListView_SetItemText(m_hwndMayuPaths, i_index, 0,\r
+                        const_cast<_TCHAR *>(i_data.m_name.c_str()));\r
+    ListView_SetItemText(m_hwndMayuPaths, i_index, 1,\r
+                        const_cast<_TCHAR *>(i_data.m_filename.c_str()));\r
+    ListView_SetItemText(m_hwndMayuPaths, i_index, 2,\r
+                        const_cast<_TCHAR *>(i_data.m_symbols.c_str()));\r
+  }\r
+\r
+  ///\r
+  void getItem(int i_index, Data *o_data)\r
+  {\r
+    _TCHAR buf[GANA_MAX_PATH];\r
+    LVITEM item;\r
+    item.mask = LVIF_TEXT;\r
+    item.iItem = i_index;\r
+    item.pszText = buf;\r
+    item.cchTextMax = NUMBER_OF(buf);\r
+    \r
+    item.iSubItem = 0;\r
+    CHECK_TRUE( ListView_GetItem(m_hwndMayuPaths, &item) );\r
+    o_data->m_name = item.pszText;\r
+    \r
+    item.iSubItem = 1;\r
+    CHECK_TRUE( ListView_GetItem(m_hwndMayuPaths, &item) );\r
+    o_data->m_filename = item.pszText;\r
+\r
+    item.iSubItem = 2;\r
+    CHECK_TRUE( ListView_GetItem(m_hwndMayuPaths, &item) );\r
+    o_data->m_symbols = item.pszText;\r
+  }\r
+\r
+  ///\r
+  void setSelectedItem(int i_index)\r
+  {\r
+    ListView_SetItemState(m_hwndMayuPaths, i_index,\r
+                         LVIS_SELECTED, LVIS_SELECTED);\r
+  }\r
+\r
+  ///\r
+  int getSelectedItem()\r
+  {\r
+    if (ListView_GetSelectedCount(m_hwndMayuPaths) == 0)\r
+      return -1;\r
+    for (int i = 0; ; ++ i)\r
+    {\r
+      if (ListView_GetItemState(m_hwndMayuPaths, i, LVIS_SELECTED))\r
+       return i;\r
+    }\r
+  }\r
+\r
+public:\r
+  ///\r
+  DlgSetting(HWND i_hwnd)\r
+    : LayoutManager(i_hwnd),\r
+      m_hwndMayuPaths(NULL),\r
+      m_reg(MAYU_REGISTRY_ROOT)\r
+  {\r
+  }\r
+  \r
+  /// WM_INITDIALOG\r
+  BOOL wmInitDialog(HWND /* i_focus */, LPARAM /* i_lParam */)\r
+  {\r
+    setSmallIcon(m_hwnd, IDI_ICON_mayu);\r
+    setBigIcon(m_hwnd, IDI_ICON_mayu);\r
+    \r
+    CHECK_TRUE( m_hwndMayuPaths = GetDlgItem(m_hwnd, IDC_LIST_mayuPaths) );\r
+\r
+    // create list view colmn\r
+    RECT rc;\r
+    GetClientRect(m_hwndMayuPaths, &rc);\r
+    \r
+    LVCOLUMN lvc; \r
+    lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT; \r
+    lvc.fmt = LVCFMT_LEFT; \r
+    lvc.cx = (rc.right - rc.left) / 3;\r
+\r
+    tstringi str = loadString(IDS_mayuPathName);\r
+    lvc.pszText = const_cast<_TCHAR *>(str.c_str());\r
+    CHECK( 0 ==, ListView_InsertColumn(m_hwndMayuPaths, 0, &lvc) );\r
+    str = loadString(IDS_mayuPath);\r
+    lvc.pszText = const_cast<_TCHAR *>(str.c_str());\r
+    CHECK( 1 ==, ListView_InsertColumn(m_hwndMayuPaths, 1, &lvc) );\r
+    str = loadString(IDS_mayuSymbols);\r
+    lvc.pszText = const_cast<_TCHAR *>(str.c_str());\r
+    CHECK( 2 ==, ListView_InsertColumn(m_hwndMayuPaths, 2, &lvc) );\r
+\r
+    Data data;\r
+    insertItem(0, data);                               // TODO: why ?\r
+    \r
+    // set list view\r
+    tregex split(_T("^([^;]*);([^;]*);(.*)$"));\r
+    tstringi dot_mayu;\r
+    int i;\r
+    for (i = 0; i < MAX_MAYU_REGISTRY_ENTRIES; ++ i)\r
+    {\r
+      _TCHAR buf[100];\r
+      _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), i);\r
+      if (!m_reg.read(buf, &dot_mayu))\r
+       break;\r
+\r
+      tsmatch what;\r
+      if (boost::regex_match(dot_mayu, what, split))\r
+      {\r
+       data.m_name = what.str(1);\r
+       data.m_filename = what.str(2);\r
+       data.m_symbols = what.str(3);\r
+       insertItem(i, data);\r
+      }\r
+    }\r
+\r
+    CHECK_TRUE( ListView_DeleteItem(m_hwndMayuPaths, i) );     // TODO: why ?\r
+\r
+    // arrange list view size\r
+    ListView_SetColumnWidth(m_hwndMayuPaths, 0, LVSCW_AUTOSIZE);\r
+    ListView_SetColumnWidth(m_hwndMayuPaths, 1, LVSCW_AUTOSIZE);\r
+    ListView_SetColumnWidth(m_hwndMayuPaths, 2, LVSCW_AUTOSIZE);\r
+\r
+    ListView_SetExtendedListViewStyle(m_hwndMayuPaths, LVS_EX_FULLROWSELECT);\r
+\r
+    // set selection\r
+    int index;\r
+    m_reg.read(_T(".mayuIndex"), &index, 0);\r
+    setSelectedItem(index);\r
+\r
+    // set layout manager\r
+    typedef LayoutManager LM;\r
+    addItem(GetDlgItem(m_hwnd, IDC_STATIC_mayuPaths),\r
+           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE,\r
+           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_BOTTOM_EDGE);\r
+    addItem(GetDlgItem(m_hwnd, IDC_LIST_mayuPaths),\r
+           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE,\r
+           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_BOTTOM_EDGE);\r
+    addItem(GetDlgItem(m_hwnd, IDC_BUTTON_up),\r
+           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_CENTER,\r
+           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_CENTER);\r
+    addItem(GetDlgItem(m_hwnd, IDC_BUTTON_down),\r
+           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_CENTER,\r
+           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_CENTER);\r
+    addItem(GetDlgItem(m_hwnd, IDC_BUTTON_add),\r
+           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,\r
+           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);\r
+    addItem(GetDlgItem(m_hwnd, IDC_BUTTON_edit),\r
+           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,\r
+           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);\r
+    addItem(GetDlgItem(m_hwnd, IDC_BUTTON_delete),\r
+           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,\r
+           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);\r
+    addItem(GetDlgItem(m_hwnd, IDCANCEL),\r
+           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,\r
+           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);\r
+    addItem(GetDlgItem(m_hwnd, IDOK),\r
+           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,\r
+           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);\r
+    restrictSmallestSize();\r
+    return TRUE;\r
+  }\r
+\r
+  /// WM_CLOSE\r
+  BOOL wmClose()\r
+  {\r
+    EndDialog(m_hwnd, 0);\r
+    return TRUE;\r
+  }\r
+\r
+  /// WM_NOTIFY\r
+  BOOL wmNotify(int i_id, NMHDR *i_nmh)\r
+  {\r
+    switch (i_id)\r
+    {\r
+      case IDC_LIST_mayuPaths:\r
+       if (i_nmh->code == NM_DBLCLK)\r
+         FORWARD_WM_COMMAND(m_hwnd, IDC_BUTTON_edit, NULL, 0, SendMessage);\r
+       return TRUE;\r
+    }\r
+    return TRUE;\r
+  }\r
+  \r
+  /// WM_COMMAND\r
+  BOOL wmCommand(int /* i_notifyCode */, int i_id, HWND /* i_hwndControl */)\r
+  {\r
+    _TCHAR buf[GANA_MAX_PATH];\r
+    switch (i_id)\r
+    {\r
+      case IDC_BUTTON_up:\r
+      case IDC_BUTTON_down:\r
+      {\r
+       int count = ListView_GetItemCount(m_hwndMayuPaths);\r
+       if (count < 2)\r
+         return TRUE;\r
+       int index = getSelectedItem();\r
+       if (index < 0 ||\r
+           (i_id == IDC_BUTTON_up && index == 0) ||\r
+           (i_id == IDC_BUTTON_down && index == count - 1))\r
+         return TRUE;\r
+\r
+       int target = (i_id == IDC_BUTTON_up) ? index - 1 : index + 1;\r
+\r
+       Data dataIndex, dataTarget;\r
+       getItem(index, &dataIndex);\r
+       getItem(target, &dataTarget);\r
+       setItem(index, dataTarget);\r
+       setItem(target, dataIndex);\r
+       \r
+       setSelectedItem(target);\r
+       return TRUE;\r
+      }\r
+      \r
+      case IDC_BUTTON_add:\r
+      {\r
+       Data data;\r
+       int index = getSelectedItem();\r
+       if (0 <= index)\r
+         getItem(index, &data);\r
+       if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_editSetting),\r
+                          m_hwnd, dlgEditSetting_dlgProc, (LPARAM)&data))\r
+         if (!data.m_name.empty())\r
+         {\r
+           insertItem(0, data);\r
+           setSelectedItem(0);\r
+         }\r
+       return TRUE;\r
+      }\r
+      \r
+      case IDC_BUTTON_delete:\r
+      {\r
+       int index = getSelectedItem();\r
+       if (0 <= index)\r
+       {\r
+         CHECK_TRUE( ListView_DeleteItem(m_hwndMayuPaths, index) );\r
+         int count = ListView_GetItemCount(m_hwndMayuPaths);\r
+         if (count == 0)\r
+           ;\r
+         else if (count == index)\r
+           setSelectedItem(index - 1);\r
+         else\r
+           setSelectedItem(index);\r
+       }\r
+       return TRUE;\r
+      }\r
+      \r
+      case IDC_BUTTON_edit:\r
+      {\r
+       Data data;\r
+       int index = getSelectedItem();\r
+       if (index < 0)\r
+         return TRUE;\r
+       getItem(index, &data);\r
+       if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_editSetting),\r
+                          m_hwnd, dlgEditSetting_dlgProc, (LPARAM)&data))\r
+       {\r
+         setItem(index, data);\r
+         setSelectedItem(index);\r
+       }\r
+       return TRUE;\r
+      }\r
+      \r
+      case IDOK:\r
+      {\r
+       int count = ListView_GetItemCount(m_hwndMayuPaths);\r
+       int index;\r
+       for (index = 0; index < count; ++ index)\r
+       {\r
+         _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), index);\r
+         Data data;\r
+         getItem(index, &data);\r
+         m_reg.write(buf, data.m_name + _T(";") +\r
+                     data.m_filename + _T(";") + data.m_symbols);\r
+       }\r
+       for (; ; ++ index)\r
+       {\r
+         _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), index);\r
+         if (!m_reg.remove(buf))\r
+           break;\r
+       }\r
+       index = getSelectedItem();\r
+       if (index < 0)\r
+         index = 0;\r
+       m_reg.write(_T(".mayuIndex"), index);\r
+       EndDialog(m_hwnd, 1);\r
+       return TRUE;\r
+      }\r
+      \r
+      case IDCANCEL:\r
+      {\r
+       CHECK_TRUE( EndDialog(m_hwnd, 0) );\r
+       return TRUE;\r
+      }\r
+    }\r
+    return FALSE;\r
+  }\r
+};\r
+\r
+\r
+//\r
+#ifdef MAYU64\r
+INT_PTR CALLBACK dlgSetting_dlgProc(\r
+#else\r
+BOOL CALLBACK dlgSetting_dlgProc(\r
+#endif\r
+  HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam)\r
+{\r
+  DlgSetting *wc;\r
+  getUserData(i_hwnd, &wc);\r
+  if (!wc)\r
+    switch (i_message)\r
+    {\r
+      case WM_INITDIALOG:\r
+       wc = setUserData(i_hwnd, new DlgSetting(i_hwnd));\r
+       return wc->wmInitDialog(reinterpret_cast<HWND>(i_wParam), i_lParam);\r
+    }\r
+  else\r
+    switch (i_message)\r
+    {\r
+      case WM_COMMAND:\r
+       return wc->wmCommand(HIWORD(i_wParam), LOWORD(i_wParam),\r
+                            reinterpret_cast<HWND>(i_lParam));\r
+      case WM_CLOSE:\r
+       return wc->wmClose();\r
+      case WM_NCDESTROY:\r
+       delete wc;\r
+       return TRUE;\r
+      case WM_NOTIFY:\r
+       return wc->wmNotify(static_cast<int>(i_wParam),\r
+                           reinterpret_cast<NMHDR *>(i_lParam));\r
+      default:\r
+       return wc->defaultWMHandler(i_message, i_wParam, i_lParam);\r
+    }\r
+  return FALSE;\r
+}\r
index 89fa988..7f742ba 100644 (file)
@@ -1,20 +1,20 @@
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// dlgsetting.h
-
-
-#ifndef _DLGSETTING_H
-#  define _DLGSETTING_H
-
-#  include <windows.h>
-
-
-///
-#ifdef MAYU64
-INT_PTR CALLBACK dlgSetting_dlgProc(
-#else
-BOOL CALLBACK dlgSetting_dlgProc(
-#endif
-  HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam);
-
-
-#endif // !_DLGSETTING_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// dlgsetting.h\r
+\r
+\r
+#ifndef _DLGSETTING_H\r
+#  define _DLGSETTING_H\r
+\r
+#  include <windows.h>\r
+\r
+\r
+///\r
+#ifdef MAYU64\r
+INT_PTR CALLBACK dlgSetting_dlgProc(\r
+#else\r
+BOOL CALLBACK dlgSetting_dlgProc(\r
+#endif\r
+  HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam);\r
+\r
+\r
+#endif // !_DLGSETTING_H\r
index 53121ec..aa27918 100755 (executable)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// dlgversion.cpp
-
-
-#include "misc.h"
-
-#include "mayu.h"
-#include "mayurc.h"
-#include "windowstool.h"
-#include "compiler_specific_func.h"
-#include "layoutmanager.h"
-
-#include <cstdio>
-#include <windowsx.h>
-
-
-///
-class DlgVersion : public LayoutManager
-{
-  HWND m_hwnd;         ///
-  
-public:
-  ///
-  DlgVersion(HWND i_hwnd)
-    : LayoutManager(i_hwnd),
-      m_hwnd(i_hwnd)
-  {
-  }
-  
-  /// WM_INITDIALOG
-  BOOL wmInitDialog(HWND /* i_focus */, LPARAM i_lParam)
-  {
-    TCHAR *mayudVersion = (TCHAR*)i_lParam;
-    setSmallIcon(m_hwnd, IDI_ICON_mayu);
-    setBigIcon(m_hwnd, IDI_ICON_mayu);
-    
-    _TCHAR modulebuf[1024];
-    CHECK_TRUE( GetModuleFileName(g_hInst, modulebuf,
-                                 NUMBER_OF(modulebuf)) );
-    
-    _TCHAR buf[1024];
-    _sntprintf(buf, NUMBER_OF(buf), loadString(IDS_version).c_str(),
-              _T(VERSION)
-#ifndef NDEBUG
-              _T(" (DEBUG)")
-#endif // !NDEBUG
-#ifdef _UNICODE
-              _T(" (UNICODE)")
-#endif // !_UNICODE
-              ,
-              loadString(IDS_homepage).c_str(),
-              (_T(LOGNAME) _T("@") + toLower(_T(COMPUTERNAME))).c_str(),
-              _T(__DATE__) _T(" ") _T(__TIME__),
-              getCompilerVersionString().c_str(),
-              modulebuf);
-    
-    
-    Edit_SetText(GetDlgItem(m_hwnd, IDC_EDIT_builtBy), buf);
-    
-    // set layout manager
-    typedef LayoutManager LM;
-
-    addItem(GetDlgItem(m_hwnd, IDC_STATIC_mayuIcon),
-           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE,
-           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE);
-    addItem(GetDlgItem(m_hwnd, IDC_EDIT_builtBy),
-           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE,
-           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_BOTTOM_EDGE);
-    addItem(GetDlgItem(m_hwnd, IDC_BUTTON_download),
-           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,
-           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);
-    addItem(GetDlgItem(m_hwnd, IDOK),
-           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,
-           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);
-    restrictSmallestSize();
-    
-    return TRUE;
-  }
-  
-  /// WM_CLOSE
-  BOOL wmClose()
-  {
-    CHECK_TRUE( EndDialog(m_hwnd, 0) );
-    return TRUE;
-  }
-
-  /// WM_COMMAND
-  BOOL wmCommand(int /* i_notifyCode */, int i_id, HWND /* i_hwndControl */)
-  {
-    switch (i_id)
-    {
-      case IDOK:
-      {
-       CHECK_TRUE( EndDialog(m_hwnd, 0) );
-       return TRUE;
-      }
-      case IDC_BUTTON_download:
-      {
-       ShellExecute(NULL, NULL, loadString(IDS_homepage).c_str(),
-                    NULL, NULL, SW_SHOWNORMAL);
-       CHECK_TRUE( EndDialog(m_hwnd, 0) );
-       return TRUE;
-      }
-    }
-    return FALSE;
-  }
-};
-
-
-//
-#ifdef MAYU64
-INT_PTR CALLBACK dlgVersion_dlgProc(
-#else
-BOOL CALLBACK dlgVersion_dlgProc(
-#endif
-  HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam)
-{
-  DlgVersion *wc;
-  getUserData(i_hwnd, &wc);
-  if (!wc)
-    switch (i_message)
-    {
-      case WM_INITDIALOG:
-       wc = setUserData(i_hwnd, new DlgVersion(i_hwnd));
-       return wc->wmInitDialog(reinterpret_cast<HWND>(i_wParam), i_lParam);
-    }
-  else
-    switch (i_message)
-    {
-      case WM_COMMAND:
-       return wc->wmCommand(HIWORD(i_wParam), LOWORD(i_wParam),
-                            reinterpret_cast<HWND>(i_lParam));
-      case WM_CLOSE:
-       return wc->wmClose();
-      case WM_NCDESTROY:
-       delete wc;
-       return TRUE;
-      default:
-       return wc->defaultWMHandler(i_message, i_wParam, i_lParam);
-    }
-  return FALSE;
-}
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// dlgversion.cpp\r
+\r
+\r
+#include "misc.h"\r
+\r
+#include "mayu.h"\r
+#include "mayurc.h"\r
+#include "windowstool.h"\r
+#include "compiler_specific_func.h"\r
+#include "layoutmanager.h"\r
+\r
+#include <cstdio>\r
+#include <windowsx.h>\r
+\r
+\r
+///\r
+class DlgVersion : public LayoutManager\r
+{\r
+  HWND m_hwnd;         ///\r
+  \r
+public:\r
+  ///\r
+  DlgVersion(HWND i_hwnd)\r
+    : LayoutManager(i_hwnd),\r
+      m_hwnd(i_hwnd)\r
+  {\r
+  }\r
+  \r
+  /// WM_INITDIALOG\r
+  BOOL wmInitDialog(HWND /* i_focus */, LPARAM i_lParam)\r
+  {\r
+    TCHAR *mayudVersion = (TCHAR*)i_lParam;\r
+    setSmallIcon(m_hwnd, IDI_ICON_mayu);\r
+    setBigIcon(m_hwnd, IDI_ICON_mayu);\r
+    \r
+    _TCHAR modulebuf[1024];\r
+    CHECK_TRUE( GetModuleFileName(g_hInst, modulebuf,\r
+                                 NUMBER_OF(modulebuf)) );\r
+    \r
+    _TCHAR buf[1024];\r
+    _sntprintf(buf, NUMBER_OF(buf), loadString(IDS_version).c_str(),\r
+              _T(VERSION)\r
+#ifndef NDEBUG\r
+              _T(" (DEBUG)")\r
+#endif // !NDEBUG\r
+#ifdef _UNICODE\r
+              _T(" (UNICODE)")\r
+#endif // !_UNICODE\r
+              ,\r
+              loadString(IDS_homepage).c_str(),\r
+              (_T(LOGNAME) _T("@") + toLower(_T(COMPUTERNAME))).c_str(),\r
+              _T(__DATE__) _T(" ") _T(__TIME__),\r
+              getCompilerVersionString().c_str(),\r
+              modulebuf);\r
+    \r
+    \r
+    Edit_SetText(GetDlgItem(m_hwnd, IDC_EDIT_builtBy), buf);\r
+    \r
+    // set layout manager\r
+    typedef LayoutManager LM;\r
+\r
+    addItem(GetDlgItem(m_hwnd, IDC_STATIC_mayuIcon),\r
+           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE,\r
+           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE);\r
+    addItem(GetDlgItem(m_hwnd, IDC_EDIT_builtBy),\r
+           LM::ORIGIN_LEFT_EDGE, LM::ORIGIN_TOP_EDGE,\r
+           LM::ORIGIN_RIGHT_EDGE, LM::ORIGIN_BOTTOM_EDGE);\r
+    addItem(GetDlgItem(m_hwnd, IDC_BUTTON_download),\r
+           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,\r
+           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);\r
+    addItem(GetDlgItem(m_hwnd, IDOK),\r
+           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE,\r
+           LM::ORIGIN_CENTER, LM::ORIGIN_BOTTOM_EDGE);\r
+    restrictSmallestSize();\r
+    \r
+    return TRUE;\r
+  }\r
+  \r
+  /// WM_CLOSE\r
+  BOOL wmClose()\r
+  {\r
+    CHECK_TRUE( EndDialog(m_hwnd, 0) );\r
+    return TRUE;\r
+  }\r
+\r
+  /// WM_COMMAND\r
+  BOOL wmCommand(int /* i_notifyCode */, int i_id, HWND /* i_hwndControl */)\r
+  {\r
+    switch (i_id)\r
+    {\r
+      case IDOK:\r
+      {\r
+       CHECK_TRUE( EndDialog(m_hwnd, 0) );\r
+       return TRUE;\r
+      }\r
+      case IDC_BUTTON_download:\r
+      {\r
+       ShellExecute(NULL, NULL, loadString(IDS_homepage).c_str(),\r
+                    NULL, NULL, SW_SHOWNORMAL);\r
+       CHECK_TRUE( EndDialog(m_hwnd, 0) );\r
+       return TRUE;\r
+      }\r
+    }\r
+    return FALSE;\r
+  }\r
+};\r
+\r
+\r
+//\r
+#ifdef MAYU64\r
+INT_PTR CALLBACK dlgVersion_dlgProc(\r
+#else\r
+BOOL CALLBACK dlgVersion_dlgProc(\r
+#endif\r
+  HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam)\r
+{\r
+  DlgVersion *wc;\r
+  getUserData(i_hwnd, &wc);\r
+  if (!wc)\r
+    switch (i_message)\r
+    {\r
+      case WM_INITDIALOG:\r
+       wc = setUserData(i_hwnd, new DlgVersion(i_hwnd));\r
+       return wc->wmInitDialog(reinterpret_cast<HWND>(i_wParam), i_lParam);\r
+    }\r
+  else\r
+    switch (i_message)\r
+    {\r
+      case WM_COMMAND:\r
+       return wc->wmCommand(HIWORD(i_wParam), LOWORD(i_wParam),\r
+                            reinterpret_cast<HWND>(i_lParam));\r
+      case WM_CLOSE:\r
+       return wc->wmClose();\r
+      case WM_NCDESTROY:\r
+       delete wc;\r
+       return TRUE;\r
+      default:\r
+       return wc->defaultWMHandler(i_message, i_wParam, i_lParam);\r
+    }\r
+  return FALSE;\r
+}\r
index 9f3cd9b..3e2f480 100644 (file)
@@ -1,20 +1,20 @@
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// dlgversion.h
-
-
-#ifndef _DLGVERSION_H
-#  define _DLGVERSION_H
-
-#  include <windows.h>
-
-
-///
-#ifdef MAYU64
-INT_PTR CALLBACK dlgVersion_dlgProc(
-#else
-BOOL CALLBACK dlgVersion_dlgProc(
-#endif
-  HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam);
-
-
-#endif // !_DLGVERSION_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// dlgversion.h\r
+\r
+\r
+#ifndef _DLGVERSION_H\r
+#  define _DLGVERSION_H\r
+\r
+#  include <windows.h>\r
+\r
+\r
+///\r
+#ifdef MAYU64\r
+INT_PTR CALLBACK dlgVersion_dlgProc(\r
+#else\r
+BOOL CALLBACK dlgVersion_dlgProc(\r
+#endif\r
+  HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam);\r
+\r
+\r
+#endif // !_DLGVERSION_H\r
index f18dd87..8a488b1 100644 (file)
--- a/dot.mayu
+++ b/dot.mayu
@@ -1,27 +1,27 @@
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \91\8b\8eg\82¢\82Ì\97J\9fT - dot.mayu
-# Copyright (C) 1999-2005, TAGA Nayuta <nayuta@users.sourceforge.net>
-#
-
-# \82Ü\82¸\83L\81[\83{\81[\83h\92è\8b`\82ð\93Ç\82Ý\8d\9e\82Þ
-if ( USE104 )
-  include "104.mayu"           # 104 \83L\81[\83{\81[\83h\90Ý\92è
-  if ( USE109on104 )
-    include "109on104.mayu"    # 104 \83L\81[\83{\81[\83h\82ð 109 \83L\81[\83{\81[\83h\95\97\82É
-  endif
-else
-  include "109.mayu"           # 109 \83L\81[\83{\81[\83h\90Ý\92è
-  if ( USE104on109 )
-    include "104on109.mayu"    # 109 \83L\81[\83{\81[\83h\82ð 104 \83L\81[\83{\81[\83h\95\97\82É
-  endif
-endif
-
-if ( USEdefault )
-  include      "default.mayu"  # Emacs \83\89\83C\83N\82È\82³\82Ü\82´\82Ü\82È\90Ý\92è
-endif
-
-keymap Global
-
-# \82±\82Ì\83t\83@\83C\83\8b\82ð\83z\81[\83\80\83f\83B\83\8c\83N\83g\83\8a\82É\83R\83s\81[\82µ\82Ä\82©\82ç\81A
-# \88È\89º\82É\8e©\95ª\82Ì\8dD\82Ý\82Ì\83L\81[\83o\83C\83\93\83f\83B\83\93\83O\82ð\90Ý\92è\82·\82é\82Æ\82æ\82¢\81B
-# \82±\82Ì\83t\83@\83C\83\8b\8e©\91Ì\82ð\95Ï\8dX\82µ\82È\82¢\82±\82Æ\81B
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# \91\8b\8eg\82¢\82Ì\97J\9fT - dot.mayu\r
+# Copyright (C) 1999-2005, TAGA Nayuta <nayuta@users.sourceforge.net>\r
+#\r
+\r
+# \82Ü\82¸\83L\81[\83{\81[\83h\92è\8b`\82ð\93Ç\82Ý\8d\9e\82Þ\r
+if ( USE104 )\r
+  include "104.mayu"           # 104 \83L\81[\83{\81[\83h\90Ý\92è\r
+  if ( USE109on104 )\r
+    include "109on104.mayu"    # 104 \83L\81[\83{\81[\83h\82ð 109 \83L\81[\83{\81[\83h\95\97\82É\r
+  endif\r
+else\r
+  include "109.mayu"           # 109 \83L\81[\83{\81[\83h\90Ý\92è\r
+  if ( USE104on109 )\r
+    include "104on109.mayu"    # 109 \83L\81[\83{\81[\83h\82ð 104 \83L\81[\83{\81[\83h\95\97\82É\r
+  endif\r
+endif\r
+\r
+if ( USEdefault )\r
+  include      "default.mayu"  # Emacs \83\89\83C\83N\82È\82³\82Ü\82´\82Ü\82È\90Ý\92è\r
+endif\r
+\r
+keymap Global\r
+\r
+# \82±\82Ì\83t\83@\83C\83\8b\82ð\83z\81[\83\80\83f\83B\83\8c\83N\83g\83\8a\82É\83R\83s\81[\82µ\82Ä\82©\82ç\81A\r
+# \88È\89º\82É\8e©\95ª\82Ì\8dD\82Ý\82Ì\83L\81[\83o\83C\83\93\83f\83B\83\93\83O\82ð\90Ý\92è\82·\82é\82Æ\82æ\82¢\81B\r
+# \82±\82Ì\83t\83@\83C\83\8b\8e©\91Ì\82ð\95Ï\8dX\82µ\82È\82¢\82±\82Æ\81B\r
index 9318cc5..abcf94d 100644 (file)
--- a/driver.h
+++ b/driver.h
@@ -1,61 +1,61 @@
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// driver.h
-
-
-#ifndef _DRIVER_H
-#  define _DRIVER_H
-
-#  include <winioctl.h>
-
-
-/// mayu device file name
-#    define MAYU_DEVICE_FILE_NAME _T("\\\\.\\MayuDetour1")
-///
-#    define MAYU_DRIVER_NAME _T("mayud")
-
-/// Ioctl value
-#include "d/ioctl.h"
-
-
-/// derived from w2kddk/inc/ntddkbd.h
-class KEYBOARD_INPUT_DATA
-{
-public:
-  ///
-  enum
-  {
-    /// key release flag
-    BREAK = 1,
-    /// extended key flag
-    E0 = 2,
-    /// extended key flag
-    E1 = 4,
-    /// extended key flag (E0 | E1)
-    E0E1 = 6,
-    ///
-    TERMSRV_SET_LED = 8,
-    /// Define the keyboard overrun MakeCode.
-    KEYBOARD_OVERRUN_MAKE_CODE_ = 0xFF,
-  };
-
-public:
-  /** Unit number.  E.g., for \Device\KeyboardPort0 the unit is '0', for
-      \Device\KeyboardPort1 the unit is '1', and so on. */
-  USHORT UnitId;
-  
-  /** The "make" scan code (key depression). */
-  USHORT MakeCode;
-  
-  /** The flags field indicates a "break" (key release) and other miscellaneous
-      scan code information defined above. */
-  USHORT Flags;
-  
-  ///
-  USHORT Reserved;
-  
-  /** Device-specific additional information for the event. */
-  ULONG ExtraInformation;
-};
-
-
-#endif // !_DRIVER_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// driver.h\r
+\r
+\r
+#ifndef _DRIVER_H\r
+#  define _DRIVER_H\r
+\r
+#  include <winioctl.h>\r
+\r
+\r
+/// mayu device file name\r
+#    define MAYU_DEVICE_FILE_NAME _T("\\\\.\\MayuDetour1")\r
+///\r
+#    define MAYU_DRIVER_NAME _T("mayud")\r
+\r
+/// Ioctl value\r
+#include "d/ioctl.h"\r
+\r
+\r
+/// derived from w2kddk/inc/ntddkbd.h\r
+class KEYBOARD_INPUT_DATA\r
+{\r
+public:\r
+  ///\r
+  enum\r
+  {\r
+    /// key release flag\r
+    BREAK = 1,\r
+    /// extended key flag\r
+    E0 = 2,\r
+    /// extended key flag\r
+    E1 = 4,\r
+    /// extended key flag (E0 | E1)\r
+    E0E1 = 6,\r
+    ///\r
+    TERMSRV_SET_LED = 8,\r
+    /// Define the keyboard overrun MakeCode.\r
+    KEYBOARD_OVERRUN_MAKE_CODE_ = 0xFF,\r
+  };\r
+\r
+public:\r
+  /** Unit number.  E.g., for \Device\KeyboardPort0 the unit is '0', for\r
+      \Device\KeyboardPort1 the unit is '1', and so on. */\r
+  USHORT UnitId;\r
+  \r
+  /** The "make" scan code (key depression). */\r
+  USHORT MakeCode;\r
+  \r
+  /** The flags field indicates a "break" (key release) and other miscellaneous\r
+      scan code information defined above. */\r
+  USHORT Flags;\r
+  \r
+  ///\r
+  USHORT Reserved;\r
+  \r
+  /** Device-specific additional information for the event. */\r
+  ULONG ExtraInformation;\r
+};\r
+\r
+\r
+#endif // !_DRIVER_H\r
index adf4e57..1536aa6 100644 (file)
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \91\8b\8eg\82¢\82Ì\97J\9fT - emacsedit.mayu
-# Copyright (C) 1999-2005, TAGA Nayuta <nayuta@users.sourceforge.net>
-#
-
-
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# Emacs \95\97\88Ú\93®\83R\83}\83\93\83h
-#
-
-keymap EmacsMove : Global
- key Home              = C-Home                # \95\93ª
- key End               = C-End                 # \95\96\96
- key C-Space           = &Undefined            # Mark
- key C-A               = Home                  # \8ds\93ª
- key C-B               = Left                  # \81©
- key M-B               = C-Left                # \81©(\92P\8cê)
- key C-E               = End                   # \8ds\96\96
- key C-F               = Right                 # \81¨
- key M-F               = C-Right               # \81¨(\92P\8cê)
- key C-G               = Escape                # CANCEL
- key C-L               = &WindowRedraw &Recenter # \8dÄ\95`\89æ
- key C-N               = Down                  # \81«
- key C-P               = Up                    # \81ª
- key C-Q               = &Prefix(KeymapDefault) # mayu \82É\8d\89E\82³\82ê\82È\82¢\83L\81[\93ü\97Í
- key C-S               = C-F                   # \8c\9f\8dõ
- if ( !ZXCV ) key C-V  = Next                  # \8e\9f\95Å
- key M-V               = Prior                 # \91O\95Å
- key S-Home            = S-C-Home              # \95\93ª(\91I\91ð)
- key S-End             = S-C-End               # \95\96\96(\91I\91ð)
- key S-M-Comma         = C-Home                # \95\93ª
- key S-M-Period                = C-End                 # \95\96\96
-
- if ( EmacsMove/ShiftSelection )
-   key S-C-A           = S-Home                # \8ds\93ª(\91I\91ð)
-   key S-C-B           = S-Left                # \81©(\91I\91ð)
-   key S-C-E           = S-End                 # \8ds\96\96(\91I\91ð)
-   key S-C-F           = S-Right               # \81¨(\91I\91ð)
-   key S-C-N           = S-Down                # \81«(\91I\91ð)
-   key S-C-P           = S-Up                  # \81ª(\91I\91ð)
-   key S-C-V           = S-Next                # \8e\9f\95Å(\91I\91ð)
-   key S-M-V           = S-Prior               # \91O\95Å(\91I\91ð)
- endif
-
-
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# Emacs \95\97\95Ò\8fW\83R\83}\83\93\83h
-#
-
- keyseq        $EmacsEdit/kill-word            = S-C-Right C-X
- keyseq        $EmacsEdit/backward-kill-word   = S-C-Left C-X
- keyseq        $EmacsEdit/transpose-chars      = S-Right C-X Left C-V Right
- keyseq        $EmacsEdit/upcase-word          = S-C-Right C-C *&Sync \
-                                         &ClipboardUpcaseWord C-V
- keyseq        $EmacsEdit/downcase-word        = S-C-Right C-C *&Sync \
-                                         &ClipboardDowncaseWord C-V
- keyseq        $EmacsEdit/kill-line            = &EmacsEditKillLineFunc S-End C-X \
-                       &Sync &EmacsEditKillLinePred((Delete), (Return Left))
- keyseq        $EmacsMark/cancel               = Left Right
-
-
-keymap EmacsEdit : EmacsMove
-keymap2        EmacsMark : EmacsEdit = $EmacsMark/cancel &KeymapWindow
-keymap2 EmacsMarkEscape : EmacsMark = &KeymapParent
-
-keymap2        EmacsC-X : EmacsEdit
- event prefixed                = &HelpMessage("EmacsEdit C-x-", "C-x u\tundo")
- event before-key-down = &HelpMessage
- key *U                        = C-Z                                   # UNDO
-
-keymap2 EmacsC-U0_9C-U : Global \
-               = &Repeat((&KeymapWindow), 100) &HelpMessage &Variable(0, 0)
- key C-G       = &HelpMessage &Variable(0, 0) &Ignore
-keymap2 EmacsC-U0_9 : EmacsC-U0_9C-U
- event prefixed                = &HelpVariable("\8cJ\82è\95Ô\82µ")
- key _0 Num0           = &Variable(10, 0) &Prefix(EmacsC-U0_9)
- key _1 Num1           = &Variable(10, 1) &Prefix(EmacsC-U0_9)
- key _2 Num2           = &Variable(10, 2) &Prefix(EmacsC-U0_9)
- key _3 Num3           = &Variable(10, 3) &Prefix(EmacsC-U0_9)
- key _4 Num4           = &Variable(10, 4) &Prefix(EmacsC-U0_9)
- key _5 Num5           = &Variable(10, 5) &Prefix(EmacsC-U0_9)
- key _6 Num6           = &Variable(10, 6) &Prefix(EmacsC-U0_9)
- key _7 Num7           = &Variable(10, 7) &Prefix(EmacsC-U0_9)
- key _8 Num8           = &Variable(10, 8) &Prefix(EmacsC-U0_9)
- key _9 Num9           = &Variable(10, 9) &Prefix(EmacsC-U0_9)
- key C-U               = &Prefix(EmacsC-U0_9C-U)
-
-keymap2 EmacsC-U : EmacsC-U0_9C-U
- event prefixed                = &HelpVariable("\8cJ\82è\95Ô\82µ")
- key _0 Num0           = &Variable(0, 0) &Prefix(EmacsC-U0_9)
- key _1 Num1           = &Variable(0, 1) &Prefix(EmacsC-U0_9)
- key _2 Num2           = &Variable(0, 2) &Prefix(EmacsC-U0_9)
- key _3 Num3           = &Variable(0, 3) &Prefix(EmacsC-U0_9)
- key _4 Num4           = &Variable(0, 4) &Prefix(EmacsC-U0_9)
- key _5 Num5           = &Variable(0, 5) &Prefix(EmacsC-U0_9)
- key _6 Num6           = &Variable(0, 6) &Prefix(EmacsC-U0_9)
- key _7 Num7           = &Variable(0, 7) &Prefix(EmacsC-U0_9)
- key _8 Num8           = &Variable(0, 8) &Prefix(EmacsC-U0_9)
- key _9 Num9           = &Variable(0, 9) &Prefix(EmacsC-U0_9)
- key C-U               = &Variable(4, 0) &Prefix(EmacsC-U)
-
-keymap EmacsEdit
- key C-Space           = &Prefix(EmacsMark)                    # Mark
- key M-BackSpace       = $EmacsEdit/backward-kill-word         # BS(\92P\8cê)
- key C-D               = Delete                                # \8dí\8f\9c
- key M-D               = $EmacsEdit/kill-word                  # \8dí\8f\9c(\92P\8cê)
- key C-H               = BackSpace                             # BS
- key C-J               = Return                                # RETURN
- key C-K               = $EmacsEdit/kill-line                  # \8ds\96\96\82Ü\82Å\8dí\8f\9c
- key C-M               = Return                                # RETURN
- key C-O               = Return Left                           # \88ê\8ds\91\9d\82â\82·
- if ( !GANA ) key C-T  = $EmacsEdit/transpose-chars            # \95\8e\9a\93ü\82ê\91Ö\82¦
- key C-W               = C-X                                   # CUT
- key M-W               = C-C                                   # COPY
- key C-U               = &Variable(0, 4) &Prefix(EmacsC-U)
- if ( !ZXCV ) key C-X  = &Prefix(EmacsC-X)
- key C-Y               = C-V                                   # PASTE
- key C-Slash           = C-Z                                   # UNDO
- key M-U               = $EmacsEdit/upcase-word                # \91å\95\8e\9a
- key M-L               = $EmacsEdit/downcase-word              # \8f¬\95\8e\9a
-
-keymap2        EmacsMark
- key Home              = S-C-Home      &Prefix(EmacsMark)      # \95\93ª
- key End               = S-C-End       &Prefix(EmacsMark)      # \95\96\96
- key C-A               = S-Home        &Prefix(EmacsMark)      # \8ds\93ª
- key C-B               = S-Left        &Prefix(EmacsMark)      # \81©
- key M-B               = S-C-Left      &Prefix(EmacsMark)      # \81©(\92P\8cê)
- key C-E               = S-End         &Prefix(EmacsMark)      # \8ds\96\96
- key C-F               = S-Right       &Prefix(EmacsMark)      # \81¨
- key M-F               = S-C-Right     &Prefix(EmacsMark)      # \81¨(\92P\8cê)
- key C-G               = $EmacsMark/cancel &Undefined          # \83L\83\83\83\93\83Z\83\8b
- key C-N               = S-Down        &Prefix(EmacsMark)      # \81«
- key C-P               = S-Up          &Prefix(EmacsMark)      # \81ª
- if ( !ZXCV ) key C-V  = S-Next        &Prefix(EmacsMark)      # \8e\9f\95Å
- key M-V               = S-Prior       &Prefix(EmacsMark)      # \91O\95Å
- key C-W               = C-X Left Right                        # CUT
- key M-W               = C-C Left Right                        # COPY
- key S-M-Comma         = S-C-Home      &Prefix(EmacsMark)      # \95\93ª
- key S-M-Period                = S-C-End       &Prefix(EmacsMark)      # \95\96\96
- key Left              = S-Left        &Prefix(EmacsMark)      # \81©
- key Up                        = S-Up          &Prefix(EmacsMark)      # \81ª
- key Right             = S-Right       &Prefix(EmacsMark)      # \81¨
- key Down              = S-Down        &Prefix(EmacsMark)      # \81«
- if ( MAP-ESCAPE-TO-META )
-   key Escape          = &Prefix(EmacsMarkEscape) &EditNextModifier(M-)
-   if ( KBD109 ) and ( ! KBD104on109 )
-     key \94¼\8ap/\91S\8ap     = &Prefix(EmacsMarkEscape) &EditNextModifier(M-)
-     key E0\94¼\8ap/\91S\8ap   = &Prefix(EmacsMarkEscape) &EditNextModifier(M-)
-   endif
- endif
-
-keymap2 EmacsMarkEscape
- event prefixed                = &HelpMessage("EmacsMark ESC-", " ")
- event before-key-down = &HelpMessage
- key M-C-G             = &Ignore
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# \91\8b\8eg\82¢\82Ì\97J\9fT - emacsedit.mayu\r
+# Copyright (C) 1999-2005, TAGA Nayuta <nayuta@users.sourceforge.net>\r
+#\r
+\r
+\r
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# Emacs \95\97\88Ú\93®\83R\83}\83\93\83h\r
+#\r
+\r
+keymap EmacsMove : Global\r
+ key Home              = C-Home                # \95\93ª\r
+ key End               = C-End                 # \95\96\96\r
+ key C-Space           = &Undefined            # Mark\r
+ key C-A               = Home                  # \8ds\93ª\r
+ key C-B               = Left                  # \81©\r
+ key M-B               = C-Left                # \81©(\92P\8cê)\r
+ key C-E               = End                   # \8ds\96\96\r
+ key C-F               = Right                 # \81¨\r
+ key M-F               = C-Right               # \81¨(\92P\8cê)\r
+ key C-G               = Escape                # CANCEL\r
+ key C-L               = &WindowRedraw &Recenter # \8dÄ\95`\89æ\r
+ key C-N               = Down                  # \81«\r
+ key C-P               = Up                    # \81ª\r
+ key C-Q               = &Prefix(KeymapDefault) # mayu \82É\8d\89E\82³\82ê\82È\82¢\83L\81[\93ü\97Í\r
+ key C-S               = C-F                   # \8c\9f\8dõ\r
+ if ( !ZXCV ) key C-V  = Next                  # \8e\9f\95Å\r
+ key M-V               = Prior                 # \91O\95Å\r
+ key S-Home            = S-C-Home              # \95\93ª(\91I\91ð)\r
+ key S-End             = S-C-End               # \95\96\96(\91I\91ð)\r
+ key S-M-Comma         = C-Home                # \95\93ª\r
+ key S-M-Period                = C-End                 # \95\96\96\r
+\r
+ if ( EmacsMove/ShiftSelection )\r
+   key S-C-A           = S-Home                # \8ds\93ª(\91I\91ð)\r
+   key S-C-B           = S-Left                # \81©(\91I\91ð)\r
+   key S-C-E           = S-End                 # \8ds\96\96(\91I\91ð)\r
+   key S-C-F           = S-Right               # \81¨(\91I\91ð)\r
+   key S-C-N           = S-Down                # \81«(\91I\91ð)\r
+   key S-C-P           = S-Up                  # \81ª(\91I\91ð)\r
+   key S-C-V           = S-Next                # \8e\9f\95Å(\91I\91ð)\r
+   key S-M-V           = S-Prior               # \91O\95Å(\91I\91ð)\r
+ endif\r
+\r
+\r
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+# Emacs \95\97\95Ò\8fW\83R\83}\83\93\83h\r
+#\r
+\r
+ keyseq        $EmacsEdit/kill-word            = S-C-Right C-X\r
+ keyseq        $EmacsEdit/backward-kill-word   = S-C-Left C-X\r
+ keyseq        $EmacsEdit/transpose-chars      = S-Right C-X Left C-V Right\r
+ keyseq        $EmacsEdit/upcase-word          = S-C-Right C-C *&Sync \\r
+                                         &ClipboardUpcaseWord C-V\r
+ keyseq        $EmacsEdit/downcase-word        = S-C-Right C-C *&Sync \\r
+                                         &ClipboardDowncaseWord C-V\r
+ keyseq        $EmacsEdit/kill-line            = &EmacsEditKillLineFunc S-End C-X \\r
+                       &Sync &EmacsEditKillLinePred((Delete), (Return Left))\r
+ keyseq        $EmacsMark/cancel               = Left Right\r
+\r
+\r
+keymap EmacsEdit : EmacsMove\r
+keymap2        EmacsMark : EmacsEdit = $EmacsMark/cancel &KeymapWindow\r
+keymap2 EmacsMarkEscape : EmacsMark = &KeymapParent\r
+\r
+keymap2        EmacsC-X : EmacsEdit\r
+ event prefixed                = &HelpMessage("EmacsEdit C-x-", "C-x u\tundo")\r
+ event before-key-down = &HelpMessage\r
+ key *U                        = C-Z                                   # UNDO\r
+\r
+keymap2 EmacsC-U0_9C-U : Global \\r
+               = &Repeat((&KeymapWindow), 100) &HelpMessage &Variable(0, 0)\r
+ key C-G       = &HelpMessage &Variable(0, 0) &Ignore\r
\r
+keymap2 EmacsC-U0_9 : EmacsC-U0_9C-U\r
+ event prefixed                = &HelpVariable("\8cJ\82è\95Ô\82µ")\r
+ key _0 Num0           = &Variable(10, 0) &Prefix(EmacsC-U0_9)\r
+ key _1 Num1           = &Variable(10, 1) &Prefix(EmacsC-U0_9)\r
+ key _2 Num2           = &Variable(10, 2) &Prefix(EmacsC-U0_9)\r
+ key _3 Num3           = &Variable(10, 3) &Prefix(EmacsC-U0_9)\r
+ key _4 Num4           = &Variable(10, 4) &Prefix(EmacsC-U0_9)\r
+ key _5 Num5           = &Variable(10, 5) &Prefix(EmacsC-U0_9)\r
+ key _6 Num6           = &Variable(10, 6) &Prefix(EmacsC-U0_9)\r
+ key _7 Num7           = &Variable(10, 7) &Prefix(EmacsC-U0_9)\r
+ key _8 Num8           = &Variable(10, 8) &Prefix(EmacsC-U0_9)\r
+ key _9 Num9           = &Variable(10, 9) &Prefix(EmacsC-U0_9)\r
+ key C-U               = &Prefix(EmacsC-U0_9C-U)\r
+\r
+keymap2 EmacsC-U : EmacsC-U0_9C-U\r
+ event prefixed                = &HelpVariable("\8cJ\82è\95Ô\82µ")\r
+ key _0 Num0           = &Variable(0, 0) &Prefix(EmacsC-U0_9)\r
+ key _1 Num1           = &Variable(0, 1) &Prefix(EmacsC-U0_9)\r
+ key _2 Num2           = &Variable(0, 2) &Prefix(EmacsC-U0_9)\r
+ key _3 Num3           = &Variable(0, 3) &Prefix(EmacsC-U0_9)\r
+ key _4 Num4           = &Variable(0, 4) &Prefix(EmacsC-U0_9)\r
+ key _5 Num5           = &Variable(0, 5) &Prefix(EmacsC-U0_9)\r
+ key _6 Num6           = &Variable(0, 6) &Prefix(EmacsC-U0_9)\r
+ key _7 Num7           = &Variable(0, 7) &Prefix(EmacsC-U0_9)\r
+ key _8 Num8           = &Variable(0, 8) &Prefix(EmacsC-U0_9)\r
+ key _9 Num9           = &Variable(0, 9) &Prefix(EmacsC-U0_9)\r
+ key C-U               = &Variable(4, 0) &Prefix(EmacsC-U)\r
+\r
+keymap EmacsEdit\r
+ key C-Space           = &Prefix(EmacsMark)                    # Mark\r
+ key M-BackSpace       = $EmacsEdit/backward-kill-word         # BS(\92P\8cê)\r
+ key C-D               = Delete                                # \8dí\8f\9c\r
+ key M-D               = $EmacsEdit/kill-word                  # \8dí\8f\9c(\92P\8cê)\r
+ key C-H               = BackSpace                             # BS\r
+ key C-J               = Return                                # RETURN\r
+ key C-K               = $EmacsEdit/kill-line                  # \8ds\96\96\82Ü\82Å\8dí\8f\9c\r
+ key C-M               = Return                                # RETURN\r
+ key C-O               = Return Left                           # \88ê\8ds\91\9d\82â\82·\r
+ if ( !GANA ) key C-T  = $EmacsEdit/transpose-chars            # \95\8e\9a\93ü\82ê\91Ö\82¦\r
+ key C-W               = C-X                                   # CUT\r
+ key M-W               = C-C                                   # COPY\r
+ key C-U               = &Variable(0, 4) &Prefix(EmacsC-U)\r
+ if ( !ZXCV ) key C-X  = &Prefix(EmacsC-X)\r
+ key C-Y               = C-V                                   # PASTE\r
+ key C-Slash           = C-Z                                   # UNDO\r
+ key M-U               = $EmacsEdit/upcase-word                # \91å\95\8e\9a\r
+ key M-L               = $EmacsEdit/downcase-word              # \8f¬\95\8e\9a\r
+\r
+keymap2        EmacsMark\r
+ key Home              = S-C-Home      &Prefix(EmacsMark)      # \95\93ª\r
+ key End               = S-C-End       &Prefix(EmacsMark)      # \95\96\96\r
+ key C-A               = S-Home        &Prefix(EmacsMark)      # \8ds\93ª\r
+ key C-B               = S-Left        &Prefix(EmacsMark)      # \81©\r
+ key M-B               = S-C-Left      &Prefix(EmacsMark)      # \81©(\92P\8cê)\r
+ key C-E               = S-End         &Prefix(EmacsMark)      # \8ds\96\96\r
+ key C-F               = S-Right       &Prefix(EmacsMark)      # \81¨\r
+ key M-F               = S-C-Right     &Prefix(EmacsMark)      # \81¨(\92P\8cê)\r
+ key C-G               = $EmacsMark/cancel &Undefined          # \83L\83\83\83\93\83Z\83\8b\r
+ key C-N               = S-Down        &Prefix(EmacsMark)      # \81«\r
+ key C-P               = S-Up          &Prefix(EmacsMark)      # \81ª\r
+ if ( !ZXCV ) key C-V  = S-Next        &Prefix(EmacsMark)      # \8e\9f\95Å\r
+ key M-V               = S-Prior       &Prefix(EmacsMark)      # \91O\95Å\r
+ key C-W               = C-X Left Right                        # CUT\r
+ key M-W               = C-C Left Right                        # COPY\r
+ key S-M-Comma         = S-C-Home      &Prefix(EmacsMark)      # \95\93ª\r
+ key S-M-Period                = S-C-End       &Prefix(EmacsMark)      # \95\96\96\r
+ key Left              = S-Left        &Prefix(EmacsMark)      # \81©\r
+ key Up                        = S-Up          &Prefix(EmacsMark)      # \81ª\r
+ key Right             = S-Right       &Prefix(EmacsMark)      # \81¨\r
+ key Down              = S-Down        &Prefix(EmacsMark)      # \81«\r
+ if ( MAP-ESCAPE-TO-META )\r
+   key Escape          = &Prefix(EmacsMarkEscape) &EditNextModifier(M-)\r
+   if ( KBD109 ) and ( ! KBD104on109 )\r
+     key \94¼\8ap/\91S\8ap     = &Prefix(EmacsMarkEscape) &EditNextModifier(M-)\r
+     key E0\94¼\8ap/\91S\8ap   = &Prefix(EmacsMarkEscape) &EditNextModifier(M-)\r
+   endif\r
+ endif\r
+\r
+keymap2 EmacsMarkEscape\r
+ event prefixed                = &HelpMessage("EmacsMark ESC-", " ")\r
+ event before-key-down = &HelpMessage\r
+ key M-C-G             = &Ignore\r
index 9f14b39..fe7f959 100644 (file)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// engine.cpp
-
-
-#include "misc.h"
-
-#include "engine.h"
-#include "errormessage.h"
-#include "hook.h"
-#include "mayurc.h"
-#include "windowstool.h"
-
-#include <iomanip>
-
-#include <process.h>
-
-
-// check focus window
-void Engine::checkFocusWindow()
-{
-  int count = 0;
-  
-  restart:
-  count ++;
-  
-  HWND hwndFore = GetForegroundWindow();
-  DWORD threadId = GetWindowThreadProcessId(hwndFore, NULL);
-
-  if (hwndFore)
-  {
-    {
-      Acquire a(&m_cs);
-      if (m_currentFocusOfThread &&
-         m_currentFocusOfThread->m_threadId == threadId &&
-         m_currentFocusOfThread->m_hwndFocus == m_hwndFocus)
-       return;
-
-      m_emacsEditKillLine.reset();
-      
-      // erase dead thread
-      if (!m_detachedThreadIds.empty())
-      {
-       for (DetachedThreadIds::iterator i = m_detachedThreadIds.begin();
-            i != m_detachedThreadIds.end(); i ++)
-       {
-         FocusOfThreads::iterator j = m_focusOfThreads.find((*i));
-         if (j != m_focusOfThreads.end())
-         {
-           FocusOfThread *fot = &((*j).second);
-           Acquire a(&m_log, 1);
-           m_log << _T("RemoveThread") << std::endl;
-           m_log << _T("\tHWND:\t") << std::hex << (int)fot->m_hwndFocus
-                 << std::dec << std::endl;
-           m_log << _T("\tTHREADID:") << fot->m_threadId << std::endl;
-           m_log << _T("\tCLASS:\t") << fot->m_className << std::endl;
-           m_log << _T("\tTITLE:\t") << fot->m_titleName << std::endl;
-           m_log << std::endl;
-           m_focusOfThreads.erase(j);
-         }
-       }
-       m_detachedThreadIds.erase
-         (m_detachedThreadIds.begin(), m_detachedThreadIds.end());
-      }
-      
-      FocusOfThreads::iterator i = m_focusOfThreads.find(threadId);
-      if (i != m_focusOfThreads.end())
-      {
-       m_currentFocusOfThread = &((*i).second);
-       if (!m_currentFocusOfThread->m_isConsole || 2 <= count)
-       {
-         if (m_currentFocusOfThread->m_keymaps.empty())
-           setCurrentKeymap(NULL);
-         else
-           setCurrentKeymap(*m_currentFocusOfThread->m_keymaps.begin());
-         m_hwndFocus = m_currentFocusOfThread->m_hwndFocus;
-         checkShow(m_hwndFocus);
-       
-         Acquire a(&m_log, 1);
-         m_log << _T("FocusChanged") << std::endl;
-         m_log << _T("\tHWND:\t")
-               << std::hex << (int)m_currentFocusOfThread->m_hwndFocus
-               << std::dec << std::endl;
-         m_log << _T("\tTHREADID:")
-               << m_currentFocusOfThread->m_threadId << std::endl;
-         m_log << _T("\tCLASS:\t")
-               << m_currentFocusOfThread->m_className << std::endl;
-         m_log << _T("\tTITLE:\t")
-               << m_currentFocusOfThread->m_titleName << std::endl;
-         m_log << std::endl;
-         return;
-       }
-      }
-    }
-    
-    _TCHAR className[GANA_MAX_ATOM_LENGTH];
-    if (GetClassName(hwndFore, className, NUMBER_OF(className)))
-    {
-      if (_tcsicmp(className, _T("ConsoleWindowClass")) == 0)
-      {
-       _TCHAR titleName[1024];
-       if (GetWindowText(hwndFore, titleName, NUMBER_OF(titleName)) == 0)
-         titleName[0] = _T('\0');
-       setFocus(hwndFore, threadId, className, titleName, true);
-       Acquire a(&m_log, 1);
-       m_log << _T("HWND:\t") << std::hex << reinterpret_cast<int>(hwndFore)
-             << std::dec << std::endl;
-       m_log << _T("THREADID:") << threadId << std::endl;
-       m_log << _T("CLASS:\t") << className << std::endl;
-       m_log << _T("TITLE:\t") << titleName << std::endl << std::endl;
-       goto restart;
-      }
-    }
-  }
-  
-  Acquire a(&m_cs);
-  if (m_globalFocus.m_keymaps.empty())
-  {
-    Acquire a(&m_log, 1);
-    m_log << _T("NO GLOBAL FOCUS") << std::endl;
-    m_currentFocusOfThread = NULL;
-    setCurrentKeymap(NULL);
-  }
-  else
-  {
-    if (m_currentFocusOfThread != &m_globalFocus)
-    {
-      Acquire a(&m_log, 1);
-      m_log << _T("GLOBAL FOCUS") << std::endl;
-      m_currentFocusOfThread = &m_globalFocus;
-      setCurrentKeymap(m_globalFocus.m_keymaps.front());
-    }
-  }
-  m_hwndFocus = NULL;
-}
-
-
-
-// is modifier pressed ?
-bool Engine::isPressed(Modifier::Type i_mt)
-{
-  const Keymap::ModAssignments &ma = m_currentKeymap->getModAssignments(i_mt);
-  for (Keymap::ModAssignments::const_iterator i = ma.begin();
-       i != ma.end(); ++ i)
-    if ((*i).m_key->m_isPressed)
-      return true;
-  return false;
-}
-
-
-// fix modifier key (if fixed, return true)
-bool Engine::fixModifierKey(ModifiedKey *io_mkey, Keymap::AssignMode *o_am)
-{
-  // for all modifier ...
-  for (int i = Modifier::Type_begin; i != Modifier::Type_end; ++ i)
-  {
-    // get modifier assignments (list of modifier keys)
-    const Keymap::ModAssignments &ma =
-      m_currentKeymap->getModAssignments(static_cast<Modifier::Type>(i));
-    
-    for (Keymap::ModAssignments::const_iterator
-          j = ma.begin(); j != ma.end(); ++ j)
-      if (io_mkey->m_key == (*j).m_key) // is io_mkey a modifier ?
-      {
-       {
-         Acquire a(&m_log, 1);
-         m_log << _T("* Modifier Key") << std::endl;
-       }
-       // set dontcare for this modifier
-       io_mkey->m_modifier.dontcare(static_cast<Modifier::Type>(i));
-       *o_am = (*j).m_assignMode;
-       return true;
-      }
-  }
-  *o_am = Keymap::AM_notModifier;
-  return false;
-}
-
-
-// output to m_log
-void Engine::outputToLog(const Key *i_key, const ModifiedKey &i_mkey,
-                        int i_debugLevel)
-{
-  size_t i;
-  Acquire a(&m_log, i_debugLevel);
-
-  // output scan codes
-  for (i = 0; i < i_key->getScanCodesSize(); ++ i)
-  {
-    if (i_key->getScanCodes()[i].m_flags & ScanCode::E0) m_log << _T("E0-");
-    if (i_key->getScanCodes()[i].m_flags & ScanCode::E1) m_log << _T("E1-");
-    if (!(i_key->getScanCodes()[i].m_flags & ScanCode::E0E1))
-      m_log << _T("   ");
-    m_log << _T("0x") << std::hex << std::setw(2) << std::setfill(_T('0'))
-         << static_cast<int>(i_key->getScanCodes()[i].m_scan)
-         << std::dec << _T(" ");
-  }
-  
-  if (!i_mkey.m_key) // key corresponds to no phisical key
-  {
-    m_log << std::endl;
-    return;
-  }
-  
-  m_log << _T("  ") << i_mkey << std::endl;
-}
-
-
-// describe bindings
-void Engine::describeBindings()
-{
-  Acquire a(&m_log, 0);
-
-  Keymap::DescribeParam dp;
-  for (KeymapPtrList::iterator i = m_currentFocusOfThread->m_keymaps.begin();
-       i != m_currentFocusOfThread->m_keymaps.end(); ++ i)
-    (*i)->describe(m_log, &dp);
-  m_log << std::endl;
-}
-
-
-// update m_lastPressedKey
-void Engine::updateLastPressedKey(Key *i_key)
-{
-  m_lastPressedKey[1] = m_lastPressedKey[0];
-  m_lastPressedKey[0] = i_key;
-}
-
-// set current keymap
-void Engine::setCurrentKeymap(const Keymap *i_keymap, bool i_doesAddToHistory)
-{
-  if (i_doesAddToHistory)
-  {
-    m_keymapPrefixHistory.push_back(const_cast<Keymap *>(m_currentKeymap));
-    if (MAX_KEYMAP_PREFIX_HISTORY < m_keymapPrefixHistory.size())
-      m_keymapPrefixHistory.pop_front();
-  }
-  else
-    m_keymapPrefixHistory.clear();
-  m_currentKeymap = i_keymap;
-}
-
-
-// get current modifiers
-Modifier Engine::getCurrentModifiers(Key *i_key, bool i_isPressed)
-{
-  Modifier cmods;
-  cmods.add(m_currentLock);
-
-  cmods.press(Modifier::Type_Shift  , isPressed(Modifier::Type_Shift  ));
-  cmods.press(Modifier::Type_Alt    , isPressed(Modifier::Type_Alt    ));
-  cmods.press(Modifier::Type_Control, isPressed(Modifier::Type_Control));
-  cmods.press(Modifier::Type_Windows, isPressed(Modifier::Type_Windows));
-  cmods.press(Modifier::Type_Up     , !i_isPressed);
-  cmods.press(Modifier::Type_Down   , i_isPressed);
-
-  cmods.press(Modifier::Type_Repeat , false);
-  if (m_lastPressedKey[0] == i_key)
-  {
-    if (i_isPressed)
-      cmods.press(Modifier::Type_Repeat, true);
-    else
-      if (m_lastPressedKey[1] == i_key)
-       cmods.press(Modifier::Type_Repeat, true);
-  }
-
-  for (int i = Modifier::Type_Mod0; i <= Modifier::Type_Mod9; ++ i)
-    cmods.press(static_cast<Modifier::Type>(i),
-               isPressed(static_cast<Modifier::Type>(i)));
-  
-  return cmods;
-}
-
-
-// generate keyboard event for a key
-void Engine::generateKeyEvent(Key *i_key, bool i_doPress, bool i_isByAssign)
-{
-  // check if key is event
-  bool isEvent = false;
-  for (Key **e = Event::events; *e; ++ e)
-    if (*e == i_key)
-    {
-      isEvent = true;
-      break;
-    }
-
-  bool isAlreadyReleased = false;
-    
-  if (!isEvent)
-  {
-    if (i_doPress && !i_key->m_isPressedOnWin32)
-      ++ m_currentKeyPressCountOnWin32;
-    else if (!i_doPress)
-    {
-      if (i_key->m_isPressedOnWin32)
-       -- m_currentKeyPressCountOnWin32;
-      else
-       isAlreadyReleased = true;
-    }
-    i_key->m_isPressedOnWin32 = i_doPress;
-    
-    if (i_isByAssign)
-      i_key->m_isPressedByAssign = i_doPress;
-
-    Key *sync = m_setting->m_keyboard.getSyncKey();
-    
-    if (!isAlreadyReleased || i_key == sync)
-    {
-      KEYBOARD_INPUT_DATA kid = { 0, 0, 0, 0, 0 };
-      const ScanCode *sc = i_key->getScanCodes();
-      for (size_t i = 0; i < i_key->getScanCodesSize(); ++ i)
-      {
-       kid.MakeCode = sc[i].m_scan;
-       kid.Flags = sc[i].m_flags;
-       if (!i_doPress)
-         kid.Flags |= KEYBOARD_INPUT_DATA::BREAK;
-#ifdef NO_DRIVER
-       injectInput(&kid, NULL);
-#else // !NO_DRIVER
-       DWORD len;
-       WriteFile(m_device, &kid, sizeof(kid), &len, &m_ol);
-       CHECK_TRUE( GetOverlappedResult(m_device, &m_ol, &len, TRUE) );
-#endif // !NO_DRIVER
-      }
-      
-      m_lastGeneratedKey = i_doPress ? i_key : NULL;
-    }
-  }
-  
-  {
-    Acquire a(&m_log, 1);
-    m_log << _T("\t\t    =>\t");
-    if (isAlreadyReleased)
-      m_log << _T("(already released) ");
-  }
-  ModifiedKey mkey(i_key);
-  mkey.m_modifier.on(Modifier::Type_Up, !i_doPress);
-  mkey.m_modifier.on(Modifier::Type_Down, i_doPress);
-  outputToLog(i_key, mkey, 1);
-}
-
-
-// genete event
-void Engine::generateEvents(Current i_c, const Keymap *i_keymap, Key *i_event)
-{
-  // generate
-  i_c.m_keymap = i_keymap;
-  i_c.m_mkey.m_key = i_event;
-  if (const Keymap::KeyAssignment *keyAssign =
-      i_c.m_keymap->searchAssignment(i_c.m_mkey))
-  {
-    {
-      Acquire a(&m_log, 1);
-      m_log << std::endl << _T("           ")
-           << i_event->getName() << std::endl;
-    }
-    generateKeySeqEvents(i_c, keyAssign->m_keySeq, Part_all);
-  }
-}
-
-
-// genete modifier events
-void Engine::generateModifierEvents(const Modifier &i_mod)
-{
-  {
-    Acquire a(&m_log, 1);
-    m_log << _T("* Gen Modifiers\t{") << std::endl;
-  }
-
-  for (int i = Modifier::Type_begin; i < Modifier::Type_BASIC; ++ i)
-  {
-    Keyboard::Mods &mods =
-      m_setting->m_keyboard.getModifiers(static_cast<Modifier::Type>(i));
-
-    if (i_mod.isDontcare(static_cast<Modifier::Type>(i)))
-      // no need to process
-      ;
-    else if (i_mod.isPressed(static_cast<Modifier::Type>(i)))
-      // we have to press this modifier
-    {
-      bool noneIsPressed = true;
-      bool noneIsPressedByAssign = true;
-      for (Keyboard::Mods::iterator i = mods.begin(); i != mods.end(); ++ i)
-      {
-       if ((*i)->m_isPressedOnWin32)
-         noneIsPressed = false;
-       if ((*i)->m_isPressedByAssign)
-         noneIsPressedByAssign = false;
-      }
-      if (noneIsPressed)
-      {
-       if (noneIsPressedByAssign)
-         generateKeyEvent(mods.front(), true, false);
-       else
-         for (Keyboard::Mods::iterator
-                i = mods.begin(); i != mods.end(); ++ i)
-           if ((*i)->m_isPressedByAssign)
-             generateKeyEvent((*i), true, false);
-      }
-    }
-
-    else
-      // we have to release this modifier
-    {
-      // avoid such sequences as  "Alt U-ALt" or "Windows U-Windows"
-      if (i == Modifier::Type_Alt || i == Modifier::Type_Windows)
-      {
-       for (Keyboard::Mods::iterator j = mods.begin(); j != mods.end(); ++ j)
-         if ((*j) == m_lastGeneratedKey)
-         {
-           Keyboard::Mods *mods =
-             &m_setting->m_keyboard.getModifiers(Modifier::Type_Shift);
-           if (mods->size() == 0)
-             mods = &m_setting->m_keyboard.getModifiers(
-               Modifier::Type_Control);
-           if (0 < mods->size())
-           {
-             generateKeyEvent(mods->front(), true, false);
-             generateKeyEvent(mods->front(), false, false);
-           }
-           break;
-         }
-      }
-      
-      for (Keyboard::Mods::iterator j = mods.begin(); j != mods.end(); ++ j)
-      {
-       if ((*j)->m_isPressedOnWin32)
-         generateKeyEvent((*j), false, false);
-      }
-    }
-  }
-  
-  {
-    Acquire a(&m_log, 1);
-    m_log << _T("\t\t}") << std::endl;
-  }
-}
-
-
-// generate keyboard events for action
-void Engine::generateActionEvents(const Current &i_c, const Action *i_a,
-                                 bool i_doPress)
-{
-  switch (i_a->getType())
-  {
-    // key
-    case Action::Type_key:
-    {
-      const ModifiedKey &mkey
-       = reinterpret_cast<ActionKey *>(
-         const_cast<Action *>(i_a))->m_modifiedKey;
-
-      // release
-      if (!i_doPress &&
-         (mkey.m_modifier.isOn(Modifier::Type_Up) ||
-          mkey.m_modifier.isDontcare(Modifier::Type_Up)))
-       generateKeyEvent(mkey.m_key, false, true);
-
-      // press
-      else if (i_doPress &&
-              (mkey.m_modifier.isOn(Modifier::Type_Down) ||
-               mkey.m_modifier.isDontcare(Modifier::Type_Down)))
-      {
-       Modifier modifier = mkey.m_modifier;
-       modifier.add(i_c.m_mkey.m_modifier);
-       generateModifierEvents(modifier);
-       generateKeyEvent(mkey.m_key, true, true);
-      }
-      break;
-    }
-
-    // keyseq
-    case Action::Type_keySeq:
-    {
-      const ActionKeySeq *aks = reinterpret_cast<const ActionKeySeq *>(i_a);
-      generateKeySeqEvents(i_c, aks->m_keySeq,
-                          i_doPress ? Part_down : Part_up);
-      break;
-    }
-
-    // function
-    case Action::Type_function:
-    {
-      const ActionFunction *af = reinterpret_cast<const ActionFunction *>(i_a);
-      bool is_up = (!i_doPress &&
-                   (af->m_modifier.isOn(Modifier::Type_Up) ||
-                    af->m_modifier.isDontcare(Modifier::Type_Up)));
-      bool is_down = (i_doPress &&
-                     (af->m_modifier.isOn(Modifier::Type_Down) ||
-                      af->m_modifier.isDontcare(Modifier::Type_Down)));
-
-      if (!is_down && !is_up)
-       break;
-      
-      {
-       Acquire a(&m_log, 1);
-       m_log << _T("\t\t     >\t") << af->m_functionData;
-      }
-      
-      FunctionParam param;
-      param.m_isPressed = i_doPress;
-      param.m_hwnd = m_currentFocusOfThread->m_hwndFocus;
-      param.m_c = i_c;
-      param.m_doesNeedEndl = true;
-      param.m_af = af;
-      
-      param.m_c.m_mkey.m_modifier.on(Modifier::Type_Up, !i_doPress);
-      param.m_c.m_mkey.m_modifier.on(Modifier::Type_Down, i_doPress);
-
-      af->m_functionData->exec(this, &param);
-      
-      if (param.m_doesNeedEndl)
-      {
-       Acquire a(&m_log, 1);
-       m_log << std::endl;
-      }
-      break;
-    }
-  }
-}
-
-
-// generate keyboard events for keySeq
-void Engine::generateKeySeqEvents(const Current &i_c, const KeySeq *i_keySeq,
-                                 Part i_part)
-{
-  const KeySeq::Actions &actions = i_keySeq->getActions();
-  if (actions.empty())
-    return;
-  if (i_part == Part_up)
-    generateActionEvents(i_c, actions[actions.size() - 1], false);
-  else
-  {
-    size_t i;
-    for (i = 0 ; i < actions.size() - 1; ++ i)
-    {
-      generateActionEvents(i_c, actions[i], true);
-      generateActionEvents(i_c, actions[i], false);
-    }
-    generateActionEvents(i_c, actions[i], true);
-    if (i_part == Part_all)
-      generateActionEvents(i_c, actions[i], false);
-  }
-}
-
-
-// generate keyboard events for current key
-void Engine::generateKeyboardEvents(const Current &i_c)
-{
-  if (++ m_generateKeyboardEventsRecursionGuard ==
-      MAX_GENERATE_KEYBOARD_EVENTS_RECURSION_COUNT)
-  {
-    Acquire a(&m_log);
-    m_log << _T("error: too deep keymap recursion.  there may be a loop.")
-         << std::endl;
-    return;
-  }
-
-  const Keymap::KeyAssignment *keyAssign
-    = i_c.m_keymap->searchAssignment(i_c.m_mkey);
-  if (!keyAssign)
-  {
-    const KeySeq *keySeq = i_c.m_keymap->getDefaultKeySeq();
-    ASSERT( keySeq );
-    generateKeySeqEvents(i_c, keySeq, i_c.isPressed() ? Part_down : Part_up);
-  }
-  else
-  {
-    if (keyAssign->m_modifiedKey.m_modifier.isOn(Modifier::Type_Up) ||
-       keyAssign->m_modifiedKey.m_modifier.isOn(Modifier::Type_Down))
-      generateKeySeqEvents(i_c, keyAssign->m_keySeq, Part_all);
-    else
-      generateKeySeqEvents(i_c, keyAssign->m_keySeq,
-                          i_c.isPressed() ? Part_down : Part_up);
-  }
-  m_generateKeyboardEventsRecursionGuard --;
-}
-
-
-// generate keyboard events for current key
-void Engine::beginGeneratingKeyboardEvents(
-  const Current &i_c, bool i_isModifier)
-{
-  //             (1)             (2)             (3)  (4)   (1)
-  // up/down:    D-              U-              D-   U-    D-
-  // keymap:     m_currentKeymap m_currentKeymap X    X     m_currentKeymap
-  // memo:       &Prefix(X)      ...             ...  ...   ...
-  // m_isPrefix: false           true            true false false
-
-  Current cnew(i_c);
-
-  bool isPhysicallyPressed
-    = cnew.m_mkey.m_modifier.isPressed(Modifier::Type_Down);
-  
-  // substitute
-  ModifiedKey mkey = m_setting->m_keyboard.searchSubstitute(cnew.m_mkey);
-  if (mkey.m_key)
-  {
-    cnew.m_mkey = mkey;
-    if (isPhysicallyPressed)
-    {
-      cnew.m_mkey.m_modifier.off(Modifier::Type_Up);
-      cnew.m_mkey.m_modifier.on(Modifier::Type_Down);
-    }
-    else
-    {
-      cnew.m_mkey.m_modifier.on(Modifier::Type_Up);
-      cnew.m_mkey.m_modifier.off(Modifier::Type_Down);
-    }
-    for (int i = Modifier::Type_begin; i != Modifier::Type_end; ++ i)
-    {
-      Modifier::Type type = static_cast<Modifier::Type>(i);
-      if (cnew.m_mkey.m_modifier.isDontcare(type) &&
-         !i_c.m_mkey.m_modifier.isDontcare(type))
-       cnew.m_mkey.m_modifier.press(
-         type, i_c.m_mkey.m_modifier.isPressed(type));
-    }
-    
-    {
-      Acquire a(&m_log, 1);
-      m_log << _T("* substitute") << std::endl;
-    }
-    outputToLog(mkey.m_key, cnew.m_mkey, 1);
-  }
-  
-  // for prefix key
-  const Keymap *tmpKeymap = m_currentKeymap;
-  if (i_isModifier || !m_isPrefix) ; 
-  else if (isPhysicallyPressed)                        // when (3)
-    m_isPrefix = false;
-  else if (!isPhysicallyPressed)               // when (2)
-    m_currentKeymap = m_currentFocusOfThread->m_keymaps.front();
-  
-  // for m_emacsEditKillLine function
-  m_emacsEditKillLine.m_doForceReset = !i_isModifier;
-
-  // generate key event !
-  m_generateKeyboardEventsRecursionGuard = 0;
-  if (isPhysicallyPressed)
-    generateEvents(cnew, cnew.m_keymap, &Event::before_key_down);
-  generateKeyboardEvents(cnew);
-  if (!isPhysicallyPressed)
-    generateEvents(cnew, cnew.m_keymap, &Event::after_key_up);
-      
-  // for m_emacsEditKillLine function
-  if (m_emacsEditKillLine.m_doForceReset)
-    m_emacsEditKillLine.reset();
-
-  // for prefix key
-  if (i_isModifier)
-    ;
-  else if (!m_isPrefix)                                // when (1), (4)
-    m_currentKeymap = m_currentFocusOfThread->m_keymaps.front();
-  else if (!isPhysicallyPressed)               // when (2)
-    m_currentKeymap = tmpKeymap;
-}
-
-
-#ifdef NO_DRIVER
-unsigned int Engine::injectInput(const KEYBOARD_INPUT_DATA *i_kid, const KBDLLHOOKSTRUCT *i_kidRaw)
-{
-  INPUT kid;
-  kid.type = INPUT_KEYBOARD;
-  kid.ki.wVk = 0;
-  kid.ki.wScan = i_kid->MakeCode;
-  kid.ki.dwFlags = KEYEVENTF_SCANCODE;
-  kid.ki.time = i_kidRaw ? i_kidRaw->time : 0;
-  kid.ki.dwExtraInfo = i_kidRaw ? i_kidRaw->dwExtraInfo : 0;
-  if (i_kid->Flags & KEYBOARD_INPUT_DATA::BREAK)
-  {
-    kid.ki.dwFlags |= KEYEVENTF_KEYUP;
-  }
-  if (i_kid->Flags & KEYBOARD_INPUT_DATA::E0)
-  {
-    kid.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;
-  }
-  SendInput(1, &kid, sizeof(kid));
-  return 1;
-}
-#endif // NO_DRIVER
-
-
-// pop all pressed key on win32
-void Engine::keyboardResetOnWin32()
-{
-  for (Keyboard::KeyIterator
-        i = m_setting->m_keyboard.getKeyIterator();  *i; ++ i)
-  {
-    if ((*i)->m_isPressedOnWin32)
-      generateKeyEvent((*i), false, true);
-  }
-}
-
-
-#ifdef NO_DRIVER
-unsigned int WINAPI Engine::keyboardDetour(Engine *i_this, KBDLLHOOKSTRUCT *i_kid)
-{
-  return i_this->keyboardDetour(i_kid);
-}
-
-unsigned int Engine::keyboardDetour(KBDLLHOOKSTRUCT *i_kid)
-{
-#if 0
-  Acquire a(&m_log, 1);
-  m_log << std::hex
-       << _T("keyboardDetour: vkCode=") << i_kid->vkCode
-       << _T(" scanCode=") << i_kid->scanCode
-       << _T(" flags=") << i_kid->flags << std::endl;
-#endif
-  if (i_kid->flags & LLKHF_INJECTED)
-  {
-    return 0;
-  }
-  else
-  {
-    Key key;
-    KEYBOARD_INPUT_DATA kid;
-
-    kid.UnitId = 0;
-    kid.MakeCode = i_kid->scanCode;
-    kid.Flags = 0;
-    if (i_kid->flags & LLKHF_UP)
-    {
-      kid.Flags |= KEYBOARD_INPUT_DATA::BREAK;
-    }
-    if (i_kid->flags & LLKHF_EXTENDED)
-    {
-         kid.Flags |= KEYBOARD_INPUT_DATA::E0;
-    }
-    kid.Reserved = 0;
-    kid.ExtraInformation = 0;
-
-    Acquire a(&m_cskidq);
-    m_kidq.push_back(kid);
-    SetEvent(m_readEvent);
-    return 1;
-  }
-}
-#endif // NO_DRIVER
-
-// keyboard handler thread
-unsigned int WINAPI Engine::keyboardHandler(void *i_this)
-{
-  reinterpret_cast<Engine *>(i_this)->keyboardHandler();
-  _endthreadex(0);
-  return 0;
-}
-void Engine::keyboardHandler()
-{
-  // initialize ok
-  CHECK_TRUE( SetEvent(m_threadEvent) );
-    
-  // loop
-  Key key;
-  while (!m_doForceTerminate)
-  {
-    KEYBOARD_INPUT_DATA kid;
-    
-#ifndef NO_DRIVER
-    DWORD len;
-#endif // !NO_DRIVER
-    {
-      Acquire a(&m_log, 1);
-      m_log << _T("begin ReadFile();") << std::endl;
-    }
-#ifdef NO_DRIVER
-    if (1)
-    {
-#else // !NO_DRIVER
-    if (!ReadFile(m_device, &kid, sizeof(kid), &len, &m_ol))
-    {
-      if (GetLastError() != ERROR_IO_PENDING)
-       continue;
-#endif // !NO_DRIVER
-      
-      HANDLE handles[] = { m_readEvent, m_interruptThreadEvent };
-    rewait:
-      switch (MsgWaitForMultipleObjects(NUMBER_OF(handles), &handles[0],
-                                    FALSE, INFINITE, QS_POSTMESSAGE))
-      {
-       case WAIT_OBJECT_0:                     // m_readEvent
-#ifdef NO_DRIVER
-       {
-         Acquire a(&m_cskidq);
-         if (m_kidq.empty())
-         {
-           goto rewait;
-         }
-         kid = m_kidq.front();
-         m_kidq.pop_front();
-         if (!m_kidq.empty())
-         {
-           SetEvent(m_readEvent);
-         }
-       }
-#else // !NO_DRIVER
-         if (!GetOverlappedResult(m_device, &m_ol, &len, FALSE))
-           continue;
-#endif // !NO_DRIVER
-         break;
-         
-       case WAIT_OBJECT_0 + 1:                 // m_interruptThreadEvent
-         CancelIo(m_device);
-         switch (m_interruptThreadReason) {
-           default: {
-             ASSERT( false );
-             Acquire a(&m_log, 0);
-             m_log << _T("internal error: m_interruptThreadReason == ")
-                   << m_interruptThreadReason << std::endl;
-             break;
-           }
-             
-           case InterruptThreadReason_Terminate:
-             goto break_while;
-             
-           case InterruptThreadReason_Pause: {
-             CHECK_TRUE( SetEvent(m_threadEvent) );
-             while (WaitForMultipleObjects(1, &m_interruptThreadEvent,
-                                           FALSE, INFINITE) != WAIT_OBJECT_0)
-               ;
-             switch (m_interruptThreadReason) {
-               case InterruptThreadReason_Terminate:
-                 goto break_while;
-
-               case InterruptThreadReason_Resume:
-                 break;
-
-               default:
-                 ASSERT( false );
-                 break;
-             }
-             CHECK_TRUE( SetEvent(m_threadEvent) );
-             break;
-           }
-         }
-         break;
-         
-        case WAIT_OBJECT_0 + NUMBER_OF(handles):
-       {
-         MSG message;
-
-         while (PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
-         {
-           switch (message.message)
-           {
-             case WM_APP + 201:
-             {
-               if (message.wParam)
-               {
-                 m_currentLock.on(Modifier::Type_Touchpad);
-                 m_currentLock.on(Modifier::Type_TouchpadSticky);
-               }
-               else
-                 m_currentLock.off(Modifier::Type_Touchpad);
-               Acquire a(&m_log, 1);
-               m_log << _T("touchpad: ") << message.wParam
-                     << _T(".") << (message.lParam & 0xffff)
-                     << _T(".") << (message.lParam >> 16 & 0xffff)
-                     << std::endl;
-               break;
-             }
-             default:
-               break;
-           }
-         }
-         goto rewait;
-       }
-
-       default:
-         ASSERT( false );
-         continue;
-      }
-    }
-    {
-      Acquire a(&m_log, 1);
-      m_log << _T("end ReadFile();") << std::endl;
-    }
-
-    checkFocusWindow();
-
-    if (!m_setting ||  // m_setting has not been loaded
-       !m_isEnabled)   // disabled
-    {
-      if (m_isLogMode)
-      {
-       Key key;
-       key.addScanCode(ScanCode(kid.MakeCode, kid.Flags));
-       outputToLog(&key, ModifiedKey(), 0);
-      }
-      else
-      {
-#ifdef NO_DRIVER
-       injectInput(&kid, NULL);
-#else // !NO_DRIVER
-       WriteFile(m_device, &kid, sizeof(kid), &len, &m_ol);
-       GetOverlappedResult(m_device, &m_ol, &len, TRUE);
-#endif // !NO_DRIVER
-      }
-      updateLastPressedKey(NULL);
-      continue;
-    }
-    
-    Acquire a(&m_cs);
-
-    if (!m_currentFocusOfThread ||
-       !m_currentKeymap)
-    {
-#ifndef NO_DRIVER
-      WriteFile(m_device, &kid, sizeof(kid), &len, &m_ol);
-      GetOverlappedResult(m_device, &m_ol, &len, TRUE);
-#endif // !NO_DRIVER
-      Acquire a(&m_log, 0);
-      if (!m_currentFocusOfThread)
-       m_log << _T("internal error: m_currentFocusOfThread == NULL")
-             << std::endl;
-      if (!m_currentKeymap)
-       m_log << _T("internal error: m_currentKeymap == NULL")
-             << std::endl;
-      updateLastPressedKey(NULL);
-      continue;
-    }
-    
-    Current c;
-    c.m_keymap = m_currentKeymap;
-    c.m_i = m_currentFocusOfThread->m_keymaps.begin();
-    
-    // search key
-    key.addScanCode(ScanCode(kid.MakeCode, kid.Flags));
-    c.m_mkey = m_setting->m_keyboard.searchKey(key);
-    if (!c.m_mkey.m_key)
-    {
-      c.m_mkey.m_key = m_setting->m_keyboard.searchPrefixKey(key);
-      if (c.m_mkey.m_key)
-       continue;
-    }
-
-    // press the key and update counter
-    bool isPhysicallyPressed
-      = !(key.getScanCodes()[0].m_flags & ScanCode::BREAK);
-    if (c.m_mkey.m_key)
-    {
-      if (!c.m_mkey.m_key->m_isPressed && isPhysicallyPressed)
-       ++ m_currentKeyPressCount;
-      else if (c.m_mkey.m_key->m_isPressed && !isPhysicallyPressed)
-       -- m_currentKeyPressCount;
-      c.m_mkey.m_key->m_isPressed = isPhysicallyPressed;
-    }
-    
-    // create modifiers
-    c.m_mkey.m_modifier = getCurrentModifiers(c.m_mkey.m_key,
-                                             isPhysicallyPressed);
-    Keymap::AssignMode am;
-    bool isModifier = fixModifierKey(&c.m_mkey, &am);
-    if (m_isPrefix)
-    {
-      if (isModifier && m_doesIgnoreModifierForPrefix)
-       am = Keymap::AM_true;
-      if (m_doesEditNextModifier)
-      {
-       Modifier modifier = m_modifierForNextKey;
-       modifier.add(c.m_mkey.m_modifier);
-       c.m_mkey.m_modifier = modifier;
-      }
-    }
-    
-    if (m_isLogMode)
-      outputToLog(&key, c.m_mkey, 0);
-    else if (am == Keymap::AM_true)
-    {
-      {
-       Acquire a(&m_log, 1);
-       m_log << _T("* true modifier") << std::endl;
-      }
-      // true modifier doesn't generate scan code
-      outputToLog(&key, c.m_mkey, 1);
-    }
-    else if (am == Keymap::AM_oneShot || am == Keymap::AM_oneShotRepeatable)
-    {
-      {
-       Acquire a(&m_log, 1);
-       if (am == Keymap::AM_oneShot)
-         m_log << _T("* one shot modifier") << std::endl;
-       else
-         m_log << _T("* one shot repeatable modifier") << std::endl;
-      }
-      // oneShot modifier doesn't generate scan code
-      outputToLog(&key, c.m_mkey, 1);
-      if (isPhysicallyPressed)
-      {
-       if (am == Keymap::AM_oneShotRepeatable  // the key is repeating
-           && m_oneShotKey.m_key == c.m_mkey.m_key)
-       {
-         if (m_oneShotRepeatableRepeatCount <
-             m_setting->m_oneShotRepeatableDelay) {
-           ; // delay
-         } else {
-           Current cnew = c;
-           beginGeneratingKeyboardEvents(cnew, false);
-         }
-         ++ m_oneShotRepeatableRepeatCount;
-       } else {
-         m_oneShotKey = c.m_mkey;
-         m_oneShotRepeatableRepeatCount = 0;
-       }
-      }
-      else
-      {
-       if (m_oneShotKey.m_key)
-       {
-         Current cnew = c;
-         cnew.m_mkey.m_modifier = m_oneShotKey.m_modifier;
-         cnew.m_mkey.m_modifier.off(Modifier::Type_Up);
-         cnew.m_mkey.m_modifier.on(Modifier::Type_Down);
-         beginGeneratingKeyboardEvents(cnew, false);
-         
-         cnew = c;
-         cnew.m_mkey.m_modifier = m_oneShotKey.m_modifier;
-         cnew.m_mkey.m_modifier.on(Modifier::Type_Up);
-         cnew.m_mkey.m_modifier.off(Modifier::Type_Down);
-         beginGeneratingKeyboardEvents(cnew, false);
-       }
-       m_oneShotKey.m_key = NULL;
-       m_oneShotRepeatableRepeatCount = 0;
-      }
-    }
-    else if (c.m_mkey.m_key)
-      // normal key
-    {
-      outputToLog(&key, c.m_mkey, 1);
-      if (isPhysicallyPressed)
-       m_oneShotKey.m_key = NULL;
-      beginGeneratingKeyboardEvents(c, isModifier);
-    }
-    
-    // if counter is zero, reset modifiers and keys on win32
-    if (m_currentKeyPressCount <= 0)
-    {
-      {
-       Acquire a(&m_log, 1);
-       m_log << _T("* No key is pressed") << std::endl;
-      }
-      generateModifierEvents(Modifier());
-      if (0 < m_currentKeyPressCountOnWin32)
-       keyboardResetOnWin32();
-      m_currentKeyPressCount = 0;
-      m_currentKeyPressCountOnWin32 = 0;
-      m_oneShotKey.m_key = NULL;
-      if (m_currentLock.isOn(Modifier::Type_Touchpad) == false)
-       m_currentLock.off(Modifier::Type_TouchpadSticky);
-    }
-    
-    key.initialize();
-    updateLastPressedKey(isPhysicallyPressed ? c.m_mkey.m_key : NULL);
-  }
-  break_while:
-  CHECK_TRUE( SetEvent(m_threadEvent) );
-}
-  
-
-Engine::Engine(tomsgstream &i_log)
-  : m_hwndAssocWindow(NULL),
-    m_setting(NULL),
-    m_device(INVALID_HANDLE_VALUE),
-    m_didMayuStartDevice(false),
-    m_threadEvent(NULL),
-    m_mayudVersion(_T("unknown")),
-    m_readEvent(NULL),
-    m_interruptThreadEvent(NULL),
-    m_sts4mayu(NULL),
-    m_cts4mayu(NULL),
-    m_doForceTerminate(false),
-    m_isLogMode(false),
-    m_isEnabled(true),
-    m_isSynchronizing(false),
-    m_eSync(NULL),
-    m_generateKeyboardEventsRecursionGuard(0),
-    m_currentKeyPressCount(0),
-    m_currentKeyPressCountOnWin32(0),
-    m_lastGeneratedKey(NULL),
-    m_oneShotRepeatableRepeatCount(0),
-    m_isPrefix(false),
-    m_currentKeymap(NULL),
-    m_currentFocusOfThread(NULL),
-    m_hwndFocus(NULL),
-    m_afShellExecute(NULL),
-    m_variable(0),
-    m_log(i_log)
-{
-  for (size_t i = 0; i < NUMBER_OF(m_lastPressedKey); ++ i)
-    m_lastPressedKey[i] = NULL;
-    
-  // set default lock state
-  for (int i = 0; i < Modifier::Type_end; ++ i)
-    m_currentLock.dontcare(static_cast<Modifier::Type>(i));
-  for (int i = Modifier::Type_Lock0; i <= Modifier::Type_Lock9; ++ i)
-    m_currentLock.release(static_cast<Modifier::Type>(i));
-
-#ifndef NO_DRIVER
-  if (!open()) {
-      throw ErrorMessage() << loadString(IDS_driverNotInstalled);
-  }
-#endif // !NO_DRIVER
-  
-#ifndef NO_DRIVER
-  {
-    TCHAR versionBuf[256];
-    DWORD length = 0;
-
-    if (DeviceIoControl(m_device, IOCTL_MAYU_GET_VERSION, NULL, 0,
-                       versionBuf, sizeof(versionBuf), &length, NULL)
-       && length
-       && length < sizeof(versionBuf))                 // fail safe
-       m_mayudVersion = tstring(versionBuf, length / 2);
-  }
-#endif // !NO_DRIVER
-  // create event for sync
-  CHECK_TRUE( m_eSync = CreateEvent(NULL, FALSE, FALSE, NULL) );
-  // create named pipe for &SetImeString
-  m_hookPipe = CreateNamedPipe(addSessionId(HOOK_PIPE_NAME).c_str(),
-                              PIPE_ACCESS_OUTBOUND,
-                              PIPE_TYPE_BYTE, 1,
-                              0, 0, 0, NULL);
-  StrExprArg::setEngine(this);
-}
-
-
-// open mayu device
-bool Engine::open()
-{
-  // open mayu m_device
-#ifndef NO_DRIVER
-  m_device = CreateFile(MAYU_DEVICE_FILE_NAME, GENERIC_READ | GENERIC_WRITE,
-                       0, NULL, OPEN_EXISTING,
-                       FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
-#endif // !NO_DRIVER
-
-  if (m_device != INVALID_HANDLE_VALUE) {
-    return true;
-  }
-
-#ifndef NO_DRIVER
-  // start mayud
-  SC_HANDLE hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
-  if (hscm)
-  {
-    SC_HANDLE hs = OpenService(hscm, MAYU_DRIVER_NAME, SERVICE_START);
-    if (hs)
-    {
-      StartService(hs, 0, NULL);
-      CloseServiceHandle(hs);
-      m_didMayuStartDevice = true;
-    }
-    CloseServiceHandle(hscm);
-  }
-  
-  // open mayu m_device
-  m_device = CreateFile(MAYU_DEVICE_FILE_NAME, GENERIC_READ | GENERIC_WRITE,
-                       0, NULL, OPEN_EXISTING,
-                       FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
-#endif // !NO_DRIVER
-  return (m_device != INVALID_HANDLE_VALUE);
-}
-
-
-// close mayu device
-void Engine::close()
-{
-  if (m_device != INVALID_HANDLE_VALUE) {
-#ifndef NO_DRIVER
-    CHECK_TRUE( CloseHandle(m_device) );
-#endif // !NO_DRIVER
-  }
-  m_device = INVALID_HANDLE_VALUE;
-}
-
-
-// start keyboard handler thread
-void Engine::start()
-{
-  CHECK_TRUE( m_threadEvent = CreateEvent(NULL, FALSE, FALSE, NULL) );
-  
-  CHECK_TRUE( m_readEvent = CreateEvent(NULL, FALSE, FALSE, NULL) );
-  CHECK_TRUE( m_interruptThreadEvent = CreateEvent(NULL, FALSE, FALSE, NULL) );
-  m_ol.Offset = 0;
-  m_ol.OffsetHigh = 0;
-  m_ol.hEvent = m_readEvent;
-  
-  CHECK_TRUE( m_threadHandle = (HANDLE)_beginthreadex(NULL, 0, keyboardHandler, this, 0, &m_threadId) );
-  CHECK( WAIT_OBJECT_0 ==, WaitForSingleObject(m_threadEvent, INFINITE) );
-}
-
-
-// stop keyboard handler thread
-void Engine::stop()
-{
-  if (m_threadEvent)
-  {
-    m_doForceTerminate = true;
-    do
-    {
-      m_interruptThreadReason = InterruptThreadReason_Terminate;
-      SetEvent(m_interruptThreadEvent);
-      //DWORD buf;
-      //M_DeviceIoControl(m_device, IOCTL_MAYU_DETOUR_CANCEL,
-      //                &buf, sizeof(buf), &buf, sizeof(buf), &buf, NULL);
-      
-      // wait for message handler thread terminate
-    } while (WaitForSingleObject(m_threadEvent, 100) != WAIT_OBJECT_0);
-    CHECK_TRUE( CloseHandle(m_threadEvent) );
-    m_threadEvent = NULL;
-    WaitForSingleObject(m_threadHandle, 100);
-    CHECK_TRUE( CloseHandle(m_threadHandle) );
-    m_threadHandle = NULL;
-
-    // stop mayud
-    if (m_didMayuStartDevice)
-    {
-      SC_HANDLE hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
-      if (hscm)
-      {
-       SC_HANDLE hs = OpenService(hscm, MAYU_DRIVER_NAME, SERVICE_STOP);
-       if (hs)
-       {
-         SERVICE_STATUS ss;
-         ControlService(hs, SERVICE_CONTROL_STOP, &ss);
-         CloseServiceHandle(hs);
-       }
-       CloseServiceHandle(hscm);
-      }
-    }
-    
-    CHECK_TRUE( CloseHandle(m_readEvent) );
-    m_readEvent = NULL;
-    CHECK_TRUE( CloseHandle(m_interruptThreadEvent) );
-    m_interruptThreadEvent = NULL;
-  }
-}
-
-bool Engine::pause()
-{
-  if (m_device != INVALID_HANDLE_VALUE) {
-    do {
-      m_interruptThreadReason = InterruptThreadReason_Pause;
-      SetEvent(m_interruptThreadEvent);
-    } while (WaitForSingleObject(m_threadEvent, 100) != WAIT_OBJECT_0);
-#ifndef NO_DRIVER
-    close();
-#endif // !NO_DRIVER
-  }
-  return true;
-}
-
-
-bool Engine::resume()
-{
-  if (m_device == INVALID_HANDLE_VALUE) {
-#ifndef NO_DRIVER
-    if (!open()) {
-      return false;                            // FIXME
-    }
-#endif // !NO_DRIVER
-    do {
-      m_interruptThreadReason = InterruptThreadReason_Resume;
-      SetEvent(m_interruptThreadEvent);
-    } while (WaitForSingleObject(m_threadEvent, 100) != WAIT_OBJECT_0);
-  }
-  return true;
-}
-
-
-bool Engine::prepairQuit()
-{
-  // terminate and unload DLL for ThumbSense support if loaded
-  manageTs4mayu(_T("sts4mayu.dll"), _T("SynCOM.dll"),
-               false, &m_sts4mayu);
-  manageTs4mayu(_T("cts4mayu.dll"), _T("TouchPad.dll"),
-               false, &m_cts4mayu);
-  return true;
-}
-
-
-Engine::~Engine()
-{
-  stop();
-  CHECK_TRUE( CloseHandle(m_eSync) );
-  
-  // close m_device
-#ifndef NO_DRIVER
-  close();
-#endif // !NO_DRIVER
-  // destroy named pipe for &SetImeString
-  if (m_hookPipe && m_hookPipe != INVALID_HANDLE_VALUE)
-  {
-    DisconnectNamedPipe(m_hookPipe);
-    CHECK_TRUE( CloseHandle(m_hookPipe) );
-  }
-}
-
-
-void Engine::manageTs4mayu(TCHAR *i_ts4mayuDllName,
-                          TCHAR *i_dependDllName,
-                          bool i_load, HMODULE *i_pTs4mayu)
-{
-  Acquire a(&m_log, 0);
-
-  if (i_load == false)
-  {
-    if (*i_pTs4mayu)
-    {
-      bool (WINAPI *pTs4mayuTerm)();
-
-      pTs4mayuTerm = (bool (WINAPI*)())GetProcAddress(*i_pTs4mayu, "ts4mayuTerm");
-      if (pTs4mayuTerm() == true)
-       FreeLibrary(*i_pTs4mayu);
-      *i_pTs4mayu = NULL;
-      m_log << i_ts4mayuDllName <<_T(" unloaded") << std::endl;
-    }
-  }
-  else
-  {
-    if (*i_pTs4mayu)
-    {
-      m_log << i_ts4mayuDllName << _T(" already loaded") << std::endl;
-    }
-    else
-    {
-      if (SearchPath(NULL, i_dependDllName, NULL, 0, NULL, NULL) == 0)
-      {
-       m_log << _T("load ") << i_ts4mayuDllName
-             << _T(" failed: can't find ") << i_dependDllName
-             << std::endl;
-      }
-      else
-      {
-       *i_pTs4mayu = LoadLibrary(i_ts4mayuDllName);
-       if (*i_pTs4mayu == NULL)
-       {
-         m_log << _T("load ") << i_ts4mayuDllName
-               << _T(" failed: can't find it") << std::endl;
-       }
-       else
-       {
-         bool (WINAPI *pTs4mayuInit)(UINT);    
-
-         pTs4mayuInit = (bool (WINAPI*)(UINT))GetProcAddress(*i_pTs4mayu, "ts4mayuInit");
-         if (pTs4mayuInit(m_threadId) == true)
-           m_log << i_ts4mayuDllName <<_T(" loaded") << std::endl;
-         else
-           m_log << i_ts4mayuDllName
-                 <<_T(" load failed: can't initialize") << std::endl;
-       }
-      }
-    }
-  }
-}
-
-
-// set m_setting
-bool Engine::setSetting(Setting *i_setting)
-{
-  Acquire a(&m_cs);
-  if (m_isSynchronizing)
-    return false;
-
-  if (m_setting)
-  {
-    for (Keyboard::KeyIterator i = m_setting->m_keyboard.getKeyIterator();
-        *i; ++ i)
-    {
-      Key *key = i_setting->m_keyboard.searchKey(*(*i));
-      if (key)
-      {
-       key->m_isPressed = (*i)->m_isPressed;
-       key->m_isPressedOnWin32 = (*i)->m_isPressedOnWin32;
-       key->m_isPressedByAssign = (*i)->m_isPressedByAssign;
-      }
-    }
-    if (m_lastGeneratedKey)
-      m_lastGeneratedKey =
-       i_setting->m_keyboard.searchKey(*m_lastGeneratedKey);
-    for (size_t i = 0; i < NUMBER_OF(m_lastPressedKey); ++ i)
-      if (m_lastPressedKey[i])
-       m_lastPressedKey[i] =
-         i_setting->m_keyboard.searchKey(*m_lastPressedKey[i]);
-  }
-  
-  m_setting = i_setting;
-
-  manageTs4mayu(_T("sts4mayu.dll"), _T("SynCOM.dll"),
-               m_setting->m_sts4mayu, &m_sts4mayu);
-  manageTs4mayu(_T("cts4mayu.dll"), _T("TouchPad.dll"),
-               m_setting->m_cts4mayu, &m_cts4mayu);
-
-  g_hookData->m_correctKanaLockHandling = m_setting->m_correctKanaLockHandling;
-  if (m_currentFocusOfThread)
-  {
-    for (FocusOfThreads::iterator i = m_focusOfThreads.begin();
-        i != m_focusOfThreads.end(); i ++)
-    {
-      FocusOfThread *fot = &(*i).second;
-      m_setting->m_keymaps.searchWindow(&fot->m_keymaps,
-                                       fot->m_className, fot->m_titleName);
-    }
-  }
-  m_setting->m_keymaps.searchWindow(&m_globalFocus.m_keymaps, _T(""), _T(""));
-  if (m_globalFocus.m_keymaps.empty())
-  {
-    Acquire a(&m_log, 0);
-    m_log << _T("internal error: m_globalFocus.m_keymap is empty")
-         << std::endl;
-  }
-  m_currentFocusOfThread = &m_globalFocus;
-  setCurrentKeymap(m_globalFocus.m_keymaps.front());
-  m_hwndFocus = NULL;
-  return true;
-}
-
-
-void Engine::checkShow(HWND i_hwnd)
-{
-  // update show style of window
-  // this update should be done in hook DLL, but to
-  // avoid update-loss for some applications(such as
-  // cmd.exe), we update here.
-  bool isMaximized = false;
-  bool isMinimized = false;
-  bool isMDIMaximized = false;
-  bool isMDIMinimized = false;
-  while (i_hwnd)
-  {
-#ifdef MAYU64
-    LONG_PTR exStyle = GetWindowLongPtr(i_hwnd, GWL_EXSTYLE);
-#else
-    LONG exStyle = GetWindowLong(i_hwnd, GWL_EXSTYLE);
-#endif
-    if (exStyle & WS_EX_MDICHILD)
-    {
-      WINDOWPLACEMENT placement;
-      placement.length = sizeof(WINDOWPLACEMENT);
-      if (GetWindowPlacement(i_hwnd, &placement))
-      {
-        switch (placement.showCmd)
-        {
-          case SW_SHOWMAXIMIZED:
-            isMDIMaximized = true;
-            break;
-          case SW_SHOWMINIMIZED:
-            isMDIMinimized = true;
-            break;
-          case SW_SHOWNORMAL:
-          default:
-            break;
-        }
-      }
-    }
-
-#ifdef MAYU64
-    LONG_PTR style = GetWindowLongPtr(i_hwnd, GWL_STYLE);
-#else
-    LONG style = GetWindowLong(i_hwnd, GWL_STYLE);
-#endif
-    if ((style & WS_CHILD) == 0)
-    {
-      WINDOWPLACEMENT placement;
-      placement.length = sizeof(WINDOWPLACEMENT);
-      if (GetWindowPlacement(i_hwnd, &placement))
-      {
-        switch (placement.showCmd)
-        {
-          case SW_SHOWMAXIMIZED:
-            isMaximized = true;
-            break;
-          case SW_SHOWMINIMIZED:
-            isMinimized = true;
-            break;
-          case SW_SHOWNORMAL:
-          default:
-            break;
-        }
-      }
-    }  
-    i_hwnd = GetParent(i_hwnd);
-  }
-  setShow(isMDIMaximized, isMDIMinimized, true);
-  setShow(isMaximized, isMinimized, false);
-}
-
-
-// focus
-bool Engine::setFocus(HWND i_hwndFocus, DWORD i_threadId, 
-                     const tstringi &i_className, const tstringi &i_titleName,
-                     bool i_isConsole)
-{
-  Acquire a(&m_cs);
-  if (m_isSynchronizing)
-    return false;
-  if (i_hwndFocus == NULL)
-    return true;
-
-  // remove newly created thread's id from m_detachedThreadIds
-  if (!m_detachedThreadIds.empty())
-  {
-    DetachedThreadIds::iterator i;
-    bool retry;
-    do
-    {
-      retry = false;
-      for (i = m_detachedThreadIds.begin();
-          i != m_detachedThreadIds.end(); ++ i)
-       if (*i == i_threadId)
-       {
-         m_detachedThreadIds.erase(i);
-         retry = true;
-         break;
-       }
-    } while (retry);
-  }
-  
-  FocusOfThread *fot;
-  FocusOfThreads::iterator i = m_focusOfThreads.find(i_threadId);
-  if (i != m_focusOfThreads.end())
-  {
-    fot = &(*i).second;
-    if (fot->m_hwndFocus == i_hwndFocus &&
-       fot->m_isConsole == i_isConsole &&
-       fot->m_className == i_className &&
-       fot->m_titleName == i_titleName)
-      return true;
-  }
-  else
-  {
-    i = m_focusOfThreads.insert(
-      FocusOfThreads::value_type(i_threadId, FocusOfThread())).first;
-    fot = &(*i).second;
-    fot->m_threadId = i_threadId;
-  }
-  fot->m_hwndFocus = i_hwndFocus;
-  fot->m_isConsole = i_isConsole;
-  fot->m_className = i_className;
-  fot->m_titleName = i_titleName;
-  
-  if (m_setting)
-  {
-    m_setting->m_keymaps.searchWindow(&fot->m_keymaps,
-                                     i_className, i_titleName);
-    ASSERT(0 < fot->m_keymaps.size());
-  }
-  else
-    fot->m_keymaps.clear();
-  checkShow(i_hwndFocus);
-  return true;
-}
-
-
-// lock state
-bool Engine::setLockState(bool i_isNumLockToggled,
-                         bool i_isCapsLockToggled,
-                         bool i_isScrollLockToggled,
-                         bool i_isKanaLockToggled,
-                         bool i_isImeLockToggled,
-                         bool i_isImeCompToggled)
-{
-  Acquire a(&m_cs);
-  if (m_isSynchronizing)
-    return false;
-  m_currentLock.on(Modifier::Type_NumLock, i_isNumLockToggled);
-  m_currentLock.on(Modifier::Type_CapsLock, i_isCapsLockToggled);
-  m_currentLock.on(Modifier::Type_ScrollLock, i_isScrollLockToggled);
-  m_currentLock.on(Modifier::Type_KanaLock, i_isKanaLockToggled);
-  m_currentLock.on(Modifier::Type_ImeLock, i_isImeLockToggled);
-  m_currentLock.on(Modifier::Type_ImeComp, i_isImeCompToggled);
-  return true;
-}
-
-
-// show
-bool Engine::setShow(bool i_isMaximized, bool i_isMinimized,
-                    bool i_isMDI)
-{
-  Acquire a(&m_cs);
-  if (m_isSynchronizing)
-    return false;
-  Acquire b(&m_log, 1);
-  Modifier::Type max, min;
-  if (i_isMDI == true) {
-    max = Modifier::Type_MdiMaximized;
-    min = Modifier::Type_MdiMinimized;
-  }
-  else
-  {
-    max = Modifier::Type_Maximized;
-    min = Modifier::Type_Minimized;
-  }
-  m_currentLock.on(max, i_isMaximized);
-  m_currentLock.on(min, i_isMinimized);
-  m_log << _T("Set show to ") << (i_isMaximized ? _T("Maximized") :
-                                 i_isMinimized ? _T("Minimized") : _T("Normal"));
-  if (i_isMDI == true)
-  {
-    m_log << _T(" (MDI)");
-  }
-  m_log << std::endl;
-  return true;
-}
-
-
-// sync
-bool Engine::syncNotify()
-{
-  Acquire a(&m_cs);
-  if (!m_isSynchronizing)
-    return false;
-  CHECK_TRUE( SetEvent(m_eSync) );
-  return true;
-}
-
-
-// thread detach notify
-bool Engine::threadDetachNotify(DWORD i_threadId)
-{
-  Acquire a(&m_cs);
-  m_detachedThreadIds.push_back(i_threadId);
-  return true;
-}
-
-
-// get help message
-void Engine::getHelpMessages(tstring *o_helpMessage, tstring *o_helpTitle)
-{
-  Acquire a(&m_cs);
-  *o_helpMessage = m_helpMessage;
-  *o_helpTitle = m_helpTitle;
-}
-
-
-// command notify
-void Engine::commandNotify(
-  HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam)
-{
-  Acquire b(&m_log, 0);
-  HWND hf = m_hwndFocus;
-  if (!hf)
-    return;
-
-  if (GetWindowThreadProcessId(hf, NULL) == 
-      GetWindowThreadProcessId(m_hwndAssocWindow, NULL))
-    return;    // inhibit the investigation of MADO TSUKAI NO YUUTSU
-
-  const _TCHAR *target = NULL;
-  int number_target = 0;
-  
-  if (i_hwnd == hf)
-    target = _T("ToItself");
-  else if (i_hwnd == GetParent(hf))
-    target = _T("ToParentWindow");
-  else
-  {
-    // Function::toMainWindow
-    HWND h = hf;
-    while (true)
-    {
-      HWND p = GetParent(h);
-      if (!p)
-       break;
-      h = p;
-    }
-    if (i_hwnd == h)
-      target = _T("ToMainWindow");
-    else
-    {
-      // Function::toOverlappedWindow
-      HWND h = hf;
-      while (h)
-      {
-#ifdef MAYU64
-       LONG_PTR style = GetWindowLongPtr(h, GWL_STYLE);
-#else
-       LONG style = GetWindowLong(h, GWL_STYLE);
-#endif
-       if ((style & WS_CHILD) == 0)
-         break;
-       h = GetParent(h);
-      }
-      if (i_hwnd == h)
-       target = _T("ToOverlappedWindow");
-      else
-      {
-       // number
-       HWND h = hf;
-       for (number_target = 0; h; number_target ++, h = GetParent(h))
-         if (i_hwnd == h)
-           break;
-       return;
-      }
-    }
-  }
-
-  m_log << _T("&PostMessage(");
-  if (target)
-    m_log << target;
-  else
-    m_log << number_target;
-  m_log << _T(", ") << i_message
-       << _T(", 0x") << std::hex << i_wParam
-       << _T(", 0x") << i_lParam << _T(") # hwnd = ")
-       << reinterpret_cast<int>(i_hwnd) << _T(", ")
-       << _T("message = ") << std::dec;
-  if (i_message == WM_COMMAND)
-    m_log << _T("WM_COMMAND, ");
-  else if (i_message == WM_SYSCOMMAND)
-    m_log << _T("WM_SYSCOMMAND, ");
-  else
-    m_log << i_message << _T(", ");
-  m_log << _T("wNotifyCode = ") << HIWORD(i_wParam) << _T(", ")
-       << _T("wID = ") << LOWORD(i_wParam) << _T(", ")
-       << _T("hwndCtrl = 0x") << std::hex << i_lParam << std::dec << std::endl;
-}
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// engine.cpp\r
+\r
+\r
+#include "misc.h"\r
+\r
+#include "engine.h"\r
+#include "errormessage.h"\r
+#include "hook.h"\r
+#include "mayurc.h"\r
+#include "windowstool.h"\r
+\r
+#include <iomanip>\r
+\r
+#include <process.h>\r
+\r
+\r
+// check focus window\r
+void Engine::checkFocusWindow()\r
+{\r
+  int count = 0;\r
+  \r
+  restart:\r
+  count ++;\r
+  \r
+  HWND hwndFore = GetForegroundWindow();\r
+  DWORD threadId = GetWindowThreadProcessId(hwndFore, NULL);\r
+\r
+  if (hwndFore)\r
+  {\r
+    {\r
+      Acquire a(&m_cs);\r
+      if (m_currentFocusOfThread &&\r
+         m_currentFocusOfThread->m_threadId == threadId &&\r
+         m_currentFocusOfThread->m_hwndFocus == m_hwndFocus)\r
+       return;\r
+\r
+      m_emacsEditKillLine.reset();\r
+      \r
+      // erase dead thread\r
+      if (!m_detachedThreadIds.empty())\r
+      {\r
+       for (DetachedThreadIds::iterator i = m_detachedThreadIds.begin();\r
+            i != m_detachedThreadIds.end(); i ++)\r
+       {\r
+         FocusOfThreads::iterator j = m_focusOfThreads.find((*i));\r
+         if (j != m_focusOfThreads.end())\r
+         {\r
+           FocusOfThread *fot = &((*j).second);\r
+           Acquire a(&m_log, 1);\r
+           m_log << _T("RemoveThread") << std::endl;\r
+           m_log << _T("\tHWND:\t") << std::hex << (int)fot->m_hwndFocus\r
+                 << std::dec << std::endl;\r
+           m_log << _T("\tTHREADID:") << fot->m_threadId << std::endl;\r
+           m_log << _T("\tCLASS:\t") << fot->m_className << std::endl;\r
+           m_log << _T("\tTITLE:\t") << fot->m_titleName << std::endl;\r
+           m_log << std::endl;\r
+           m_focusOfThreads.erase(j);\r
+         }\r
+       }\r
+       m_detachedThreadIds.erase\r
+         (m_detachedThreadIds.begin(), m_detachedThreadIds.end());\r
+      }\r
+      \r
+      FocusOfThreads::iterator i = m_focusOfThreads.find(threadId);\r
+      if (i != m_focusOfThreads.end())\r
+      {\r
+       m_currentFocusOfThread = &((*i).second);\r
+       if (!m_currentFocusOfThread->m_isConsole || 2 <= count)\r
+       {\r
+         if (m_currentFocusOfThread->m_keymaps.empty())\r
+           setCurrentKeymap(NULL);\r
+         else\r
+           setCurrentKeymap(*m_currentFocusOfThread->m_keymaps.begin());\r
+         m_hwndFocus = m_currentFocusOfThread->m_hwndFocus;\r
+         checkShow(m_hwndFocus);\r
+       \r
+         Acquire a(&m_log, 1);\r
+         m_log << _T("FocusChanged") << std::endl;\r
+         m_log << _T("\tHWND:\t")\r
+               << std::hex << (int)m_currentFocusOfThread->m_hwndFocus\r
+               << std::dec << std::endl;\r
+         m_log << _T("\tTHREADID:")\r
+               << m_currentFocusOfThread->m_threadId << std::endl;\r
+         m_log << _T("\tCLASS:\t")\r
+               << m_currentFocusOfThread->m_className << std::endl;\r
+         m_log << _T("\tTITLE:\t")\r
+               << m_currentFocusOfThread->m_titleName << std::endl;\r
+         m_log << std::endl;\r
+         return;\r
+       }\r
+      }\r
+    }\r
+    \r
+    _TCHAR className[GANA_MAX_ATOM_LENGTH];\r
+    if (GetClassName(hwndFore, className, NUMBER_OF(className)))\r
+    {\r
+      if (_tcsicmp(className, _T("ConsoleWindowClass")) == 0)\r
+      {\r
+       _TCHAR titleName[1024];\r
+       if (GetWindowText(hwndFore, titleName, NUMBER_OF(titleName)) == 0)\r
+         titleName[0] = _T('\0');\r
+       setFocus(hwndFore, threadId, className, titleName, true);\r
+       Acquire a(&m_log, 1);\r
+       m_log << _T("HWND:\t") << std::hex << reinterpret_cast<int>(hwndFore)\r
+             << std::dec << std::endl;\r
+       m_log << _T("THREADID:") << threadId << std::endl;\r
+       m_log << _T("CLASS:\t") << className << std::endl;\r
+       m_log << _T("TITLE:\t") << titleName << std::endl << std::endl;\r
+       goto restart;\r
+      }\r
+    }\r
+  }\r
+  \r
+  Acquire a(&m_cs);\r
+  if (m_globalFocus.m_keymaps.empty())\r
+  {\r
+    Acquire a(&m_log, 1);\r
+    m_log << _T("NO GLOBAL FOCUS") << std::endl;\r
+    m_currentFocusOfThread = NULL;\r
+    setCurrentKeymap(NULL);\r
+  }\r
+  else\r
+  {\r
+    if (m_currentFocusOfThread != &m_globalFocus)\r
+    {\r
+      Acquire a(&m_log, 1);\r
+      m_log << _T("GLOBAL FOCUS") << std::endl;\r
+      m_currentFocusOfThread = &m_globalFocus;\r
+      setCurrentKeymap(m_globalFocus.m_keymaps.front());\r
+    }\r
+  }\r
+  m_hwndFocus = NULL;\r
+}\r
+\r
+\r
+\r
+// is modifier pressed ?\r
+bool Engine::isPressed(Modifier::Type i_mt)\r
+{\r
+  const Keymap::ModAssignments &ma = m_currentKeymap->getModAssignments(i_mt);\r
+  for (Keymap::ModAssignments::const_iterator i = ma.begin();\r
+       i != ma.end(); ++ i)\r
+    if ((*i).m_key->m_isPressed)\r
+      return true;\r
+  return false;\r
+}\r
+\r
+\r
+// fix modifier key (if fixed, return true)\r
+bool Engine::fixModifierKey(ModifiedKey *io_mkey, Keymap::AssignMode *o_am)\r
+{\r
+  // for all modifier ...\r
+  for (int i = Modifier::Type_begin; i != Modifier::Type_end; ++ i)\r
+  {\r
+    // get modifier assignments (list of modifier keys)\r
+    const Keymap::ModAssignments &ma =\r
+      m_currentKeymap->getModAssignments(static_cast<Modifier::Type>(i));\r
+    \r
+    for (Keymap::ModAssignments::const_iterator\r
+          j = ma.begin(); j != ma.end(); ++ j)\r
+      if (io_mkey->m_key == (*j).m_key) // is io_mkey a modifier ?\r
+      {\r
+       {\r
+         Acquire a(&m_log, 1);\r
+         m_log << _T("* Modifier Key") << std::endl;\r
+       }\r
+       // set dontcare for this modifier\r
+       io_mkey->m_modifier.dontcare(static_cast<Modifier::Type>(i));\r
+       *o_am = (*j).m_assignMode;\r
+       return true;\r
+      }\r
+  }\r
+  *o_am = Keymap::AM_notModifier;\r
+  return false;\r
+}\r
+\r
+\r
+// output to m_log\r
+void Engine::outputToLog(const Key *i_key, const ModifiedKey &i_mkey,\r
+                        int i_debugLevel)\r
+{\r
+  size_t i;\r
+  Acquire a(&m_log, i_debugLevel);\r
+\r
+  // output scan codes\r
+  for (i = 0; i < i_key->getScanCodesSize(); ++ i)\r
+  {\r
+    if (i_key->getScanCodes()[i].m_flags & ScanCode::E0) m_log << _T("E0-");\r
+    if (i_key->getScanCodes()[i].m_flags & ScanCode::E1) m_log << _T("E1-");\r
+    if (!(i_key->getScanCodes()[i].m_flags & ScanCode::E0E1))\r
+      m_log << _T("   ");\r
+    m_log << _T("0x") << std::hex << std::setw(2) << std::setfill(_T('0'))\r
+         << static_cast<int>(i_key->getScanCodes()[i].m_scan)\r
+         << std::dec << _T(" ");\r
+  }\r
+  \r
+  if (!i_mkey.m_key) // key corresponds to no phisical key\r
+  {\r
+    m_log << std::endl;\r
+    return;\r
+  }\r
+  \r
+  m_log << _T("  ") << i_mkey << std::endl;\r
+}\r
+\r
+\r
+// describe bindings\r
+void Engine::describeBindings()\r
+{\r
+  Acquire a(&m_log, 0);\r
+\r
+  Keymap::DescribeParam dp;\r
+  for (KeymapPtrList::iterator i = m_currentFocusOfThread->m_keymaps.begin();\r
+       i != m_currentFocusOfThread->m_keymaps.end(); ++ i)\r
+    (*i)->describe(m_log, &dp);\r
+  m_log << std::endl;\r
+}\r
+\r
+\r
+// update m_lastPressedKey\r
+void Engine::updateLastPressedKey(Key *i_key)\r
+{\r
+  m_lastPressedKey[1] = m_lastPressedKey[0];\r
+  m_lastPressedKey[0] = i_key;\r
+}\r
+\r
+// set current keymap\r
+void Engine::setCurrentKeymap(const Keymap *i_keymap, bool i_doesAddToHistory)\r
+{\r
+  if (i_doesAddToHistory)\r
+  {\r
+    m_keymapPrefixHistory.push_back(const_cast<Keymap *>(m_currentKeymap));\r
+    if (MAX_KEYMAP_PREFIX_HISTORY < m_keymapPrefixHistory.size())\r
+      m_keymapPrefixHistory.pop_front();\r
+  }\r
+  else\r
+    m_keymapPrefixHistory.clear();\r
+  m_currentKeymap = i_keymap;\r
+}\r
+\r
+\r
+// get current modifiers\r
+Modifier Engine::getCurrentModifiers(Key *i_key, bool i_isPressed)\r
+{\r
+  Modifier cmods;\r
+  cmods.add(m_currentLock);\r
+\r
+  cmods.press(Modifier::Type_Shift  , isPressed(Modifier::Type_Shift  ));\r
+  cmods.press(Modifier::Type_Alt    , isPressed(Modifier::Type_Alt    ));\r
+  cmods.press(Modifier::Type_Control, isPressed(Modifier::Type_Control));\r
+  cmods.press(Modifier::Type_Windows, isPressed(Modifier::Type_Windows));\r
+  cmods.press(Modifier::Type_Up     , !i_isPressed);\r
+  cmods.press(Modifier::Type_Down   , i_isPressed);\r
+\r
+  cmods.press(Modifier::Type_Repeat , false);\r
+  if (m_lastPressedKey[0] == i_key)\r
+  {\r
+    if (i_isPressed)\r
+      cmods.press(Modifier::Type_Repeat, true);\r
+    else\r
+      if (m_lastPressedKey[1] == i_key)\r
+       cmods.press(Modifier::Type_Repeat, true);\r
+  }\r
+\r
+  for (int i = Modifier::Type_Mod0; i <= Modifier::Type_Mod9; ++ i)\r
+    cmods.press(static_cast<Modifier::Type>(i),\r
+               isPressed(static_cast<Modifier::Type>(i)));\r
+  \r
+  return cmods;\r
+}\r
+\r
+\r
+// generate keyboard event for a key\r
+void Engine::generateKeyEvent(Key *i_key, bool i_doPress, bool i_isByAssign)\r
+{\r
+  // check if key is event\r
+  bool isEvent = false;\r
+  for (Key **e = Event::events; *e; ++ e)\r
+    if (*e == i_key)\r
+    {\r
+      isEvent = true;\r
+      break;\r
+    }\r
+\r
+  bool isAlreadyReleased = false;\r
+    \r
+  if (!isEvent)\r
+  {\r
+    if (i_doPress && !i_key->m_isPressedOnWin32)\r
+      ++ m_currentKeyPressCountOnWin32;\r
+    else if (!i_doPress)\r
+    {\r
+      if (i_key->m_isPressedOnWin32)\r
+       -- m_currentKeyPressCountOnWin32;\r
+      else\r
+       isAlreadyReleased = true;\r
+    }\r
+    i_key->m_isPressedOnWin32 = i_doPress;\r
+    \r
+    if (i_isByAssign)\r
+      i_key->m_isPressedByAssign = i_doPress;\r
+\r
+    Key *sync = m_setting->m_keyboard.getSyncKey();\r
+    \r
+    if (!isAlreadyReleased || i_key == sync)\r
+    {\r
+      KEYBOARD_INPUT_DATA kid = { 0, 0, 0, 0, 0 };\r
+      const ScanCode *sc = i_key->getScanCodes();\r
+      for (size_t i = 0; i < i_key->getScanCodesSize(); ++ i)\r
+      {\r
+       kid.MakeCode = sc[i].m_scan;\r
+       kid.Flags = sc[i].m_flags;\r
+       if (!i_doPress)\r
+         kid.Flags |= KEYBOARD_INPUT_DATA::BREAK;\r
+#ifdef NO_DRIVER\r
+       injectInput(&kid, NULL);\r
+#else // !NO_DRIVER\r
+       DWORD len;\r
+       WriteFile(m_device, &kid, sizeof(kid), &len, &m_ol);\r
+       CHECK_TRUE( GetOverlappedResult(m_device, &m_ol, &len, TRUE) );\r
+#endif // !NO_DRIVER\r
+      }\r
+      \r
+      m_lastGeneratedKey = i_doPress ? i_key : NULL;\r
+    }\r
+  }\r
+  \r
+  {\r
+    Acquire a(&m_log, 1);\r
+    m_log << _T("\t\t    =>\t");\r
+    if (isAlreadyReleased)\r
+      m_log << _T("(already released) ");\r
+  }\r
+  ModifiedKey mkey(i_key);\r
+  mkey.m_modifier.on(Modifier::Type_Up, !i_doPress);\r
+  mkey.m_modifier.on(Modifier::Type_Down, i_doPress);\r
+  outputToLog(i_key, mkey, 1);\r
+}\r
+\r
+\r
+// genete event\r
+void Engine::generateEvents(Current i_c, const Keymap *i_keymap, Key *i_event)\r
+{\r
+  // generate\r
+  i_c.m_keymap = i_keymap;\r
+  i_c.m_mkey.m_key = i_event;\r
+  if (const Keymap::KeyAssignment *keyAssign =\r
+      i_c.m_keymap->searchAssignment(i_c.m_mkey))\r
+  {\r
+    {\r
+      Acquire a(&m_log, 1);\r
+      m_log << std::endl << _T("           ")\r
+           << i_event->getName() << std::endl;\r
+    }\r
+    generateKeySeqEvents(i_c, keyAssign->m_keySeq, Part_all);\r
+  }\r
+}\r
+\r
+\r
+// genete modifier events\r
+void Engine::generateModifierEvents(const Modifier &i_mod)\r
+{\r
+  {\r
+    Acquire a(&m_log, 1);\r
+    m_log << _T("* Gen Modifiers\t{") << std::endl;\r
+  }\r
+\r
+  for (int i = Modifier::Type_begin; i < Modifier::Type_BASIC; ++ i)\r
+  {\r
+    Keyboard::Mods &mods =\r
+      m_setting->m_keyboard.getModifiers(static_cast<Modifier::Type>(i));\r
+\r
+    if (i_mod.isDontcare(static_cast<Modifier::Type>(i)))\r
+      // no need to process\r
+      ;\r
+    else if (i_mod.isPressed(static_cast<Modifier::Type>(i)))\r
+      // we have to press this modifier\r
+    {\r
+      bool noneIsPressed = true;\r
+      bool noneIsPressedByAssign = true;\r
+      for (Keyboard::Mods::iterator i = mods.begin(); i != mods.end(); ++ i)\r
+      {\r
+       if ((*i)->m_isPressedOnWin32)\r
+         noneIsPressed = false;\r
+       if ((*i)->m_isPressedByAssign)\r
+         noneIsPressedByAssign = false;\r
+      }\r
+      if (noneIsPressed)\r
+      {\r
+       if (noneIsPressedByAssign)\r
+         generateKeyEvent(mods.front(), true, false);\r
+       else\r
+         for (Keyboard::Mods::iterator\r
+                i = mods.begin(); i != mods.end(); ++ i)\r
+           if ((*i)->m_isPressedByAssign)\r
+             generateKeyEvent((*i), true, false);\r
+      }\r
+    }\r
+\r
+    else\r
+      // we have to release this modifier\r
+    {\r
+      // avoid such sequences as  "Alt U-ALt" or "Windows U-Windows"\r
+      if (i == Modifier::Type_Alt || i == Modifier::Type_Windows)\r
+      {\r
+       for (Keyboard::Mods::iterator j = mods.begin(); j != mods.end(); ++ j)\r
+         if ((*j) == m_lastGeneratedKey)\r
+         {\r
+           Keyboard::Mods *mods =\r
+             &m_setting->m_keyboard.getModifiers(Modifier::Type_Shift);\r
+           if (mods->size() == 0)\r
+             mods = &m_setting->m_keyboard.getModifiers(\r
+               Modifier::Type_Control);\r
+           if (0 < mods->size())\r
+           {\r
+             generateKeyEvent(mods->front(), true, false);\r
+             generateKeyEvent(mods->front(), false, false);\r
+           }\r
+           break;\r
+         }\r
+      }\r
+      \r
+      for (Keyboard::Mods::iterator j = mods.begin(); j != mods.end(); ++ j)\r
+      {\r
+       if ((*j)->m_isPressedOnWin32)\r
+         generateKeyEvent((*j), false, false);\r
+      }\r
+    }\r
+  }\r
+  \r
+  {\r
+    Acquire a(&m_log, 1);\r
+    m_log << _T("\t\t}") << std::endl;\r
+  }\r
+}\r
+\r
+\r
+// generate keyboard events for action\r
+void Engine::generateActionEvents(const Current &i_c, const Action *i_a,\r
+                                 bool i_doPress)\r
+{\r
+  switch (i_a->getType())\r
+  {\r
+    // key\r
+    case Action::Type_key:\r
+    {\r
+      const ModifiedKey &mkey\r
+       = reinterpret_cast<ActionKey *>(\r
+         const_cast<Action *>(i_a))->m_modifiedKey;\r
+\r
+      // release\r
+      if (!i_doPress &&\r
+         (mkey.m_modifier.isOn(Modifier::Type_Up) ||\r
+          mkey.m_modifier.isDontcare(Modifier::Type_Up)))\r
+       generateKeyEvent(mkey.m_key, false, true);\r
+\r
+      // press\r
+      else if (i_doPress &&\r
+              (mkey.m_modifier.isOn(Modifier::Type_Down) ||\r
+               mkey.m_modifier.isDontcare(Modifier::Type_Down)))\r
+      {\r
+       Modifier modifier = mkey.m_modifier;\r
+       modifier.add(i_c.m_mkey.m_modifier);\r
+       generateModifierEvents(modifier);\r
+       generateKeyEvent(mkey.m_key, true, true);\r
+      }\r
+      break;\r
+    }\r
+\r
+    // keyseq\r
+    case Action::Type_keySeq:\r
+    {\r
+      const ActionKeySeq *aks = reinterpret_cast<const ActionKeySeq *>(i_a);\r
+      generateKeySeqEvents(i_c, aks->m_keySeq,\r
+                          i_doPress ? Part_down : Part_up);\r
+      break;\r
+    }\r
+\r
+    // function\r
+    case Action::Type_function:\r
+    {\r
+      const ActionFunction *af = reinterpret_cast<const ActionFunction *>(i_a);\r
+      bool is_up = (!i_doPress &&\r
+                   (af->m_modifier.isOn(Modifier::Type_Up) ||\r
+                    af->m_modifier.isDontcare(Modifier::Type_Up)));\r
+      bool is_down = (i_doPress &&\r
+                     (af->m_modifier.isOn(Modifier::Type_Down) ||\r
+                      af->m_modifier.isDontcare(Modifier::Type_Down)));\r
+\r
+      if (!is_down && !is_up)\r
+       break;\r
+      \r
+      {\r
+       Acquire a(&m_log, 1);\r
+       m_log << _T("\t\t     >\t") << af->m_functionData;\r
+      }\r
+      \r
+      FunctionParam param;\r
+      param.m_isPressed = i_doPress;\r
+      param.m_hwnd = m_currentFocusOfThread->m_hwndFocus;\r
+      param.m_c = i_c;\r
+      param.m_doesNeedEndl = true;\r
+      param.m_af = af;\r
+      \r
+      param.m_c.m_mkey.m_modifier.on(Modifier::Type_Up, !i_doPress);\r
+      param.m_c.m_mkey.m_modifier.on(Modifier::Type_Down, i_doPress);\r
+\r
+      af->m_functionData->exec(this, &param);\r
+      \r
+      if (param.m_doesNeedEndl)\r
+      {\r
+       Acquire a(&m_log, 1);\r
+       m_log << std::endl;\r
+      }\r
+      break;\r
+    }\r
+  }\r
+}\r
+\r
+\r
+// generate keyboard events for keySeq\r
+void Engine::generateKeySeqEvents(const Current &i_c, const KeySeq *i_keySeq,\r
+                                 Part i_part)\r
+{\r
+  const KeySeq::Actions &actions = i_keySeq->getActions();\r
+  if (actions.empty())\r
+    return;\r
+  if (i_part == Part_up)\r
+    generateActionEvents(i_c, actions[actions.size() - 1], false);\r
+  else\r
+  {\r
+    size_t i;\r
+    for (i = 0 ; i < actions.size() - 1; ++ i)\r
+    {\r
+      generateActionEvents(i_c, actions[i], true);\r
+      generateActionEvents(i_c, actions[i], false);\r
+    }\r
+    generateActionEvents(i_c, actions[i], true);\r
+    if (i_part == Part_all)\r
+      generateActionEvents(i_c, actions[i], false);\r
+  }\r
+}\r
+\r
+\r
+// generate keyboard events for current key\r
+void Engine::generateKeyboardEvents(const Current &i_c)\r
+{\r
+  if (++ m_generateKeyboardEventsRecursionGuard ==\r
+      MAX_GENERATE_KEYBOARD_EVENTS_RECURSION_COUNT)\r
+  {\r
+    Acquire a(&m_log);\r
+    m_log << _T("error: too deep keymap recursion.  there may be a loop.")\r
+         << std::endl;\r
+    return;\r
+  }\r
+\r
+  const Keymap::KeyAssignment *keyAssign\r
+    = i_c.m_keymap->searchAssignment(i_c.m_mkey);\r
+  if (!keyAssign)\r
+  {\r
+    const KeySeq *keySeq = i_c.m_keymap->getDefaultKeySeq();\r
+    ASSERT( keySeq );\r
+    generateKeySeqEvents(i_c, keySeq, i_c.isPressed() ? Part_down : Part_up);\r
+  }\r
+  else\r
+  {\r
+    if (keyAssign->m_modifiedKey.m_modifier.isOn(Modifier::Type_Up) ||\r
+       keyAssign->m_modifiedKey.m_modifier.isOn(Modifier::Type_Down))\r
+      generateKeySeqEvents(i_c, keyAssign->m_keySeq, Part_all);\r
+    else\r
+      generateKeySeqEvents(i_c, keyAssign->m_keySeq,\r
+                          i_c.isPressed() ? Part_down : Part_up);\r
+  }\r
+  m_generateKeyboardEventsRecursionGuard --;\r
+}\r
+\r
+\r
+// generate keyboard events for current key\r
+void Engine::beginGeneratingKeyboardEvents(\r
+  const Current &i_c, bool i_isModifier)\r
+{\r
+  //             (1)             (2)             (3)  (4)   (1)\r
+  // up/down:    D-              U-              D-   U-    D-\r
+  // keymap:     m_currentKeymap m_currentKeymap X    X     m_currentKeymap\r
+  // memo:       &Prefix(X)      ...             ...  ...   ...\r
+  // m_isPrefix: false           true            true false false\r
+\r
+  Current cnew(i_c);\r
+\r
+  bool isPhysicallyPressed\r
+    = cnew.m_mkey.m_modifier.isPressed(Modifier::Type_Down);\r
+  \r
+  // substitute\r
+  ModifiedKey mkey = m_setting->m_keyboard.searchSubstitute(cnew.m_mkey);\r
+  if (mkey.m_key)\r
+  {\r
+    cnew.m_mkey = mkey;\r
+    if (isPhysicallyPressed)\r
+    {\r
+      cnew.m_mkey.m_modifier.off(Modifier::Type_Up);\r
+      cnew.m_mkey.m_modifier.on(Modifier::Type_Down);\r
+    }\r
+    else\r
+    {\r
+      cnew.m_mkey.m_modifier.on(Modifier::Type_Up);\r
+      cnew.m_mkey.m_modifier.off(Modifier::Type_Down);\r
+    }\r
+    for (int i = Modifier::Type_begin; i != Modifier::Type_end; ++ i)\r
+    {\r
+      Modifier::Type type = static_cast<Modifier::Type>(i);\r
+      if (cnew.m_mkey.m_modifier.isDontcare(type) &&\r
+         !i_c.m_mkey.m_modifier.isDontcare(type))\r
+       cnew.m_mkey.m_modifier.press(\r
+         type, i_c.m_mkey.m_modifier.isPressed(type));\r
+    }\r
+    \r
+    {\r
+      Acquire a(&m_log, 1);\r
+      m_log << _T("* substitute") << std::endl;\r
+    }\r
+    outputToLog(mkey.m_key, cnew.m_mkey, 1);\r
+  }\r
+  \r
+  // for prefix key\r
+  const Keymap *tmpKeymap = m_currentKeymap;\r
+  if (i_isModifier || !m_isPrefix) ; \r
+  else if (isPhysicallyPressed)                        // when (3)\r
+    m_isPrefix = false;\r
+  else if (!isPhysicallyPressed)               // when (2)\r
+    m_currentKeymap = m_currentFocusOfThread->m_keymaps.front();\r
+  \r
+  // for m_emacsEditKillLine function\r
+  m_emacsEditKillLine.m_doForceReset = !i_isModifier;\r
+\r
+  // generate key event !\r
+  m_generateKeyboardEventsRecursionGuard = 0;\r
+  if (isPhysicallyPressed)\r
+    generateEvents(cnew, cnew.m_keymap, &Event::before_key_down);\r
+  generateKeyboardEvents(cnew);\r
+  if (!isPhysicallyPressed)\r
+    generateEvents(cnew, cnew.m_keymap, &Event::after_key_up);\r
+      \r
+  // for m_emacsEditKillLine function\r
+  if (m_emacsEditKillLine.m_doForceReset)\r
+    m_emacsEditKillLine.reset();\r
+\r
+  // for prefix key\r
+  if (i_isModifier)\r
+    ;\r
+  else if (!m_isPrefix)                                // when (1), (4)\r
+    m_currentKeymap = m_currentFocusOfThread->m_keymaps.front();\r
+  else if (!isPhysicallyPressed)               // when (2)\r
+    m_currentKeymap = tmpKeymap;\r
+}\r
+\r
+\r
+#ifdef NO_DRIVER\r
+unsigned int Engine::injectInput(const KEYBOARD_INPUT_DATA *i_kid, const KBDLLHOOKSTRUCT *i_kidRaw)\r
+{\r
+  INPUT kid;\r
+  kid.type = INPUT_KEYBOARD;\r
+  kid.ki.wVk = 0;\r
+  kid.ki.wScan = i_kid->MakeCode;\r
+  kid.ki.dwFlags = KEYEVENTF_SCANCODE;\r
+  kid.ki.time = i_kidRaw ? i_kidRaw->time : 0;\r
+  kid.ki.dwExtraInfo = i_kidRaw ? i_kidRaw->dwExtraInfo : 0;\r
+  if (i_kid->Flags & KEYBOARD_INPUT_DATA::BREAK)\r
+  {\r
+    kid.ki.dwFlags |= KEYEVENTF_KEYUP;\r
+  }\r
+  if (i_kid->Flags & KEYBOARD_INPUT_DATA::E0)\r
+  {\r
+    kid.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;\r
+  }\r
+  SendInput(1, &kid, sizeof(kid));\r
+  return 1;\r
+}\r
+#endif // NO_DRIVER\r
+\r
+\r
+// pop all pressed key on win32\r
+void Engine::keyboardResetOnWin32()\r
+{\r
+  for (Keyboard::KeyIterator\r
+        i = m_setting->m_keyboard.getKeyIterator();  *i; ++ i)\r
+  {\r
+    if ((*i)->m_isPressedOnWin32)\r
+      generateKeyEvent((*i), false, true);\r
+  }\r
+}\r
+\r
+\r
+#ifdef NO_DRIVER\r
+unsigned int WINAPI Engine::keyboardDetour(Engine *i_this, KBDLLHOOKSTRUCT *i_kid)\r
+{\r
+  return i_this->keyboardDetour(i_kid);\r
+}\r
+\r
+unsigned int Engine::keyboardDetour(KBDLLHOOKSTRUCT *i_kid)\r
+{\r
+#if 0\r
+  Acquire a(&m_log, 1);\r
+  m_log << std::hex\r
+       << _T("keyboardDetour: vkCode=") << i_kid->vkCode\r
+       << _T(" scanCode=") << i_kid->scanCode\r
+       << _T(" flags=") << i_kid->flags << std::endl;\r
+#endif\r
+  if (i_kid->flags & LLKHF_INJECTED)\r
+  {\r
+    return 0;\r
+  }\r
+  else\r
+  {\r
+    Key key;\r
+    KEYBOARD_INPUT_DATA kid;\r
+\r
+    kid.UnitId = 0;\r
+    kid.MakeCode = i_kid->scanCode;\r
+    kid.Flags = 0;\r
+    if (i_kid->flags & LLKHF_UP)\r
+    {\r
+      kid.Flags |= KEYBOARD_INPUT_DATA::BREAK;\r
+    }\r
+    if (i_kid->flags & LLKHF_EXTENDED)\r
+    {\r
+         kid.Flags |= KEYBOARD_INPUT_DATA::E0;\r
+    }\r
+    kid.Reserved = 0;\r
+    kid.ExtraInformation = 0;\r
+\r
+    Acquire a(&m_cskidq);\r
+    m_kidq.push_back(kid);\r
+    SetEvent(m_readEvent);\r
+    return 1;\r
+  }\r
+}\r
+#endif // NO_DRIVER\r
+\r
+// keyboard handler thread\r
+unsigned int WINAPI Engine::keyboardHandler(void *i_this)\r
+{\r
+  reinterpret_cast<Engine *>(i_this)->keyboardHandler();\r
+  _endthreadex(0);\r
+  return 0;\r
+}\r
+void Engine::keyboardHandler()\r
+{\r
+  // initialize ok\r
+  CHECK_TRUE( SetEvent(m_threadEvent) );\r
+    \r
+  // loop\r
+  Key key;\r
+  while (!m_doForceTerminate)\r
+  {\r
+    KEYBOARD_INPUT_DATA kid;\r
+    \r
+#ifndef NO_DRIVER\r
+    DWORD len;\r
+#endif // !NO_DRIVER\r
+    {\r
+      Acquire a(&m_log, 1);\r
+      m_log << _T("begin ReadFile();") << std::endl;\r
+    }\r
+#ifdef NO_DRIVER\r
+    if (1)\r
+    {\r
+#else // !NO_DRIVER\r
+    if (!ReadFile(m_device, &kid, sizeof(kid), &len, &m_ol))\r
+    {\r
+      if (GetLastError() != ERROR_IO_PENDING)\r
+       continue;\r
+#endif // !NO_DRIVER\r
+      \r
+      HANDLE handles[] = { m_readEvent, m_interruptThreadEvent };\r
+    rewait:\r
+      switch (MsgWaitForMultipleObjects(NUMBER_OF(handles), &handles[0],\r
+                                    FALSE, INFINITE, QS_POSTMESSAGE))\r
+      {\r
+       case WAIT_OBJECT_0:                     // m_readEvent\r
+#ifdef NO_DRIVER\r
+       {\r
+         Acquire a(&m_cskidq);\r
+         if (m_kidq.empty())\r
+         {\r
+           goto rewait;\r
+         }\r
+         kid = m_kidq.front();\r
+         m_kidq.pop_front();\r
+         if (!m_kidq.empty())\r
+         {\r
+           SetEvent(m_readEvent);\r
+         }\r
+       }\r
+#else // !NO_DRIVER\r
+         if (!GetOverlappedResult(m_device, &m_ol, &len, FALSE))\r
+           continue;\r
+#endif // !NO_DRIVER\r
+         break;\r
+         \r
+       case WAIT_OBJECT_0 + 1:                 // m_interruptThreadEvent\r
+         CancelIo(m_device);\r
+         switch (m_interruptThreadReason) {\r
+           default: {\r
+             ASSERT( false );\r
+             Acquire a(&m_log, 0);\r
+             m_log << _T("internal error: m_interruptThreadReason == ")\r
+                   << m_interruptThreadReason << std::endl;\r
+             break;\r
+           }\r
+             \r
+           case InterruptThreadReason_Terminate:\r
+             goto break_while;\r
+             \r
+           case InterruptThreadReason_Pause: {\r
+             CHECK_TRUE( SetEvent(m_threadEvent) );\r
+             while (WaitForMultipleObjects(1, &m_interruptThreadEvent,\r
+                                           FALSE, INFINITE) != WAIT_OBJECT_0)\r
+               ;\r
+             switch (m_interruptThreadReason) {\r
+               case InterruptThreadReason_Terminate:\r
+                 goto break_while;\r
+\r
+               case InterruptThreadReason_Resume:\r
+                 break;\r
+\r
+               default:\r
+                 ASSERT( false );\r
+                 break;\r
+             }\r
+             CHECK_TRUE( SetEvent(m_threadEvent) );\r
+             break;\r
+           }\r
+         }\r
+         break;\r
+         \r
+        case WAIT_OBJECT_0 + NUMBER_OF(handles):\r
+       {\r
+         MSG message;\r
+\r
+         while (PeekMessage(&message, NULL, 0, 0, PM_REMOVE))\r
+         {\r
+           switch (message.message)\r
+           {\r
+             case WM_APP + 201:\r
+             {\r
+               if (message.wParam)\r
+               {\r
+                 m_currentLock.on(Modifier::Type_Touchpad);\r
+                 m_currentLock.on(Modifier::Type_TouchpadSticky);\r
+               }\r
+               else\r
+                 m_currentLock.off(Modifier::Type_Touchpad);\r
+               Acquire a(&m_log, 1);\r
+               m_log << _T("touchpad: ") << message.wParam\r
+                     << _T(".") << (message.lParam & 0xffff)\r
+                     << _T(".") << (message.lParam >> 16 & 0xffff)\r
+                     << std::endl;\r
+               break;\r
+             }\r
+             default:\r
+               break;\r
+           }\r
+         }\r
+         goto rewait;\r
+       }\r
+\r
+       default:\r
+         ASSERT( false );\r
+         continue;\r
+      }\r
+    }\r
+    {\r
+      Acquire a(&m_log, 1);\r
+      m_log << _T("end ReadFile();") << std::endl;\r
+    }\r
+\r
+    checkFocusWindow();\r
+\r
+    if (!m_setting ||  // m_setting has not been loaded\r
+       !m_isEnabled)   // disabled\r
+    {\r
+      if (m_isLogMode)\r
+      {\r
+       Key key;\r
+       key.addScanCode(ScanCode(kid.MakeCode, kid.Flags));\r
+       outputToLog(&key, ModifiedKey(), 0);\r
+      }\r
+      else\r
+      {\r
+#ifdef NO_DRIVER\r
+       injectInput(&kid, NULL);\r
+#else // !NO_DRIVER\r
+       WriteFile(m_device, &kid, sizeof(kid), &len, &m_ol);\r
+       GetOverlappedResult(m_device, &m_ol, &len, TRUE);\r
+#endif // !NO_DRIVER\r
+      }\r
+      updateLastPressedKey(NULL);\r
+      continue;\r
+    }\r
+    \r
+    Acquire a(&m_cs);\r
+\r
+    if (!m_currentFocusOfThread ||\r
+       !m_currentKeymap)\r
+    {\r
+#ifndef NO_DRIVER\r
+      WriteFile(m_device, &kid, sizeof(kid), &len, &m_ol);\r
+      GetOverlappedResult(m_device, &m_ol, &len, TRUE);\r
+#endif // !NO_DRIVER\r
+      Acquire a(&m_log, 0);\r
+      if (!m_currentFocusOfThread)\r
+       m_log << _T("internal error: m_currentFocusOfThread == NULL")\r
+             << std::endl;\r
+      if (!m_currentKeymap)\r
+       m_log << _T("internal error: m_currentKeymap == NULL")\r
+             << std::endl;\r
+      updateLastPressedKey(NULL);\r
+      continue;\r
+    }\r
+    \r
+    Current c;\r
+    c.m_keymap = m_currentKeymap;\r
+    c.m_i = m_currentFocusOfThread->m_keymaps.begin();\r
+    \r
+    // search key\r
+    key.addScanCode(ScanCode(kid.MakeCode, kid.Flags));\r
+    c.m_mkey = m_setting->m_keyboard.searchKey(key);\r
+    if (!c.m_mkey.m_key)\r
+    {\r
+      c.m_mkey.m_key = m_setting->m_keyboard.searchPrefixKey(key);\r
+      if (c.m_mkey.m_key)\r
+       continue;\r
+    }\r
+\r
+    // press the key and update counter\r
+    bool isPhysicallyPressed\r
+      = !(key.getScanCodes()[0].m_flags & ScanCode::BREAK);\r
+    if (c.m_mkey.m_key)\r
+    {\r
+      if (!c.m_mkey.m_key->m_isPressed && isPhysicallyPressed)\r
+       ++ m_currentKeyPressCount;\r
+      else if (c.m_mkey.m_key->m_isPressed && !isPhysicallyPressed)\r
+       -- m_currentKeyPressCount;\r
+      c.m_mkey.m_key->m_isPressed = isPhysicallyPressed;\r
+    }\r
+    \r
+    // create modifiers\r
+    c.m_mkey.m_modifier = getCurrentModifiers(c.m_mkey.m_key,\r
+                                             isPhysicallyPressed);\r
+    Keymap::AssignMode am;\r
+    bool isModifier = fixModifierKey(&c.m_mkey, &am);\r
+    if (m_isPrefix)\r
+    {\r
+      if (isModifier && m_doesIgnoreModifierForPrefix)\r
+       am = Keymap::AM_true;\r
+      if (m_doesEditNextModifier)\r
+      {\r
+       Modifier modifier = m_modifierForNextKey;\r
+       modifier.add(c.m_mkey.m_modifier);\r
+       c.m_mkey.m_modifier = modifier;\r
+      }\r
+    }\r
+    \r
+    if (m_isLogMode)\r
+      outputToLog(&key, c.m_mkey, 0);\r
+    else if (am == Keymap::AM_true)\r
+    {\r
+      {\r
+       Acquire a(&m_log, 1);\r
+       m_log << _T("* true modifier") << std::endl;\r
+      }\r
+      // true modifier doesn't generate scan code\r
+      outputToLog(&key, c.m_mkey, 1);\r
+    }\r
+    else if (am == Keymap::AM_oneShot || am == Keymap::AM_oneShotRepeatable)\r
+    {\r
+      {\r
+       Acquire a(&m_log, 1);\r
+       if (am == Keymap::AM_oneShot)\r
+         m_log << _T("* one shot modifier") << std::endl;\r
+       else\r
+         m_log << _T("* one shot repeatable modifier") << std::endl;\r
+      }\r
+      // oneShot modifier doesn't generate scan code\r
+      outputToLog(&key, c.m_mkey, 1);\r
+      if (isPhysicallyPressed)\r
+      {\r
+       if (am == Keymap::AM_oneShotRepeatable  // the key is repeating\r
+           && m_oneShotKey.m_key == c.m_mkey.m_key)\r
+       {\r
+         if (m_oneShotRepeatableRepeatCount <\r
+             m_setting->m_oneShotRepeatableDelay) {\r
+           ; // delay\r
+         } else {\r
+           Current cnew = c;\r
+           beginGeneratingKeyboardEvents(cnew, false);\r
+         }\r
+         ++ m_oneShotRepeatableRepeatCount;\r
+       } else {\r
+         m_oneShotKey = c.m_mkey;\r
+         m_oneShotRepeatableRepeatCount = 0;\r
+       }\r
+      }\r
+      else\r
+      {\r
+       if (m_oneShotKey.m_key)\r
+       {\r
+         Current cnew = c;\r
+         cnew.m_mkey.m_modifier = m_oneShotKey.m_modifier;\r
+         cnew.m_mkey.m_modifier.off(Modifier::Type_Up);\r
+         cnew.m_mkey.m_modifier.on(Modifier::Type_Down);\r
+         beginGeneratingKeyboardEvents(cnew, false);\r
+         \r
+         cnew = c;\r
+         cnew.m_mkey.m_modifier = m_oneShotKey.m_modifier;\r
+         cnew.m_mkey.m_modifier.on(Modifier::Type_Up);\r
+         cnew.m_mkey.m_modifier.off(Modifier::Type_Down);\r
+         beginGeneratingKeyboardEvents(cnew, false);\r
+       }\r
+       m_oneShotKey.m_key = NULL;\r
+       m_oneShotRepeatableRepeatCount = 0;\r
+      }\r
+    }\r
+    else if (c.m_mkey.m_key)\r
+      // normal key\r
+    {\r
+      outputToLog(&key, c.m_mkey, 1);\r
+      if (isPhysicallyPressed)\r
+       m_oneShotKey.m_key = NULL;\r
+      beginGeneratingKeyboardEvents(c, isModifier);\r
+    }\r
+    \r
+    // if counter is zero, reset modifiers and keys on win32\r
+    if (m_currentKeyPressCount <= 0)\r
+    {\r
+      {\r
+       Acquire a(&m_log, 1);\r
+       m_log << _T("* No key is pressed") << std::endl;\r
+      }\r
+      generateModifierEvents(Modifier());\r
+      if (0 < m_currentKeyPressCountOnWin32)\r
+       keyboardResetOnWin32();\r
+      m_currentKeyPressCount = 0;\r
+      m_currentKeyPressCountOnWin32 = 0;\r
+      m_oneShotKey.m_key = NULL;\r
+      if (m_currentLock.isOn(Modifier::Type_Touchpad) == false)\r
+       m_currentLock.off(Modifier::Type_TouchpadSticky);\r
+    }\r
+    \r
+    key.initialize();\r
+    updateLastPressedKey(isPhysicallyPressed ? c.m_mkey.m_key : NULL);\r
+  }\r
+  break_while:\r
+  CHECK_TRUE( SetEvent(m_threadEvent) );\r
+}\r
+  \r
+\r
+Engine::Engine(tomsgstream &i_log)\r
+  : m_hwndAssocWindow(NULL),\r
+    m_setting(NULL),\r
+    m_device(INVALID_HANDLE_VALUE),\r
+    m_didMayuStartDevice(false),\r
+    m_threadEvent(NULL),\r
+    m_mayudVersion(_T("unknown")),\r
+    m_readEvent(NULL),\r
+    m_interruptThreadEvent(NULL),\r
+    m_sts4mayu(NULL),\r
+    m_cts4mayu(NULL),\r
+    m_doForceTerminate(false),\r
+    m_isLogMode(false),\r
+    m_isEnabled(true),\r
+    m_isSynchronizing(false),\r
+    m_eSync(NULL),\r
+    m_generateKeyboardEventsRecursionGuard(0),\r
+    m_currentKeyPressCount(0),\r
+    m_currentKeyPressCountOnWin32(0),\r
+    m_lastGeneratedKey(NULL),\r
+    m_oneShotRepeatableRepeatCount(0),\r
+    m_isPrefix(false),\r
+    m_currentKeymap(NULL),\r
+    m_currentFocusOfThread(NULL),\r
+    m_hwndFocus(NULL),\r
+    m_afShellExecute(NULL),\r
+    m_variable(0),\r
+    m_log(i_log)\r
+{\r
+  for (size_t i = 0; i < NUMBER_OF(m_lastPressedKey); ++ i)\r
+    m_lastPressedKey[i] = NULL;\r
+    \r
+  // set default lock state\r
+  for (int i = 0; i < Modifier::Type_end; ++ i)\r
+    m_currentLock.dontcare(static_cast<Modifier::Type>(i));\r
+  for (int i = Modifier::Type_Lock0; i <= Modifier::Type_Lock9; ++ i)\r
+    m_currentLock.release(static_cast<Modifier::Type>(i));\r
+\r
+#ifndef NO_DRIVER\r
+  if (!open()) {\r
+      throw ErrorMessage() << loadString(IDS_driverNotInstalled);\r
+  }\r
+#endif // !NO_DRIVER\r
+  \r
+#ifndef NO_DRIVER\r
+  {\r
+    TCHAR versionBuf[256];\r
+    DWORD length = 0;\r
+\r
+    if (DeviceIoControl(m_device, IOCTL_MAYU_GET_VERSION, NULL, 0,\r
+                       versionBuf, sizeof(versionBuf), &length, NULL)\r
+       && length\r
+       && length < sizeof(versionBuf))                 // fail safe\r
+       m_mayudVersion = tstring(versionBuf, length / 2);\r
+  }\r
+#endif // !NO_DRIVER\r
+  // create event for sync\r
+  CHECK_TRUE( m_eSync = CreateEvent(NULL, FALSE, FALSE, NULL) );\r
+  // create named pipe for &SetImeString\r
+  m_hookPipe = CreateNamedPipe(addSessionId(HOOK_PIPE_NAME).c_str(),\r
+                              PIPE_ACCESS_OUTBOUND,\r
+                              PIPE_TYPE_BYTE, 1,\r
+                              0, 0, 0, NULL);\r
+  StrExprArg::setEngine(this);\r
+}\r
+\r
+\r
+// open mayu device\r
+bool Engine::open()\r
+{\r
+  // open mayu m_device\r
+#ifndef NO_DRIVER\r
+  m_device = CreateFile(MAYU_DEVICE_FILE_NAME, GENERIC_READ | GENERIC_WRITE,\r
+                       0, NULL, OPEN_EXISTING,\r
+                       FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);\r
+#endif // !NO_DRIVER\r
+\r
+  if (m_device != INVALID_HANDLE_VALUE) {\r
+    return true;\r
+  }\r
+\r
+#ifndef NO_DRIVER\r
+  // start mayud\r
+  SC_HANDLE hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);\r
+  if (hscm)\r
+  {\r
+    SC_HANDLE hs = OpenService(hscm, MAYU_DRIVER_NAME, SERVICE_START);\r
+    if (hs)\r
+    {\r
+      StartService(hs, 0, NULL);\r
+      CloseServiceHandle(hs);\r
+      m_didMayuStartDevice = true;\r
+    }\r
+    CloseServiceHandle(hscm);\r
+  }\r
+  \r
+  // open mayu m_device\r
+  m_device = CreateFile(MAYU_DEVICE_FILE_NAME, GENERIC_READ | GENERIC_WRITE,\r
+                       0, NULL, OPEN_EXISTING,\r
+                       FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);\r
+#endif // !NO_DRIVER\r
+  return (m_device != INVALID_HANDLE_VALUE);\r
+}\r
+\r
+\r
+// close mayu device\r
+void Engine::close()\r
+{\r
+  if (m_device != INVALID_HANDLE_VALUE) {\r
+#ifndef NO_DRIVER\r
+    CHECK_TRUE( CloseHandle(m_device) );\r
+#endif // !NO_DRIVER\r
+  }\r
+  m_device = INVALID_HANDLE_VALUE;\r
+}\r
+\r
+\r
+// start keyboard handler thread\r
+void Engine::start()\r
+{\r
+  CHECK_TRUE( m_threadEvent = CreateEvent(NULL, FALSE, FALSE, NULL) );\r
+  \r
+  CHECK_TRUE( m_readEvent = CreateEvent(NULL, FALSE, FALSE, NULL) );\r
+  CHECK_TRUE( m_interruptThreadEvent = CreateEvent(NULL, FALSE, FALSE, NULL) );\r
+  m_ol.Offset = 0;\r
+  m_ol.OffsetHigh = 0;\r
+  m_ol.hEvent = m_readEvent;\r
+  \r
+  CHECK_TRUE( m_threadHandle = (HANDLE)_beginthreadex(NULL, 0, keyboardHandler, this, 0, &m_threadId) );\r
+  CHECK( WAIT_OBJECT_0 ==, WaitForSingleObject(m_threadEvent, INFINITE) );\r
+}\r
+\r
+\r
+// stop keyboard handler thread\r
+void Engine::stop()\r
+{\r
+  if (m_threadEvent)\r
+  {\r
+    m_doForceTerminate = true;\r
+    do\r
+    {\r
+      m_interruptThreadReason = InterruptThreadReason_Terminate;\r
+      SetEvent(m_interruptThreadEvent);\r
+      //DWORD buf;\r
+      //M_DeviceIoControl(m_device, IOCTL_MAYU_DETOUR_CANCEL,\r
+      //                &buf, sizeof(buf), &buf, sizeof(buf), &buf, NULL);\r
+      \r
+      // wait for message handler thread terminate\r
+    } while (WaitForSingleObject(m_threadEvent, 100) != WAIT_OBJECT_0);\r
+    CHECK_TRUE( CloseHandle(m_threadEvent) );\r
+    m_threadEvent = NULL;\r
+    WaitForSingleObject(m_threadHandle, 100);\r
+    CHECK_TRUE( CloseHandle(m_threadHandle) );\r
+    m_threadHandle = NULL;\r
+\r
+    // stop mayud\r
+    if (m_didMayuStartDevice)\r
+    {\r
+      SC_HANDLE hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);\r
+      if (hscm)\r
+      {\r
+       SC_HANDLE hs = OpenService(hscm, MAYU_DRIVER_NAME, SERVICE_STOP);\r
+       if (hs)\r
+       {\r
+         SERVICE_STATUS ss;\r
+         ControlService(hs, SERVICE_CONTROL_STOP, &ss);\r
+         CloseServiceHandle(hs);\r
+       }\r
+       CloseServiceHandle(hscm);\r
+      }\r
+    }\r
+    \r
+    CHECK_TRUE( CloseHandle(m_readEvent) );\r
+    m_readEvent = NULL;\r
+    CHECK_TRUE( CloseHandle(m_interruptThreadEvent) );\r
+    m_interruptThreadEvent = NULL;\r
+  }\r
+}\r
+\r
+bool Engine::pause()\r
+{\r
+  if (m_device != INVALID_HANDLE_VALUE) {\r
+    do {\r
+      m_interruptThreadReason = InterruptThreadReason_Pause;\r
+      SetEvent(m_interruptThreadEvent);\r
+    } while (WaitForSingleObject(m_threadEvent, 100) != WAIT_OBJECT_0);\r
+#ifndef NO_DRIVER\r
+    close();\r
+#endif // !NO_DRIVER\r
+  }\r
+  return true;\r
+}\r
+\r
+\r
+bool Engine::resume()\r
+{\r
+  if (m_device == INVALID_HANDLE_VALUE) {\r
+#ifndef NO_DRIVER\r
+    if (!open()) {\r
+      return false;                            // FIXME\r
+    }\r
+#endif // !NO_DRIVER\r
+    do {\r
+      m_interruptThreadReason = InterruptThreadReason_Resume;\r
+      SetEvent(m_interruptThreadEvent);\r
+    } while (WaitForSingleObject(m_threadEvent, 100) != WAIT_OBJECT_0);\r
+  }\r
+  return true;\r
+}\r
+\r
+\r
+bool Engine::prepairQuit()\r
+{\r
+  // terminate and unload DLL for ThumbSense support if loaded\r
+  manageTs4mayu(_T("sts4mayu.dll"), _T("SynCOM.dll"),\r
+               false, &m_sts4mayu);\r
+  manageTs4mayu(_T("cts4mayu.dll"), _T("TouchPad.dll"),\r
+               false, &m_cts4mayu);\r
+  return true;\r
+}\r
+\r
+\r
+Engine::~Engine()\r
+{\r
+  stop();\r
+  CHECK_TRUE( CloseHandle(m_eSync) );\r
+  \r
+  // close m_device\r
+#ifndef NO_DRIVER\r
+  close();\r
+#endif // !NO_DRIVER\r
+  // destroy named pipe for &SetImeString\r
+  if (m_hookPipe && m_hookPipe != INVALID_HANDLE_VALUE)\r
+  {\r
+    DisconnectNamedPipe(m_hookPipe);\r
+    CHECK_TRUE( CloseHandle(m_hookPipe) );\r
+  }\r
+}\r
+\r
+\r
+void Engine::manageTs4mayu(TCHAR *i_ts4mayuDllName,\r
+                          TCHAR *i_dependDllName,\r
+                          bool i_load, HMODULE *i_pTs4mayu)\r
+{\r
+  Acquire a(&m_log, 0);\r
+\r
+  if (i_load == false)\r
+  {\r
+    if (*i_pTs4mayu)\r
+    {\r
+      bool (WINAPI *pTs4mayuTerm)();\r
+\r
+      pTs4mayuTerm = (bool (WINAPI*)())GetProcAddress(*i_pTs4mayu, "ts4mayuTerm");\r
+      if (pTs4mayuTerm() == true)\r
+       FreeLibrary(*i_pTs4mayu);\r
+      *i_pTs4mayu = NULL;\r
+      m_log << i_ts4mayuDllName <<_T(" unloaded") << std::endl;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    if (*i_pTs4mayu)\r
+    {\r
+      m_log << i_ts4mayuDllName << _T(" already loaded") << std::endl;\r
+    }\r
+    else\r
+    {\r
+      if (SearchPath(NULL, i_dependDllName, NULL, 0, NULL, NULL) == 0)\r
+      {\r
+       m_log << _T("load ") << i_ts4mayuDllName\r
+             << _T(" failed: can't find ") << i_dependDllName\r
+             << std::endl;\r
+      }\r
+      else\r
+      {\r
+       *i_pTs4mayu = LoadLibrary(i_ts4mayuDllName);\r
+       if (*i_pTs4mayu == NULL)\r
+       {\r
+         m_log << _T("load ") << i_ts4mayuDllName\r
+               << _T(" failed: can't find it") << std::endl;\r
+       }\r
+       else\r
+       {\r
+         bool (WINAPI *pTs4mayuInit)(UINT);    \r
+\r
+         pTs4mayuInit = (bool (WINAPI*)(UINT))GetProcAddress(*i_pTs4mayu, "ts4mayuInit");\r
+         if (pTs4mayuInit(m_threadId) == true)\r
+           m_log << i_ts4mayuDllName <<_T(" loaded") << std::endl;\r
+         else\r
+           m_log << i_ts4mayuDllName\r
+                 <<_T(" load failed: can't initialize") << std::endl;\r
+       }\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
+\r
+// set m_setting\r
+bool Engine::setSetting(Setting *i_setting)\r
+{\r
+  Acquire a(&m_cs);\r
+  if (m_isSynchronizing)\r
+    return false;\r
+\r
+  if (m_setting)\r
+  {\r
+    for (Keyboard::KeyIterator i = m_setting->m_keyboard.getKeyIterator();\r
+        *i; ++ i)\r
+    {\r
+      Key *key = i_setting->m_keyboard.searchKey(*(*i));\r
+      if (key)\r
+      {\r
+       key->m_isPressed = (*i)->m_isPressed;\r
+       key->m_isPressedOnWin32 = (*i)->m_isPressedOnWin32;\r
+       key->m_isPressedByAssign = (*i)->m_isPressedByAssign;\r
+      }\r
+    }\r
+    if (m_lastGeneratedKey)\r
+      m_lastGeneratedKey =\r
+       i_setting->m_keyboard.searchKey(*m_lastGeneratedKey);\r
+    for (size_t i = 0; i < NUMBER_OF(m_lastPressedKey); ++ i)\r
+      if (m_lastPressedKey[i])\r
+       m_lastPressedKey[i] =\r
+         i_setting->m_keyboard.searchKey(*m_lastPressedKey[i]);\r
+  }\r
+  \r
+  m_setting = i_setting;\r
+\r
+  manageTs4mayu(_T("sts4mayu.dll"), _T("SynCOM.dll"),\r
+               m_setting->m_sts4mayu, &m_sts4mayu);\r
+  manageTs4mayu(_T("cts4mayu.dll"), _T("TouchPad.dll"),\r
+               m_setting->m_cts4mayu, &m_cts4mayu);\r
+\r
+  g_hookData->m_correctKanaLockHandling = m_setting->m_correctKanaLockHandling;\r
+  if (m_currentFocusOfThread)\r
+  {\r
+    for (FocusOfThreads::iterator i = m_focusOfThreads.begin();\r
+        i != m_focusOfThreads.end(); i ++)\r
+    {\r
+      FocusOfThread *fot = &(*i).second;\r
+      m_setting->m_keymaps.searchWindow(&fot->m_keymaps,\r
+                                       fot->m_className, fot->m_titleName);\r
+    }\r
+  }\r
+  m_setting->m_keymaps.searchWindow(&m_globalFocus.m_keymaps, _T(""), _T(""));\r
+  if (m_globalFocus.m_keymaps.empty())\r
+  {\r
+    Acquire a(&m_log, 0);\r
+    m_log << _T("internal error: m_globalFocus.m_keymap is empty")\r
+         << std::endl;\r
+  }\r
+  m_currentFocusOfThread = &m_globalFocus;\r
+  setCurrentKeymap(m_globalFocus.m_keymaps.front());\r
+  m_hwndFocus = NULL;\r
+  return true;\r
+}\r
+\r
+\r
+void Engine::checkShow(HWND i_hwnd)\r
+{\r
+  // update show style of window\r
+  // this update should be done in hook DLL, but to\r
+  // avoid update-loss for some applications(such as\r
+  // cmd.exe), we update here.\r
+  bool isMaximized = false;\r
+  bool isMinimized = false;\r
+  bool isMDIMaximized = false;\r
+  bool isMDIMinimized = false;\r
+  while (i_hwnd)\r
+  {\r
+#ifdef MAYU64\r
+    LONG_PTR exStyle = GetWindowLongPtr(i_hwnd, GWL_EXSTYLE);\r
+#else\r
+    LONG exStyle = GetWindowLong(i_hwnd, GWL_EXSTYLE);\r
+#endif\r
+    if (exStyle & WS_EX_MDICHILD)\r
+    {\r
+      WINDOWPLACEMENT placement;\r
+      placement.length = sizeof(WINDOWPLACEMENT);\r
+      if (GetWindowPlacement(i_hwnd, &placement))\r
+      {\r
+        switch (placement.showCmd)\r
+        {\r
+          case SW_SHOWMAXIMIZED:\r
+            isMDIMaximized = true;\r
+            break;\r
+          case SW_SHOWMINIMIZED:\r
+            isMDIMinimized = true;\r
+            break;\r
+          case SW_SHOWNORMAL:\r
+          default:\r
+            break;\r
+        }\r
+      }\r
+    }\r
+\r
+#ifdef MAYU64\r
+    LONG_PTR style = GetWindowLongPtr(i_hwnd, GWL_STYLE);\r
+#else\r
+    LONG style = GetWindowLong(i_hwnd, GWL_STYLE);\r
+#endif\r
+    if ((style & WS_CHILD) == 0)\r
+    {\r
+      WINDOWPLACEMENT placement;\r
+      placement.length = sizeof(WINDOWPLACEMENT);\r
+      if (GetWindowPlacement(i_hwnd, &placement))\r
+      {\r
+        switch (placement.showCmd)\r
+        {\r
+          case SW_SHOWMAXIMIZED:\r
+            isMaximized = true;\r
+            break;\r
+          case SW_SHOWMINIMIZED:\r
+            isMinimized = true;\r
+            break;\r
+          case SW_SHOWNORMAL:\r
+          default:\r
+            break;\r
+        }\r
+      }\r
+    }  \r
+    i_hwnd = GetParent(i_hwnd);\r
+  }\r
+  setShow(isMDIMaximized, isMDIMinimized, true);\r
+  setShow(isMaximized, isMinimized, false);\r
+}\r
+\r
+\r
+// focus\r
+bool Engine::setFocus(HWND i_hwndFocus, DWORD i_threadId, \r
+                     const tstringi &i_className, const tstringi &i_titleName,\r
+                     bool i_isConsole)\r
+{\r
+  Acquire a(&m_cs);\r
+  if (m_isSynchronizing)\r
+    return false;\r
+  if (i_hwndFocus == NULL)\r
+    return true;\r
+\r
+  // remove newly created thread's id from m_detachedThreadIds\r
+  if (!m_detachedThreadIds.empty())\r
+  {\r
+    DetachedThreadIds::iterator i;\r
+    bool retry;\r
+    do\r
+    {\r
+      retry = false;\r
+      for (i = m_detachedThreadIds.begin();\r
+          i != m_detachedThreadIds.end(); ++ i)\r
+       if (*i == i_threadId)\r
+       {\r
+         m_detachedThreadIds.erase(i);\r
+         retry = true;\r
+         break;\r
+       }\r
+    } while (retry);\r
+  }\r
+  \r
+  FocusOfThread *fot;\r
+  FocusOfThreads::iterator i = m_focusOfThreads.find(i_threadId);\r
+  if (i != m_focusOfThreads.end())\r
+  {\r
+    fot = &(*i).second;\r
+    if (fot->m_hwndFocus == i_hwndFocus &&\r
+       fot->m_isConsole == i_isConsole &&\r
+       fot->m_className == i_className &&\r
+       fot->m_titleName == i_titleName)\r
+      return true;\r
+  }\r
+  else\r
+  {\r
+    i = m_focusOfThreads.insert(\r
+      FocusOfThreads::value_type(i_threadId, FocusOfThread())).first;\r
+    fot = &(*i).second;\r
+    fot->m_threadId = i_threadId;\r
+  }\r
+  fot->m_hwndFocus = i_hwndFocus;\r
+  fot->m_isConsole = i_isConsole;\r
+  fot->m_className = i_className;\r
+  fot->m_titleName = i_titleName;\r
+  \r
+  if (m_setting)\r
+  {\r
+    m_setting->m_keymaps.searchWindow(&fot->m_keymaps,\r
+                                     i_className, i_titleName);\r
+    ASSERT(0 < fot->m_keymaps.size());\r
+  }\r
+  else\r
+    fot->m_keymaps.clear();\r
+  checkShow(i_hwndFocus);\r
+  return true;\r
+}\r
+\r
+\r
+// lock state\r
+bool Engine::setLockState(bool i_isNumLockToggled,\r
+                         bool i_isCapsLockToggled,\r
+                         bool i_isScrollLockToggled,\r
+                         bool i_isKanaLockToggled,\r
+                         bool i_isImeLockToggled,\r
+                         bool i_isImeCompToggled)\r
+{\r
+  Acquire a(&m_cs);\r
+  if (m_isSynchronizing)\r
+    return false;\r
+  m_currentLock.on(Modifier::Type_NumLock, i_isNumLockToggled);\r
+  m_currentLock.on(Modifier::Type_CapsLock, i_isCapsLockToggled);\r
+  m_currentLock.on(Modifier::Type_ScrollLock, i_isScrollLockToggled);\r
+  m_currentLock.on(Modifier::Type_KanaLock, i_isKanaLockToggled);\r
+  m_currentLock.on(Modifier::Type_ImeLock, i_isImeLockToggled);\r
+  m_currentLock.on(Modifier::Type_ImeComp, i_isImeCompToggled);\r
+  return true;\r
+}\r
+\r
+\r
+// show\r
+bool Engine::setShow(bool i_isMaximized, bool i_isMinimized,\r
+                    bool i_isMDI)\r
+{\r
+  Acquire a(&m_cs);\r
+  if (m_isSynchronizing)\r
+    return false;\r
+  Acquire b(&m_log, 1);\r
+  Modifier::Type max, min;\r
+  if (i_isMDI == true) {\r
+    max = Modifier::Type_MdiMaximized;\r
+    min = Modifier::Type_MdiMinimized;\r
+  }\r
+  else\r
+  {\r
+    max = Modifier::Type_Maximized;\r
+    min = Modifier::Type_Minimized;\r
+  }\r
+  m_currentLock.on(max, i_isMaximized);\r
+  m_currentLock.on(min, i_isMinimized);\r
+  m_log << _T("Set show to ") << (i_isMaximized ? _T("Maximized") :\r
+                                 i_isMinimized ? _T("Minimized") : _T("Normal"));\r
+  if (i_isMDI == true)\r
+  {\r
+    m_log << _T(" (MDI)");\r
+  }\r
+  m_log << std::endl;\r
+  return true;\r
+}\r
+\r
+\r
+// sync\r
+bool Engine::syncNotify()\r
+{\r
+  Acquire a(&m_cs);\r
+  if (!m_isSynchronizing)\r
+    return false;\r
+  CHECK_TRUE( SetEvent(m_eSync) );\r
+  return true;\r
+}\r
+\r
+\r
+// thread detach notify\r
+bool Engine::threadDetachNotify(DWORD i_threadId)\r
+{\r
+  Acquire a(&m_cs);\r
+  m_detachedThreadIds.push_back(i_threadId);\r
+  return true;\r
+}\r
+\r
+\r
+// get help message\r
+void Engine::getHelpMessages(tstring *o_helpMessage, tstring *o_helpTitle)\r
+{\r
+  Acquire a(&m_cs);\r
+  *o_helpMessage = m_helpMessage;\r
+  *o_helpTitle = m_helpTitle;\r
+}\r
+\r
+\r
+// command notify\r
+void Engine::commandNotify(\r
+  HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam)\r
+{\r
+  Acquire b(&m_log, 0);\r
+  HWND hf = m_hwndFocus;\r
+  if (!hf)\r
+    return;\r
+\r
+  if (GetWindowThreadProcessId(hf, NULL) == \r
+      GetWindowThreadProcessId(m_hwndAssocWindow, NULL))\r
+    return;    // inhibit the investigation of MADO TSUKAI NO YUUTSU\r
+\r
+  const _TCHAR *target = NULL;\r
+  int number_target = 0;\r
+  \r
+  if (i_hwnd == hf)\r
+    target = _T("ToItself");\r
+  else if (i_hwnd == GetParent(hf))\r
+    target = _T("ToParentWindow");\r
+  else\r
+  {\r
+    // Function::toMainWindow\r
+    HWND h = hf;\r
+    while (true)\r
+    {\r
+      HWND p = GetParent(h);\r
+      if (!p)\r
+       break;\r
+      h = p;\r
+    }\r
+    if (i_hwnd == h)\r
+      target = _T("ToMainWindow");\r
+    else\r
+    {\r
+      // Function::toOverlappedWindow\r
+      HWND h = hf;\r
+      while (h)\r
+      {\r
+#ifdef MAYU64\r
+       LONG_PTR style = GetWindowLongPtr(h, GWL_STYLE);\r
+#else\r
+       LONG style = GetWindowLong(h, GWL_STYLE);\r
+#endif\r
+       if ((style & WS_CHILD) == 0)\r
+         break;\r
+       h = GetParent(h);\r
+      }\r
+      if (i_hwnd == h)\r
+       target = _T("ToOverlappedWindow");\r
+      else\r
+      {\r
+       // number\r
+       HWND h = hf;\r
+       for (number_target = 0; h; number_target ++, h = GetParent(h))\r
+         if (i_hwnd == h)\r
+           break;\r
+       return;\r
+      }\r
+    }\r
+  }\r
+\r
+  m_log << _T("&PostMessage(");\r
+  if (target)\r
+    m_log << target;\r
+  else\r
+    m_log << number_target;\r
+  m_log << _T(", ") << i_message\r
+       << _T(", 0x") << std::hex << i_wParam\r
+       << _T(", 0x") << i_lParam << _T(") # hwnd = ")\r
+       << reinterpret_cast<int>(i_hwnd) << _T(", ")\r
+       << _T("message = ") << std::dec;\r
+  if (i_message == WM_COMMAND)\r
+    m_log << _T("WM_COMMAND, ");\r
+  else if (i_message == WM_SYSCOMMAND)\r
+    m_log << _T("WM_SYSCOMMAND, ");\r
+  else\r
+    m_log << i_message << _T(", ");\r
+  m_log << _T("wNotifyCode = ") << HIWORD(i_wParam) << _T(", ")\r
+       << _T("wID = ") << LOWORD(i_wParam) << _T(", ")\r
+       << _T("hwndCtrl = 0x") << std::hex << i_lParam << std::dec << std::endl;\r
+}\r
index ba39881..fd068a9 100644 (file)
--- a/engine.h
+++ b/engine.h
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// engine.h
-
-
-#ifndef _ENGINE_H
-#  define _ENGINE_H
-
-#  include "multithread.h"
-#  include "setting.h"
-#  include "msgstream.h"
-#  include <set>
-#  include <queue>
-
-
-enum
-{
-  ///
-  WM_APP_engineNotify = WM_APP + 110,
-};
-
-
-///
-enum EngineNotify
-{
-  EngineNotify_shellExecute,                   ///
-  EngineNotify_loadSetting,                    ///
-  EngineNotify_showDlg,                                ///
-  EngineNotify_helpMessage,                    ///
-  EngineNotify_setForegroundWindow,            ///
-  EngineNotify_clearLog,                       ///
-};
-
-
-///
-class Engine
-{
-private:
-  enum
-  {
-    MAX_GENERATE_KEYBOARD_EVENTS_RECURSION_COUNT = 64, ///
-    MAX_KEYMAP_PREFIX_HISTORY = 64, ///
-  };
-
-  typedef Keymaps::KeymapPtrList KeymapPtrList;        /// 
-  
-  /// focus of a thread
-  class FocusOfThread
-  {
-  public:
-    DWORD m_threadId;                          /// thread id
-    HWND m_hwndFocus;                          /** window that has focus on
-                                                    the thread */
-    tstringi m_className;                      /// class name of hwndFocus
-    tstringi m_titleName;                      /// title name of hwndFocus
-    bool m_isConsole;                          /// is hwndFocus console ?
-    KeymapPtrList m_keymaps;                   /// keymaps
-
-  public:
-    ///
-    FocusOfThread() : m_threadId(0), m_hwndFocus(NULL), m_isConsole(false) { }
-  };
-  typedef std::map<DWORD /*ThreadId*/, FocusOfThread> FocusOfThreads;  ///
-
-  typedef std::list<DWORD /*ThreadId*/> DetachedThreadIds;     ///
-
-  /// current status in generateKeyboardEvents
-  class Current
-  {
-  public:
-    const Keymap *m_keymap;                    /// current keymap
-    ModifiedKey m_mkey;                /// current processing key that user inputed
-                               /// index in currentFocusOfThread-&gt;keymaps
-    Keymaps::KeymapPtrList::iterator m_i;
-
-  public:
-    ///
-    bool isPressed() const
-    { return m_mkey.m_modifier.isOn(Modifier::Type_Down); }
-  };
-
-  friend class FunctionParam;
-  
-  /// part of keySeq
-  enum Part
-  {
-    Part_all,                                  ///
-    Part_up,                                   ///
-    Part_down,                                 ///
-  };
-
-  ///
-  class EmacsEditKillLine
-  {
-    tstring m_buf;     /// previous kill-line contents
-
-  public:
-    bool m_doForceReset;       ///
-  
-  private:
-    ///
-    HGLOBAL makeNewKillLineBuf(const _TCHAR *i_data, int *i_retval);
-
-  public:
-    ///
-    void reset() { m_buf.resize(0); }
-    /** EmacsEditKillLineFunc.
-       clear the contents of the clopboard
-       at that time, confirm if it is the result of the previous kill-line
-    */
-    void func();
-    /// EmacsEditKillLinePred
-    int pred();
-  };
-
-  /// window positon for &amp;WindowHMaximize, &amp;WindowVMaximize
-  class WindowPosition
-  {
-  public:
-    ///
-    enum Mode
-    {
-      Mode_normal,                             ///
-      Mode_H,                                  ///
-      Mode_V,                                  ///
-      Mode_HV,                                 ///
-    };
-
-  public:
-    HWND m_hwnd;                               ///
-    RECT m_rc;                                 ///
-    Mode m_mode;                               ///
-
-  public:
-    ///
-    WindowPosition(HWND i_hwnd, const RECT &i_rc, Mode i_mode)
-      : m_hwnd(i_hwnd), m_rc(i_rc), m_mode(i_mode) { }
-  };
-  typedef std::list<WindowPosition> WindowPositions;
-
-  typedef std::list<HWND> WindowsWithAlpha; /// windows for &amp;WindowSetAlpha
-
-  enum InterruptThreadReason
-  {
-    InterruptThreadReason_Terminate,
-    InterruptThreadReason_Pause,
-    InterruptThreadReason_Resume,
-  };
-
-private:
-  CriticalSection m_cs;                                /// criticalSection
-  
-  // setting
-  HWND m_hwndAssocWindow;                      /** associated window (we post
-                                                    message to it) */
-  Setting * volatile m_setting;                        /// setting
-  
-  // engine thread state
-  HANDLE m_device;                             /// mayu device
-  bool m_didMayuStartDevice;                   /** Did the mayu start the
-                                                    mayu-device ? */
-  HANDLE m_threadEvent;                                /** 1. thread has been started
-                                                   2. thread is about to end*/
-  HANDLE m_threadHandle;
-  unsigned m_threadId;
-  tstring m_mayudVersion;                      /// version of mayud.sys
-#ifdef NO_DRIVER
-  std::deque<KEYBOARD_INPUT_DATA> m_kidq;
-  CriticalSection m_cskidq;
-#endif // NO_DRIVER
-  HANDLE m_readEvent;                          /** reading from mayu device
-                                                    has been completed */
-  HANDLE m_interruptThreadEvent;               /// interrupt thread event
-  volatile InterruptThreadReason
-  m_interruptThreadReason;                     /// interrupt thread reason
-  OVERLAPPED m_ol;                             /** for async read/write of
-                                                   mayu device */
-  HANDLE m_hookPipe;                           /// named pipe for &SetImeString
-  HMODULE m_sts4mayu;                          /// DLL module for ThumbSense
-  HMODULE m_cts4mayu;                          /// DLL module for ThumbSense
-  bool volatile m_doForceTerminate;            /// terminate engine thread
-  bool volatile m_isLogMode;                   /// is logging mode ?
-  bool volatile m_isEnabled;                   /// is enabled  ?
-  bool volatile m_isSynchronizing;             /// is synchronizing ?
-  HANDLE m_eSync;                              /// event for synchronization
-  int m_generateKeyboardEventsRecursionGuard;  /** guard against too many
-                                                    recursion */
-  
-  // current key state
-  Modifier m_currentLock;                      /// current lock key's state
-  int m_currentKeyPressCount;                  /** how many keys are pressed
-                                                    phisically ? */
-  int m_currentKeyPressCountOnWin32;           /** how many keys are pressed
-                                                    on win32 ? */
-  Key *m_lastGeneratedKey;                     /// last generated key
-  Key *m_lastPressedKey[2];                    /// last pressed key
-  ModifiedKey m_oneShotKey;                    /// one shot key
-  unsigned int m_oneShotRepeatableRepeatCount; /// repeat count of one shot key
-  bool m_isPrefix;                             /// is prefix ?
-  bool m_doesIgnoreModifierForPrefix;          /** does ignore modifier key
-                                                    when prefixed ? */
-  bool m_doesEditNextModifier;                 /** does edit next user input
-                                                    key's modifier ? */
-  Modifier m_modifierForNextKey;               /** modifier for next key if
-                                                    above is true */
-
-  /** current keymaps.
-      <dl>
-      <dt>when &amp;OtherWindowClass
-      <dd>currentKeymap becoms currentKeymaps[++ Current::i]
-      <dt>when &amp;KeymapParent
-      <dd>currentKeymap becoms currentKeyamp-&gt;parentKeymap
-      <dt>other
-      <dd>currentKeyamp becoms *Current::i
-      </dl>
-  */
-  const Keymap * volatile m_currentKeymap;     /// current keymap
-  FocusOfThreads /*volatile*/ m_focusOfThreads;        ///
-  FocusOfThread * volatile m_currentFocusOfThread; ///
-  FocusOfThread m_globalFocus;                 ///
-  HWND m_hwndFocus;                            /// current focus window
-  DetachedThreadIds m_detachedThreadIds;       ///
-  
-  // for functions
-  KeymapPtrList m_keymapPrefixHistory;         /// for &amp;KeymapPrevPrefix
-  EmacsEditKillLine m_emacsEditKillLine;       /// for &amp;EmacsEditKillLine
-  const ActionFunction *m_afShellExecute;      /// for &amp;ShellExecute
-  
-  WindowPositions m_windowPositions;           ///
-  WindowsWithAlpha m_windowsWithAlpha;         ///
-  
-  tstring m_helpMessage;                       /// for &amp;HelpMessage
-  tstring m_helpTitle;                         /// for &amp;HelpMessage
-  int m_variable;                              /// for &amp;Variable,
-                                               ///  &amp;Repeat
-
-public:
-  tomsgstream &m_log;                          /** log stream (output to log
-                                                    dialog's edit) */
-  
-public:
-#ifdef NO_DRIVER
-  /// keyboard handler thread
-  static unsigned int WINAPI keyboardDetour(Engine *i_this, KBDLLHOOKSTRUCT *i_kid);
-private:
-  ///
-  unsigned int keyboardDetour(KBDLLHOOKSTRUCT *i_kid);
-  ///
-  unsigned int injectInput(const KEYBOARD_INPUT_DATA *i_kid, const KBDLLHOOKSTRUCT *i_kidRaw);
-#endif // NO_DRIVER
-  
-private:
-  /// keyboard handler thread
-  static unsigned int WINAPI keyboardHandler(void *i_this);
-  ///
-  void keyboardHandler();
-
-  /// check focus window
-  void checkFocusWindow();
-  /// is modifier pressed ?
-  bool isPressed(Modifier::Type i_mt);
-  /// fix modifier key
-  bool fixModifierKey(ModifiedKey *io_mkey, Keymap::AssignMode *o_am);
-
-  /// output to log
-  void outputToLog(const Key *i_key, const ModifiedKey &i_mkey,
-                  int i_debugLevel);
-
-  /// genete modifier events
-  void generateModifierEvents(const Modifier &i_mod);
-  
-  /// genete event
-  void generateEvents(Current i_c, const Keymap *i_keymap, Key *i_event);
-  
-  /// generate keyboard event
-  void generateKeyEvent(Key *i_key, bool i_doPress, bool i_isByAssign);
-  ///
-  void generateActionEvents(const Current &i_c, const Action *i_a,
-                           bool i_doPress);
-  ///
-  void generateKeySeqEvents(const Current &i_c, const KeySeq *i_keySeq,
-                           Part i_part);
-  ///
-  void generateKeyboardEvents(const Current &i_c);
-  ///
-  void beginGeneratingKeyboardEvents(const Current &i_c, bool i_isModifier);
-  
-  /// pop all pressed key on win32
-  void keyboardResetOnWin32();
-  
-  /// get current modifiers
-  Modifier getCurrentModifiers(Key *i_key, bool i_isPressed);
-
-  /// describe bindings
-  void describeBindings();
-
-  /// update m_lastPressedKey
-  void updateLastPressedKey(Key *i_key);
-
-  /// set current keymap
-  void setCurrentKeymap(const Keymap *i_keymap,
-                       bool i_doesAddToHistory = false);
-  /** open mayu device
-      @return true if mayu device successfully is opened
-  */
-  bool open();
-
-  /// close mayu device
-  void close();
-
-  /// load/unload [sc]ts4mayu.dll
-  void manageTs4mayu(TCHAR *i_ts4mayuDllName, TCHAR *i_dependDllName,
-                    bool i_load, HMODULE *i_pTs4mayu);
-
-private:
-  // BEGINING OF FUNCTION DEFINITION
-  /// send a default key to Windows
-  void funcDefault(FunctionParam *i_param);
-  /// use a corresponding key of a parent keymap
-  void funcKeymapParent(FunctionParam *i_param);
-  /// use a corresponding key of a current window
-  void funcKeymapWindow(FunctionParam *i_param);
-  /// use a corresponding key of the previous prefixed keymap
-  void funcKeymapPrevPrefix(FunctionParam *i_param, int i_previous);
-  /// use a corresponding key of an other window class, or use a default key
-  void funcOtherWindowClass(FunctionParam *i_param);
-  /// prefix key
-  void funcPrefix(FunctionParam *i_param, const Keymap *i_keymap,
-                 BooleanType i_doesIgnoreModifiers = BooleanType_true);
-  /// other keymap's key
-  void funcKeymap(FunctionParam *i_param, const Keymap *i_keymap);
-  /// sync
-  void funcSync(FunctionParam *i_param);
-  /// toggle lock
-  void funcToggle(FunctionParam *i_param, ModifierLockType i_lock,
-                 ToggleType i_toggle = ToggleType_toggle);
-  /// edit next user input key's modifier
-  void funcEditNextModifier(FunctionParam *i_param,
-                           const Modifier &i_modifier);
-  /// variable
-  void funcVariable(FunctionParam *i_param, int i_mag, int i_inc);
-  /// repeat N times
-  void funcRepeat(FunctionParam *i_param, const KeySeq *i_keySeq,
-                 int i_max = 10);
-  /// undefined (bell)
-  void funcUndefined(FunctionParam *i_param);
-  /// ignore
-  void funcIgnore(FunctionParam *i_param);
-  /// post message
-  void funcPostMessage(FunctionParam *i_param, ToWindowType i_window,
-                      UINT i_message, WPARAM i_wParam, LPARAM i_lParam);
-  /// ShellExecute
-  void funcShellExecute(FunctionParam *i_param, const StrExprArg &i_operation,
-                       const StrExprArg &i_file, const StrExprArg &i_parameters,
-                       const StrExprArg &i_directory,
-                       ShowCommandType i_showCommand);
-  /// SetForegroundWindow
-  void funcSetForegroundWindow(FunctionParam *i_param,
-                              const tregex &i_windowClassName,
-                              LogicalOperatorType i_logicalOp
-                              = LogicalOperatorType_and,
-                              const tregex &i_windowTitleName
-                              = tregex(_T(".*")));
-  /// load setting
-  void funcLoadSetting(FunctionParam *i_param,
-                      const StrExprArg &i_name = StrExprArg());
-  /// virtual key
-  void funcVK(FunctionParam *i_param, VKey i_vkey);
-  /// wait
-  void funcWait(FunctionParam *i_param, int i_milliSecond);
-  /// investigate WM_COMMAND, WM_SYSCOMMAND
-  void funcInvestigateCommand(FunctionParam *i_param);
-  /// show mayu dialog box
-  void funcMayuDialog(FunctionParam *i_param, MayuDialogType i_dialog,
-                     ShowCommandType i_showCommand);
-  /// describe bindings
-  void funcDescribeBindings(FunctionParam *i_param);
-  /// show help message
-  void funcHelpMessage(FunctionParam *i_param,
-                      const StrExprArg &i_title = StrExprArg(),
-                      const StrExprArg &i_message = StrExprArg());
-  /// show variable
-  void funcHelpVariable(FunctionParam *i_param, const StrExprArg &i_title);
-  /// raise window
-  void funcWindowRaise(FunctionParam *i_param,
-                      TargetWindowType i_twt = TargetWindowType_overlapped);
-  /// lower window
-  void funcWindowLower(FunctionParam *i_param, 
-                      TargetWindowType i_twt = TargetWindowType_overlapped);
-  /// minimize window
-  void funcWindowMinimize(FunctionParam *i_param, TargetWindowType i_twt
-                         = TargetWindowType_overlapped);
-  /// maximize window
-  void funcWindowMaximize(FunctionParam *i_param, TargetWindowType i_twt
-                         = TargetWindowType_overlapped);
-  /// maximize window horizontally
-  void funcWindowHMaximize(FunctionParam *i_param, TargetWindowType i_twt
-                          = TargetWindowType_overlapped);
-  /// maximize window virtically
-  void funcWindowVMaximize(FunctionParam *i_param, TargetWindowType i_twt
-                          = TargetWindowType_overlapped);
-  /// maximize window virtically or horizontally
-  void funcWindowHVMaximize(FunctionParam *i_param, BooleanType i_isHorizontal,
-                           TargetWindowType i_twt
-                           = TargetWindowType_overlapped);
-  /// move window
-  void funcWindowMove(FunctionParam *i_param, int i_dx, int i_dy,
-                     TargetWindowType i_twt
-                     = TargetWindowType_overlapped);
-  /// move window to ...
-  void funcWindowMoveTo(FunctionParam *i_param, GravityType i_gravityType,
-                       int i_dx, int i_dy, TargetWindowType i_twt
-                       = TargetWindowType_overlapped);
-  /// move window visibly
-  void funcWindowMoveVisibly(FunctionParam *i_param, 
-                            TargetWindowType i_twt
-                            = TargetWindowType_overlapped);
-  /// move window to other monitor
-  void funcWindowMonitorTo(FunctionParam *i_param,
-                           WindowMonitorFromType i_fromType, int i_monitor,
-                           BooleanType i_adjustPos = BooleanType_true,
-                           BooleanType i_adjustSize = BooleanType_false);
-  /// move window to other monitor
-  void funcWindowMonitor(FunctionParam *i_param, int i_monitor,
-                         BooleanType i_adjustPos = BooleanType_true,
-                         BooleanType i_adjustSize = BooleanType_false);
-  ///
-  void funcWindowClingToLeft(FunctionParam *i_param, 
-                            TargetWindowType i_twt
-                            = TargetWindowType_overlapped);
-  ///
-  void funcWindowClingToRight(FunctionParam *i_param, 
-                             TargetWindowType i_twt
-                             = TargetWindowType_overlapped);
-  ///
-  void funcWindowClingToTop(FunctionParam *i_param, 
-                           TargetWindowType i_twt
-                           = TargetWindowType_overlapped);
-  ///
-  void funcWindowClingToBottom(FunctionParam *i_param, 
-                              TargetWindowType i_twt
-                              = TargetWindowType_overlapped);
-  /// close window
-  void funcWindowClose(FunctionParam *i_param, 
-                      TargetWindowType i_twt = TargetWindowType_overlapped);
-  /// toggle top-most flag of the window
-  void funcWindowToggleTopMost(FunctionParam *i_param);
-  /// identify the window
-  void funcWindowIdentify(FunctionParam *i_param);
-  /// set alpha blending parameter to the window
-  void funcWindowSetAlpha(FunctionParam *i_param, int i_alpha);
-  /// redraw the window
-  void funcWindowRedraw(FunctionParam *i_param);
-  /// resize window to
-  void funcWindowResizeTo(FunctionParam *i_param, int i_width, int i_height, 
-                         TargetWindowType i_twt
-                         = TargetWindowType_overlapped);
-  /// move the mouse cursor
-  void funcMouseMove(FunctionParam *i_param, int i_dx, int i_dy);
-  /// send a mouse-wheel-message to Windows
-  void funcMouseWheel(FunctionParam *i_param, int i_delta);
-  /// convert the contents of the Clipboard to upper case or lower case
-  void funcClipboardChangeCase(FunctionParam *i_param,
-                              BooleanType i_doesConvertToUpperCase);
-  /// convert the contents of the Clipboard to upper case
-  void funcClipboardUpcaseWord(FunctionParam *i_param);
-  /// convert the contents of the Clipboard to lower case
-  void funcClipboardDowncaseWord(FunctionParam *i_param);
-  /// set the contents of the Clipboard to the string
-  void funcClipboardCopy(FunctionParam *i_param, const StrExprArg &i_text);
-  ///
-  void funcEmacsEditKillLinePred(FunctionParam *i_param,
-                                const KeySeq *i_keySeq1,
-                                const KeySeq *i_keySeq2);
-  ///
-  void funcEmacsEditKillLineFunc(FunctionParam *i_param);
-  /// clear log
-  void funcLogClear(FunctionParam *i_param);
-  /// recenter
-  void funcRecenter(FunctionParam *i_param);
-  /// Direct SSTP
-  void funcDirectSSTP(FunctionParam *i_param,
-                     const tregex &i_name,
-                     const StrExprArg &i_protocol,
-                     const std::list<tstringq> &i_headers);
-  /// PlugIn
-  void funcPlugIn(FunctionParam *i_param,
-                 const StrExprArg &i_dllName,
-                 const StrExprArg &i_funcName = StrExprArg(),
-                 const StrExprArg &i_funcParam = StrExprArg(),
-                 BooleanType i_doesCreateThread = BooleanType_false);
-  /// set IME open status
-  void funcSetImeStatus(FunctionParam *i_param, ToggleType i_toggle = ToggleType_toggle);
-  /// set string to IME
-  void funcSetImeString(FunctionParam *i_param, const StrExprArg &i_data);
-  /// enter to mouse event hook mode
-  void funcMouseHook(FunctionParam *i_param, MouseHookType i_hookType, int i_hookParam);
-
-  // END OF FUNCTION DEFINITION
-#  define FUNCTION_FRIEND
-#  include "functions.h"
-#  undef FUNCTION_FRIEND
-  
-public:
-  ///
-  Engine(tomsgstream &i_log);
-  ///
-  ~Engine();
-
-  /// start/stop keyboard handler thread
-  void start();
-  ///
-  void stop();
-
-  /// pause keyboard handler thread and close device
-  bool pause();
-  
-  /// resume keyboard handler thread and re-open device
-  bool resume();
-
-  /// do some procedure before quit which must be done synchronously
-  /// (i.e. not on WM_QUIT)
-  bool prepairQuit();
-
-  /// logging mode
-  void enableLogMode(bool i_isLogMode = true) { m_isLogMode = i_isLogMode; }
-  ///
-  void disableLogMode() { m_isLogMode = false; }
-  
-  /// enable/disable engine
-  void enable(bool i_isEnabled = true) { m_isEnabled = i_isEnabled; }
-  ///
-  void disable() { m_isEnabled = false; }
-  ///
-  bool getIsEnabled() const { return m_isEnabled; }
-
-  /// associated window
-  void setAssociatedWndow(HWND i_hwnd) { m_hwndAssocWindow = i_hwnd; }
-  
-  /// associated window
-  HWND getAssociatedWndow() const { return m_hwndAssocWindow; }
-  
-  /// setting
-  bool setSetting(Setting *i_setting);
-
-  /// focus
-  bool setFocus(HWND i_hwndFocus, DWORD i_threadId,
-               const tstringi &i_className,
-               const tstringi &i_titleName, bool i_isConsole);
-
-  /// lock state
-  bool setLockState(bool i_isNumLockToggled, bool i_isCapsLockToggled,
-                   bool i_isScrollLockToggled, bool i_isKanaLockToggled,
-                   bool i_isImeLockToggled, bool i_isImeCompToggled);
-
-  /// show
-  void checkShow(HWND i_hwnd);
-  bool setShow(bool i_isMaximized, bool i_isMinimized, bool i_isMDI);
-
-  /// sync
-  bool syncNotify();
-
-  /// thread detach notify
-  bool threadDetachNotify(DWORD i_threadId);
-
-  /// shell execute
-  void shellExecute();
-  
-  /// get help message
-  void getHelpMessages(tstring *o_helpMessage, tstring *o_helpTitle);
-
-  /// command notify
-  void commandNotify(HWND i_hwnd, UINT i_message, WPARAM i_wParam,
-                    LPARAM i_lParam);
-
-  /// get current window class name
-  const tstringi &getCurrentWindowClassName() const { return m_currentFocusOfThread->m_className; }
-
-  /// get current window title name
-  const tstringi &getCurrentWindowTitleName() const { return m_currentFocusOfThread->m_titleName; }
-
-  /// get mayud version
-  const tstring &getMayudVersion() const { return m_mayudVersion; }
-};
-
-
-///
-class FunctionParam
-{
-public:
-  bool m_isPressed;                            /// is key pressed ?
-  HWND m_hwnd;                                 /// 
-  Engine::Current m_c;                         /// new context
-  bool m_doesNeedEndl;                         /// need endl ?
-  const ActionFunction *m_af;                  /// 
-};
-
-
-#endif // !_ENGINE_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// engine.h\r
+\r
+\r
+#ifndef _ENGINE_H\r
+#  define _ENGINE_H\r
+\r
+#  include "multithread.h"\r
+#  include "setting.h"\r
+#  include "msgstream.h"\r
+#  include <set>\r
+#  include <queue>\r
+\r
+\r
+enum\r
+{\r
+  ///\r
+  WM_APP_engineNotify = WM_APP + 110,\r
+};\r
+\r
+\r
+///\r
+enum EngineNotify\r
+{\r
+  EngineNotify_shellExecute,                   ///\r
+  EngineNotify_loadSetting,                    ///\r
+  EngineNotify_showDlg,                                ///\r
+  EngineNotify_helpMessage,                    ///\r
+  EngineNotify_setForegroundWindow,            ///\r
+  EngineNotify_clearLog,                       ///\r
+};\r
+\r
+\r
+///\r
+class Engine\r
+{\r
+private:\r
+  enum\r
+  {\r
+    MAX_GENERATE_KEYBOARD_EVENTS_RECURSION_COUNT = 64, ///\r
+    MAX_KEYMAP_PREFIX_HISTORY = 64, ///\r
+  };\r
+\r
+  typedef Keymaps::KeymapPtrList KeymapPtrList;        /// \r
+  \r
+  /// focus of a thread\r
+  class FocusOfThread\r
+  {\r
+  public:\r
+    DWORD m_threadId;                          /// thread id\r
+    HWND m_hwndFocus;                          /** window that has focus on\r
+                                                    the thread */\r
+    tstringi m_className;                      /// class name of hwndFocus\r
+    tstringi m_titleName;                      /// title name of hwndFocus\r
+    bool m_isConsole;                          /// is hwndFocus console ?\r
+    KeymapPtrList m_keymaps;                   /// keymaps\r
+\r
+  public:\r
+    ///\r
+    FocusOfThread() : m_threadId(0), m_hwndFocus(NULL), m_isConsole(false) { }\r
+  };\r
+  typedef std::map<DWORD /*ThreadId*/, FocusOfThread> FocusOfThreads;  ///\r
+\r
+  typedef std::list<DWORD /*ThreadId*/> DetachedThreadIds;     ///\r
+\r
+  /// current status in generateKeyboardEvents\r
+  class Current\r
+  {\r
+  public:\r
+    const Keymap *m_keymap;                    /// current keymap\r
+    ModifiedKey m_mkey;                /// current processing key that user inputed\r
+                               /// index in currentFocusOfThread-&gt;keymaps\r
+    Keymaps::KeymapPtrList::iterator m_i;\r
+\r
+  public:\r
+    ///\r
+    bool isPressed() const\r
+    { return m_mkey.m_modifier.isOn(Modifier::Type_Down); }\r
+  };\r
+\r
+  friend class FunctionParam;\r
+  \r
+  /// part of keySeq\r
+  enum Part\r
+  {\r
+    Part_all,                                  ///\r
+    Part_up,                                   ///\r
+    Part_down,                                 ///\r
+  };\r
+\r
+  ///\r
+  class EmacsEditKillLine\r
+  {\r
+    tstring m_buf;     /// previous kill-line contents\r
+\r
+  public:\r
+    bool m_doForceReset;       ///\r
+  \r
+  private:\r
+    ///\r
+    HGLOBAL makeNewKillLineBuf(const _TCHAR *i_data, int *i_retval);\r
+\r
+  public:\r
+    ///\r
+    void reset() { m_buf.resize(0); }\r
+    /** EmacsEditKillLineFunc.\r
+       clear the contents of the clopboard\r
+       at that time, confirm if it is the result of the previous kill-line\r
+    */\r
+    void func();\r
+    /// EmacsEditKillLinePred\r
+    int pred();\r
+  };\r
+\r
+  /// window positon for &amp;WindowHMaximize, &amp;WindowVMaximize\r
+  class WindowPosition\r
+  {\r
+  public:\r
+    ///\r
+    enum Mode\r
+    {\r
+      Mode_normal,                             ///\r
+      Mode_H,                                  ///\r
+      Mode_V,                                  ///\r
+      Mode_HV,                                 ///\r
+    };\r
+\r
+  public:\r
+    HWND m_hwnd;                               ///\r
+    RECT m_rc;                                 ///\r
+    Mode m_mode;                               ///\r
+\r
+  public:\r
+    ///\r
+    WindowPosition(HWND i_hwnd, const RECT &i_rc, Mode i_mode)\r
+      : m_hwnd(i_hwnd), m_rc(i_rc), m_mode(i_mode) { }\r
+  };\r
+  typedef std::list<WindowPosition> WindowPositions;\r
+\r
+  typedef std::list<HWND> WindowsWithAlpha; /// windows for &amp;WindowSetAlpha\r
+\r
+  enum InterruptThreadReason\r
+  {\r
+    InterruptThreadReason_Terminate,\r
+    InterruptThreadReason_Pause,\r
+    InterruptThreadReason_Resume,\r
+  };\r
+\r
+private:\r
+  CriticalSection m_cs;                                /// criticalSection\r
+  \r
+  // setting\r
+  HWND m_hwndAssocWindow;                      /** associated window (we post\r
+                                                    message to it) */\r
+  Setting * volatile m_setting;                        /// setting\r
+  \r
+  // engine thread state\r
+  HANDLE m_device;                             /// mayu device\r
+  bool m_didMayuStartDevice;                   /** Did the mayu start the\r
+                                                    mayu-device ? */\r
+  HANDLE m_threadEvent;                                /** 1. thread has been started\r
+                                                   2. thread is about to end*/\r
+  HANDLE m_threadHandle;\r
+  unsigned m_threadId;\r
+  tstring m_mayudVersion;                      /// version of mayud.sys\r
+#ifdef NO_DRIVER\r
+  std::deque<KEYBOARD_INPUT_DATA> m_kidq;\r
+  CriticalSection m_cskidq;\r
+#endif // NO_DRIVER\r
+  HANDLE m_readEvent;                          /** reading from mayu device\r
+                                                    has been completed */\r
+  HANDLE m_interruptThreadEvent;               /// interrupt thread event\r
+  volatile InterruptThreadReason\r
+  m_interruptThreadReason;                     /// interrupt thread reason\r
+  OVERLAPPED m_ol;                             /** for async read/write of\r
+                                                   mayu device */\r
+  HANDLE m_hookPipe;                           /// named pipe for &SetImeString\r
+  HMODULE m_sts4mayu;                          /// DLL module for ThumbSense\r
+  HMODULE m_cts4mayu;                          /// DLL module for ThumbSense\r
+  bool volatile m_doForceTerminate;            /// terminate engine thread\r
+  bool volatile m_isLogMode;                   /// is logging mode ?\r
+  bool volatile m_isEnabled;                   /// is enabled  ?\r
+  bool volatile m_isSynchronizing;             /// is synchronizing ?\r
+  HANDLE m_eSync;                              /// event for synchronization\r
+  int m_generateKeyboardEventsRecursionGuard;  /** guard against too many\r
+                                                    recursion */\r
+  \r
+  // current key state\r
+  Modifier m_currentLock;                      /// current lock key's state\r
+  int m_currentKeyPressCount;                  /** how many keys are pressed\r
+                                                    phisically ? */\r
+  int m_currentKeyPressCountOnWin32;           /** how many keys are pressed\r
+                                                    on win32 ? */\r
+  Key *m_lastGeneratedKey;                     /// last generated key\r
+  Key *m_lastPressedKey[2];                    /// last pressed key\r
+  ModifiedKey m_oneShotKey;                    /// one shot key\r
+  unsigned int m_oneShotRepeatableRepeatCount; /// repeat count of one shot key\r
+  bool m_isPrefix;                             /// is prefix ?\r
+  bool m_doesIgnoreModifierForPrefix;          /** does ignore modifier key\r
+                                                    when prefixed ? */\r
+  bool m_doesEditNextModifier;                 /** does edit next user input\r
+                                                    key's modifier ? */\r
+  Modifier m_modifierForNextKey;               /** modifier for next key if\r
+                                                    above is true */\r
+\r
+  /** current keymaps.\r
+      <dl>\r
+      <dt>when &amp;OtherWindowClass\r
+      <dd>currentKeymap becoms currentKeymaps[++ Current::i]\r
+      <dt>when &amp;KeymapParent\r
+      <dd>currentKeymap becoms currentKeyamp-&gt;parentKeymap\r
+      <dt>other\r
+      <dd>currentKeyamp becoms *Current::i\r
+      </dl>\r
+  */\r
+  const Keymap * volatile m_currentKeymap;     /// current keymap\r
+  FocusOfThreads /*volatile*/ m_focusOfThreads;        ///\r
+  FocusOfThread * volatile m_currentFocusOfThread; ///\r
+  FocusOfThread m_globalFocus;                 ///\r
+  HWND m_hwndFocus;                            /// current focus window\r
+  DetachedThreadIds m_detachedThreadIds;       ///\r
+  \r
+  // for functions\r
+  KeymapPtrList m_keymapPrefixHistory;         /// for &amp;KeymapPrevPrefix\r
+  EmacsEditKillLine m_emacsEditKillLine;       /// for &amp;EmacsEditKillLine\r
+  const ActionFunction *m_afShellExecute;      /// for &amp;ShellExecute\r
+  \r
+  WindowPositions m_windowPositions;           ///\r
+  WindowsWithAlpha m_windowsWithAlpha;         ///\r
+  \r
+  tstring m_helpMessage;                       /// for &amp;HelpMessage\r
+  tstring m_helpTitle;                         /// for &amp;HelpMessage\r
+  int m_variable;                              /// for &amp;Variable,\r
+                                               ///  &amp;Repeat\r
+\r
+public:\r
+  tomsgstream &m_log;                          /** log stream (output to log\r
+                                                    dialog's edit) */\r
+  \r
+public:\r
+#ifdef NO_DRIVER\r
+  /// keyboard handler thread\r
+  static unsigned int WINAPI keyboardDetour(Engine *i_this, KBDLLHOOKSTRUCT *i_kid);\r
+private:\r
+  ///\r
+  unsigned int keyboardDetour(KBDLLHOOKSTRUCT *i_kid);\r
+  ///\r
+  unsigned int injectInput(const KEYBOARD_INPUT_DATA *i_kid, const KBDLLHOOKSTRUCT *i_kidRaw);\r
+#endif // NO_DRIVER\r
+  \r
+private:\r
+  /// keyboard handler thread\r
+  static unsigned int WINAPI keyboardHandler(void *i_this);\r
+  ///\r
+  void keyboardHandler();\r
+\r
+  /// check focus window\r
+  void checkFocusWindow();\r
+  /// is modifier pressed ?\r
+  bool isPressed(Modifier::Type i_mt);\r
+  /// fix modifier key\r
+  bool fixModifierKey(ModifiedKey *io_mkey, Keymap::AssignMode *o_am);\r
+\r
+  /// output to log\r
+  void outputToLog(const Key *i_key, const ModifiedKey &i_mkey,\r
+                  int i_debugLevel);\r
+\r
+  /// genete modifier events\r
+  void generateModifierEvents(const Modifier &i_mod);\r
+  \r
+  /// genete event\r
+  void generateEvents(Current i_c, const Keymap *i_keymap, Key *i_event);\r
+  \r
+  /// generate keyboard event\r
+  void generateKeyEvent(Key *i_key, bool i_doPress, bool i_isByAssign);\r
+  ///\r
+  void generateActionEvents(const Current &i_c, const Action *i_a,\r
+                           bool i_doPress);\r
+  ///\r
+  void generateKeySeqEvents(const Current &i_c, const KeySeq *i_keySeq,\r
+                           Part i_part);\r
+  ///\r
+  void generateKeyboardEvents(const Current &i_c);\r
+  ///\r
+  void beginGeneratingKeyboardEvents(const Current &i_c, bool i_isModifier);\r
+  \r
+  /// pop all pressed key on win32\r
+  void keyboardResetOnWin32();\r
+  \r
+  /// get current modifiers\r
+  Modifier getCurrentModifiers(Key *i_key, bool i_isPressed);\r
+\r
+  /// describe bindings\r
+  void describeBindings();\r
+\r
+  /// update m_lastPressedKey\r
+  void updateLastPressedKey(Key *i_key);\r
+\r
+  /// set current keymap\r
+  void setCurrentKeymap(const Keymap *i_keymap,\r
+                       bool i_doesAddToHistory = false);\r
+  /** open mayu device\r
+      @return true if mayu device successfully is opened\r
+  */\r
+  bool open();\r
+\r
+  /// close mayu device\r
+  void close();\r
+\r
+  /// load/unload [sc]ts4mayu.dll\r
+  void manageTs4mayu(TCHAR *i_ts4mayuDllName, TCHAR *i_dependDllName,\r
+                    bool i_load, HMODULE *i_pTs4mayu);\r
+\r
+private:\r
+  // BEGINING OF FUNCTION DEFINITION\r
+  /// send a default key to Windows\r
+  void funcDefault(FunctionParam *i_param);\r
+  /// use a corresponding key of a parent keymap\r
+  void funcKeymapParent(FunctionParam *i_param);\r
+  /// use a corresponding key of a current window\r
+  void funcKeymapWindow(FunctionParam *i_param);\r
+  /// use a corresponding key of the previous prefixed keymap\r
+  void funcKeymapPrevPrefix(FunctionParam *i_param, int i_previous);\r
+  /// use a corresponding key of an other window class, or use a default key\r
+  void funcOtherWindowClass(FunctionParam *i_param);\r
+  /// prefix key\r
+  void funcPrefix(FunctionParam *i_param, const Keymap *i_keymap,\r
+                 BooleanType i_doesIgnoreModifiers = BooleanType_true);\r
+  /// other keymap's key\r
+  void funcKeymap(FunctionParam *i_param, const Keymap *i_keymap);\r
+  /// sync\r
+  void funcSync(FunctionParam *i_param);\r
+  /// toggle lock\r
+  void funcToggle(FunctionParam *i_param, ModifierLockType i_lock,\r
+                 ToggleType i_toggle = ToggleType_toggle);\r
+  /// edit next user input key's modifier\r
+  void funcEditNextModifier(FunctionParam *i_param,\r
+                           const Modifier &i_modifier);\r
+  /// variable\r
+  void funcVariable(FunctionParam *i_param, int i_mag, int i_inc);\r
+  /// repeat N times\r
+  void funcRepeat(FunctionParam *i_param, const KeySeq *i_keySeq,\r
+                 int i_max = 10);\r
+  /// undefined (bell)\r
+  void funcUndefined(FunctionParam *i_param);\r
+  /// ignore\r
+  void funcIgnore(FunctionParam *i_param);\r
+  /// post message\r
+  void funcPostMessage(FunctionParam *i_param, ToWindowType i_window,\r
+                      UINT i_message, WPARAM i_wParam, LPARAM i_lParam);\r
+  /// ShellExecute\r
+  void funcShellExecute(FunctionParam *i_param, const StrExprArg &i_operation,\r
+                       const StrExprArg &i_file, const StrExprArg &i_parameters,\r
+                       const StrExprArg &i_directory,\r
+                       ShowCommandType i_showCommand);\r
+  /// SetForegroundWindow\r
+  void funcSetForegroundWindow(FunctionParam *i_param,\r
+                              const tregex &i_windowClassName,\r
+                              LogicalOperatorType i_logicalOp\r
+                              = LogicalOperatorType_and,\r
+                              const tregex &i_windowTitleName\r
+                              = tregex(_T(".*")));\r
+  /// load setting\r
+  void funcLoadSetting(FunctionParam *i_param,\r
+                      const StrExprArg &i_name = StrExprArg());\r
+  /// virtual key\r
+  void funcVK(FunctionParam *i_param, VKey i_vkey);\r
+  /// wait\r
+  void funcWait(FunctionParam *i_param, int i_milliSecond);\r
+  /// investigate WM_COMMAND, WM_SYSCOMMAND\r
+  void funcInvestigateCommand(FunctionParam *i_param);\r
+  /// show mayu dialog box\r
+  void funcMayuDialog(FunctionParam *i_param, MayuDialogType i_dialog,\r
+                     ShowCommandType i_showCommand);\r
+  /// describe bindings\r
+  void funcDescribeBindings(FunctionParam *i_param);\r
+  /// show help message\r
+  void funcHelpMessage(FunctionParam *i_param,\r
+                      const StrExprArg &i_title = StrExprArg(),\r
+                      const StrExprArg &i_message = StrExprArg());\r
+  /// show variable\r
+  void funcHelpVariable(FunctionParam *i_param, const StrExprArg &i_title);\r
+  /// raise window\r
+  void funcWindowRaise(FunctionParam *i_param,\r
+                      TargetWindowType i_twt = TargetWindowType_overlapped);\r
+  /// lower window\r
+  void funcWindowLower(FunctionParam *i_param, \r
+                      TargetWindowType i_twt = TargetWindowType_overlapped);\r
+  /// minimize window\r
+  void funcWindowMinimize(FunctionParam *i_param, TargetWindowType i_twt\r
+                         = TargetWindowType_overlapped);\r
+  /// maximize window\r
+  void funcWindowMaximize(FunctionParam *i_param, TargetWindowType i_twt\r
+                         = TargetWindowType_overlapped);\r
+  /// maximize window horizontally\r
+  void funcWindowHMaximize(FunctionParam *i_param, TargetWindowType i_twt\r
+                          = TargetWindowType_overlapped);\r
+  /// maximize window virtically\r
+  void funcWindowVMaximize(FunctionParam *i_param, TargetWindowType i_twt\r
+                          = TargetWindowType_overlapped);\r
+  /// maximize window virtically or horizontally\r
+  void funcWindowHVMaximize(FunctionParam *i_param, BooleanType i_isHorizontal,\r
+                           TargetWindowType i_twt\r
+                           = TargetWindowType_overlapped);\r
+  /// move window\r
+  void funcWindowMove(FunctionParam *i_param, int i_dx, int i_dy,\r
+                     TargetWindowType i_twt\r
+                     = TargetWindowType_overlapped);\r
+  /// move window to ...\r
+  void funcWindowMoveTo(FunctionParam *i_param, GravityType i_gravityType,\r
+                       int i_dx, int i_dy, TargetWindowType i_twt\r
+                       = TargetWindowType_overlapped);\r
+  /// move window visibly\r
+  void funcWindowMoveVisibly(FunctionParam *i_param, \r
+                            TargetWindowType i_twt\r
+                            = TargetWindowType_overlapped);\r
+  /// move window to other monitor\r
+  void funcWindowMonitorTo(FunctionParam *i_param,\r
+                           WindowMonitorFromType i_fromType, int i_monitor,\r
+                           BooleanType i_adjustPos = BooleanType_true,\r
+                           BooleanType i_adjustSize = BooleanType_false);\r
+  /// move window to other monitor\r
+  void funcWindowMonitor(FunctionParam *i_param, int i_monitor,\r
+                         BooleanType i_adjustPos = BooleanType_true,\r
+                         BooleanType i_adjustSize = BooleanType_false);\r
+  ///\r
+  void funcWindowClingToLeft(FunctionParam *i_param, \r
+                            TargetWindowType i_twt\r
+                            = TargetWindowType_overlapped);\r
+  ///\r
+  void funcWindowClingToRight(FunctionParam *i_param, \r
+                             TargetWindowType i_twt\r
+                             = TargetWindowType_overlapped);\r
+  ///\r
+  void funcWindowClingToTop(FunctionParam *i_param, \r
+                           TargetWindowType i_twt\r
+                           = TargetWindowType_overlapped);\r
+  ///\r
+  void funcWindowClingToBottom(FunctionParam *i_param, \r
+                              TargetWindowType i_twt\r
+                              = TargetWindowType_overlapped);\r
+  /// close window\r
+  void funcWindowClose(FunctionParam *i_param, \r
+                      TargetWindowType i_twt = TargetWindowType_overlapped);\r
+  /// toggle top-most flag of the window\r
+  void funcWindowToggleTopMost(FunctionParam *i_param);\r
+  /// identify the window\r
+  void funcWindowIdentify(FunctionParam *i_param);\r
+  /// set alpha blending parameter to the window\r
+  void funcWindowSetAlpha(FunctionParam *i_param, int i_alpha);\r
+  /// redraw the window\r
+  void funcWindowRedraw(FunctionParam *i_param);\r
+  /// resize window to\r
+  void funcWindowResizeTo(FunctionParam *i_param, int i_width, int i_height, \r
+                         TargetWindowType i_twt\r
+                         = TargetWindowType_overlapped);\r
+  /// move the mouse cursor\r
+  void funcMouseMove(FunctionParam *i_param, int i_dx, int i_dy);\r
+  /// send a mouse-wheel-message to Windows\r
+  void funcMouseWheel(FunctionParam *i_param, int i_delta);\r
+  /// convert the contents of the Clipboard to upper case or lower case\r
+  void funcClipboardChangeCase(FunctionParam *i_param,\r
+                              BooleanType i_doesConvertToUpperCase);\r
+  /// convert the contents of the Clipboard to upper case\r
+  void funcClipboardUpcaseWord(FunctionParam *i_param);\r
+  /// convert the contents of the Clipboard to lower case\r
+  void funcClipboardDowncaseWord(FunctionParam *i_param);\r
+  /// set the contents of the Clipboard to the string\r
+  void funcClipboardCopy(FunctionParam *i_param, const StrExprArg &i_text);\r
+  ///\r
+  void funcEmacsEditKillLinePred(FunctionParam *i_param,\r
+                                const KeySeq *i_keySeq1,\r
+                                const KeySeq *i_keySeq2);\r
+  ///\r
+  void funcEmacsEditKillLineFunc(FunctionParam *i_param);\r
+  /// clear log\r
+  void funcLogClear(FunctionParam *i_param);\r
+  /// recenter\r
+  void funcRecenter(FunctionParam *i_param);\r
+  /// Direct SSTP\r
+  void funcDirectSSTP(FunctionParam *i_param,\r
+                     const tregex &i_name,\r
+                     const StrExprArg &i_protocol,\r
+                     const std::list<tstringq> &i_headers);\r
+  /// PlugIn\r
+  void funcPlugIn(FunctionParam *i_param,\r
+                 const StrExprArg &i_dllName,\r
+                 const StrExprArg &i_funcName = StrExprArg(),\r
+                 const StrExprArg &i_funcParam = StrExprArg(),\r
+                 BooleanType i_doesCreateThread = BooleanType_false);\r
+  /// set IME open status\r
+  void funcSetImeStatus(FunctionParam *i_param, ToggleType i_toggle = ToggleType_toggle);\r
+  /// set string to IME\r
+  void funcSetImeString(FunctionParam *i_param, const StrExprArg &i_data);\r
+  /// enter to mouse event hook mode\r
+  void funcMouseHook(FunctionParam *i_param, MouseHookType i_hookType, int i_hookParam);\r
+\r
+  // END OF FUNCTION DEFINITION\r
+#  define FUNCTION_FRIEND\r
+#  include "functions.h"\r
+#  undef FUNCTION_FRIEND\r
+  \r
+public:\r
+  ///\r
+  Engine(tomsgstream &i_log);\r
+  ///\r
+  ~Engine();\r
+\r
+  /// start/stop keyboard handler thread\r
+  void start();\r
+  ///\r
+  void stop();\r
+\r
+  /// pause keyboard handler thread and close device\r
+  bool pause();\r
+  \r
+  /// resume keyboard handler thread and re-open device\r
+  bool resume();\r
+\r
+  /// do some procedure before quit which must be done synchronously\r
+  /// (i.e. not on WM_QUIT)\r
+  bool prepairQuit();\r
+\r
+  /// logging mode\r
+  void enableLogMode(bool i_isLogMode = true) { m_isLogMode = i_isLogMode; }\r
+  ///\r
+  void disableLogMode() { m_isLogMode = false; }\r
+  \r
+  /// enable/disable engine\r
+  void enable(bool i_isEnabled = true) { m_isEnabled = i_isEnabled; }\r
+  ///\r
+  void disable() { m_isEnabled = false; }\r
+  ///\r
+  bool getIsEnabled() const { return m_isEnabled; }\r
+\r
+  /// associated window\r
+  void setAssociatedWndow(HWND i_hwnd) { m_hwndAssocWindow = i_hwnd; }\r
+  \r
+  /// associated window\r
+  HWND getAssociatedWndow() const { return m_hwndAssocWindow; }\r
+  \r
+  /// setting\r
+  bool setSetting(Setting *i_setting);\r
+\r
+  /// focus\r
+  bool setFocus(HWND i_hwndFocus, DWORD i_threadId,\r
+               const tstringi &i_className,\r
+               const tstringi &i_titleName, bool i_isConsole);\r
+\r
+  /// lock state\r
+  bool setLockState(bool i_isNumLockToggled, bool i_isCapsLockToggled,\r
+                   bool i_isScrollLockToggled, bool i_isKanaLockToggled,\r
+                   bool i_isImeLockToggled, bool i_isImeCompToggled);\r
+\r
+  /// show\r
+  void checkShow(HWND i_hwnd);\r
+  bool setShow(bool i_isMaximized, bool i_isMinimized, bool i_isMDI);\r
+\r
+  /// sync\r
+  bool syncNotify();\r
+\r
+  /// thread detach notify\r
+  bool threadDetachNotify(DWORD i_threadId);\r
+\r
+  /// shell execute\r
+  void shellExecute();\r
+  \r
+  /// get help message\r
+  void getHelpMessages(tstring *o_helpMessage, tstring *o_helpTitle);\r
+\r
+  /// command notify\r
+  void commandNotify(HWND i_hwnd, UINT i_message, WPARAM i_wParam,\r
+                    LPARAM i_lParam);\r
+\r
+  /// get current window class name\r
+  const tstringi &getCurrentWindowClassName() const { return m_currentFocusOfThread->m_className; }\r
+\r
+  /// get current window title name\r
+  const tstringi &getCurrentWindowTitleName() const { return m_currentFocusOfThread->m_titleName; }\r
+\r
+  /// get mayud version\r
+  const tstring &getMayudVersion() const { return m_mayudVersion; }\r
+};\r
+\r
+\r
+///\r
+class FunctionParam\r
+{\r
+public:\r
+  bool m_isPressed;                            /// is key pressed ?\r
+  HWND m_hwnd;                                 /// \r
+  Engine::Current m_c;                         /// new context\r
+  bool m_doesNeedEndl;                         /// need endl ?\r
+  const ActionFunction *m_af;                  /// \r
+};\r
+\r
+\r
+#endif // !_ENGINE_H\r
index a02e4a5..d70f87b 100644 (file)
@@ -1,86 +1,86 @@
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// errormessage.h
-
-
-#ifndef _ERRORMESSAGE_H
-#  define _ERRORMESSAGE_H
-
-#  include "stringtool.h"
-#  include <sstream>
-
-
-///
-class ErrorMessage
-{
-  tstringstream m_ost;                         ///
-  
-public:
-  ///
-  ErrorMessage() { }
-  ///
-  ErrorMessage(const ErrorMessage &i_em) { m_ost << i_em.getMessage(); }
-
-  /// get error message
-  tstring getMessage() const
-  {
-    return m_ost.str();
-  }
-
-  /// add message
-  template<class T> ErrorMessage &operator<<(const T &i_value)
-  {
-    m_ost << i_value;
-    return *this;
-  }
-
-  /// ios manipulator 
-  ErrorMessage &operator<<(
-    std::ios_base &(*i_manip)(std::ios_base&))
-  {
-    m_ost << i_manip;
-    return *this;
-  }
-
-#ifdef UNICODE
-  /// add message
-  template<> ErrorMessage &operator<<(const std::string &i_value)
-  {
-    m_ost << to_wstring(i_value);
-    return *this;
-  }
-
-  /// add message
-  typedef const char *const_char_ptr;
-  template<> ErrorMessage &operator<<(const const_char_ptr &i_value)
-  {
-    m_ost << to_wstring(i_value);
-    return *this;
-  }
-#endif
-  
-  /// stream output
-  friend tostream &operator<<(tostream &i_ost, const ErrorMessage &i_em);
-};
-
-
-/// stream output
-inline tostream &operator<<(tostream &i_ost, const ErrorMessage &i_em)
-{
-  return i_ost << i_em.getMessage();
-}
-
-
-///
-class WarningMessage : public ErrorMessage
-{
-public:
-  /// add message
-  template<class T> WarningMessage &operator<<(const T &i_value)
-  {
-    ErrorMessage::operator<<(i_value);
-    return *this;
-  }
-};
-
-
-#endif // !_ERRORMESSAGE_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// errormessage.h\r
+\r
+\r
+#ifndef _ERRORMESSAGE_H\r
+#  define _ERRORMESSAGE_H\r
+\r
+#  include "stringtool.h"\r
+#  include <sstream>\r
+\r
+\r
+///\r
+class ErrorMessage\r
+{\r
+  tstringstream m_ost;                         ///\r
+  \r
+public:\r
+  ///\r
+  ErrorMessage() { }\r
+  ///\r
+  ErrorMessage(const ErrorMessage &i_em) { m_ost << i_em.getMessage(); }\r
+\r
+  /// get error message\r
+  tstring getMessage() const\r
+  {\r
+    return m_ost.str();\r
+  }\r
+\r
+  /// add message\r
+  template<class T> ErrorMessage &operator<<(const T &i_value)\r
+  {\r
+    m_ost << i_value;\r
+    return *this;\r
+  }\r
+\r
+  /// ios manipulator \r
+  ErrorMessage &operator<<(\r
+    std::ios_base &(*i_manip)(std::ios_base&))\r
+  {\r
+    m_ost << i_manip;\r
+    return *this;\r
+  }\r
+\r
+#ifdef UNICODE\r
+  /// add message\r
+  template<> ErrorMessage &operator<<(const std::string &i_value)\r
+  {\r
+    m_ost << to_wstring(i_value);\r
+    return *this;\r
+  }\r
+\r
+  /// add message\r
+  typedef const char *const_char_ptr;\r
+  template<> ErrorMessage &operator<<(const const_char_ptr &i_value)\r
+  {\r
+    m_ost << to_wstring(i_value);\r
+    return *this;\r
+  }\r
+#endif\r
+  \r
+  /// stream output\r
+  friend tostream &operator<<(tostream &i_ost, const ErrorMessage &i_em);\r
+};\r
+\r
+\r
+/// stream output\r
+inline tostream &operator<<(tostream &i_ost, const ErrorMessage &i_em)\r
+{\r
+  return i_ost << i_em.getMessage();\r
+}\r
+\r
+\r
+///\r
+class WarningMessage : public ErrorMessage\r
+{\r
+public:\r
+  /// add message\r
+  template<class T> WarningMessage &operator<<(const T &i_value)\r
+  {\r
+    ErrorMessage::operator<<(i_value);\r
+    return *this;\r
+  }\r
+};\r
+\r
+\r
+#endif // !_ERRORMESSAGE_H\r
index 3871bdc..d59fda9 100644 (file)
--- a/focus.cpp
+++ b/focus.cpp
@@ -1,70 +1,70 @@
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// focus.cpp
-
-
-#include "focus.h"
-#include "windowstool.h"
-
-
-///
-static LRESULT CALLBACK WndProc(
-  HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam)
-{
-  switch (i_message)
-  {
-    case WM_KEYDOWN:
-    case WM_SYSKEYDOWN:
-    case WM_KEYUP:
-    case WM_SYSKEYUP:
-      SendMessage(GetParent(i_hwnd), WM_APP_notifyVKey, i_wParam, i_lParam);
-      return 0;
-    case WM_CHAR:
-    case WM_DEADCHAR:
-      return 0;
-    case WM_LBUTTONDOWN:
-    {
-      SetFocus(i_hwnd);
-      return 0;
-    }
-    case WM_SETFOCUS:
-    {
-      RECT rc;
-      GetClientRect(i_hwnd, &rc);
-      CreateCaret(i_hwnd, reinterpret_cast<HBITMAP>(NULL), 2,
-                 rcHeight(&rc) / 2);
-      ShowCaret(i_hwnd);
-      SetCaretPos(rcWidth(&rc) / 2, rcHeight(&rc) / 4);
-      SendMessage(GetParent(i_hwnd), WM_APP_notifyFocus,
-                 TRUE, (LPARAM)i_hwnd);
-      return 0;
-    }
-    case WM_KILLFOCUS:
-    {
-      HideCaret(i_hwnd);
-      DestroyCaret();
-      SendMessage(GetParent(i_hwnd), WM_APP_notifyFocus,
-                 FALSE, (LPARAM)i_hwnd);
-      return 0;
-    }
-    case WM_GETDLGCODE:
-      return DLGC_WANTALLKEYS;
-  }
-  return DefWindowProc(i_hwnd, i_message, i_wParam, i_lParam);
-}
-
-
-ATOM Register_focus()
-{
-  WNDCLASS wc;
-  wc.style         = CS_HREDRAW | CS_VREDRAW;
-  wc.lpfnWndProc   = WndProc;
-  wc.cbClsExtra    = 0;
-  wc.cbWndExtra    = 0;
-  wc.hInstance     = g_hInst;
-  wc.hIcon         = NULL;
-  wc.hCursor       = LoadCursor(NULL, IDC_IBEAM);
-  wc.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW + 1);
-  wc.lpszMenuName  = NULL;
-  wc.lpszClassName = _T("mayuFocus");
-  return RegisterClass(&wc);
-}
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// focus.cpp\r
+\r
+\r
+#include "focus.h"\r
+#include "windowstool.h"\r
+\r
+\r
+///\r
+static LRESULT CALLBACK WndProc(\r
+  HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam)\r
+{\r
+  switch (i_message)\r
+  {\r
+    case WM_KEYDOWN:\r
+    case WM_SYSKEYDOWN:\r
+    case WM_KEYUP:\r
+    case WM_SYSKEYUP:\r
+      SendMessage(GetParent(i_hwnd), WM_APP_notifyVKey, i_wParam, i_lParam);\r
+      return 0;\r
+    case WM_CHAR:\r
+    case WM_DEADCHAR:\r
+      return 0;\r
+    case WM_LBUTTONDOWN:\r
+    {\r
+      SetFocus(i_hwnd);\r
+      return 0;\r
+    }\r
+    case WM_SETFOCUS:\r
+    {\r
+      RECT rc;\r
+      GetClientRect(i_hwnd, &rc);\r
+      CreateCaret(i_hwnd, reinterpret_cast<HBITMAP>(NULL), 2,\r
+                 rcHeight(&rc) / 2);\r
+      ShowCaret(i_hwnd);\r
+      SetCaretPos(rcWidth(&rc) / 2, rcHeight(&rc) / 4);\r
+      SendMessage(GetParent(i_hwnd), WM_APP_notifyFocus,\r
+                 TRUE, (LPARAM)i_hwnd);\r
+      return 0;\r
+    }\r
+    case WM_KILLFOCUS:\r
+    {\r
+      HideCaret(i_hwnd);\r
+      DestroyCaret();\r
+      SendMessage(GetParent(i_hwnd), WM_APP_notifyFocus,\r
+                 FALSE, (LPARAM)i_hwnd);\r
+      return 0;\r
+    }\r
+    case WM_GETDLGCODE:\r
+      return DLGC_WANTALLKEYS;\r
+  }\r
+  return DefWindowProc(i_hwnd, i_message, i_wParam, i_lParam);\r
+}\r
+\r
+\r
+ATOM Register_focus()\r
+{\r
+  WNDCLASS wc;\r
+  wc.style         = CS_HREDRAW | CS_VREDRAW;\r
+  wc.lpfnWndProc   = WndProc;\r
+  wc.cbClsExtra    = 0;\r
+  wc.cbWndExtra    = 0;\r
+  wc.hInstance     = g_hInst;\r
+  wc.hIcon         = NULL;\r
+  wc.hCursor       = LoadCursor(NULL, IDC_IBEAM);\r
+  wc.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW + 1);\r
+  wc.lpszMenuName  = NULL;\r
+  wc.lpszClassName = _T("mayuFocus");\r
+  return RegisterClass(&wc);\r
+}\r
diff --git a/focus.h b/focus.h
index 5f7da36..8c9969f 100644 (file)
--- a/focus.h
+++ b/focus.h
@@ -1,21 +1,21 @@
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// focus.h
-
-
-#ifndef _FOCUS_H
-#  define _FOCUS_H
-
-#  include <windows.h>
-
-
-///
-extern ATOM Register_focus();
-
-enum
-{
-  WM_APP_notifyFocus = WM_APP + 103,
-  WM_APP_notifyVKey  = WM_APP + 104,
-};
-
-
-#endif // !_FOCUS_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// focus.h\r
+\r
+\r
+#ifndef _FOCUS_H\r
+#  define _FOCUS_H\r
+\r
+#  include <windows.h>\r
+\r
+\r
+///\r
+extern ATOM Register_focus();\r
+\r
+enum\r
+{\r
+  WM_APP_notifyFocus = WM_APP + 103,\r
+  WM_APP_notifyVKey  = WM_APP + 104,\r
+};\r
+\r
+\r
+#endif // !_FOCUS_H\r
index 4c40f54..3136b70 100644 (file)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// function.cpp
-
-
-#include "engine.h"
-#include "hook.h"
-#include "mayu.h"
-#include "mayurc.h"
-#include "misc.h"
-#include "registry.h"
-#include "vkeytable.h"
-#include "windowstool.h"
-#include <algorithm>
-#include <process.h>
-
-#define FUNCTION_DATA
-#include "functions.h"
-#undef FUNCTION_DATA
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// TypeTable
-
-
-template <class T> class TypeTable
-{
-public:
-  T m_type;
-  const _TCHAR *m_name;
-};
-
-
-template <class T> static inline
-bool getTypeName(tstring *o_name, T i_type,
-                const TypeTable<T> *i_table, size_t i_n)
-{
-  for (size_t i = 0; i < i_n; ++ i)
-    if (i_table[i].m_type == i_type)
-    {
-      *o_name = i_table[i].m_name;
-      return true;
-    }
-  return false;
-}
-
-template <class T> static inline
-bool getTypeValue(T *o_type, const tstringi &i_name,
-                 const TypeTable<T> *i_table, size_t i_n)
-{
-  for (size_t i = 0; i < i_n; ++ i)
-    if (i_table[i].m_name == i_name)
-    {
-      *o_type = i_table[i].m_type;
-      return true;
-    }
-  return false;
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// VKey
-
-
-// stream output
-tostream &operator<<(tostream &i_ost, VKey i_data)
-{
-  if (i_data & VKey_extended)
-    i_ost << _T("E-");
-  if (i_data & VKey_released)
-    i_ost << _T("U-");
-  if (i_data & VKey_pressed)
-    i_ost << _T("D-");
-
-  u_int8 code = i_data & ~(VKey_extended | VKey_released | VKey_pressed);
-  const VKeyTable *vkt;
-  for (vkt = g_vkeyTable; vkt->m_name; ++ vkt)
-    if (vkt->m_code == code)
-      break;
-  if (vkt->m_name)
-    i_ost << vkt->m_name;
-  else
-    i_ost << _T("0x") << std::hex << code << std::dec;
-  return i_ost;
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// ToWindowType
-
-
-// ToWindowType table
-typedef TypeTable<ToWindowType> TypeTable_ToWindowType;
-static const TypeTable_ToWindowType g_toWindowTypeTable[] =
-{
-  { ToWindowType_toOverlappedWindow, _T("toOverlappedWindow") },
-  { ToWindowType_toMainWindow,       _T("toMainWindow")       },
-  { ToWindowType_toItself,           _T("toItself")           },
-  { ToWindowType_toParentWindow,     _T("toParentWindow")     },
-};
-
-
-// stream output
-tostream &operator<<(tostream &i_ost, ToWindowType i_data)
-{
-  tstring name;
-  if (getTypeName(&name, i_data,
-                 g_toWindowTypeTable, NUMBER_OF(g_toWindowTypeTable)))
-    i_ost << name;
-  else
-    i_ost << static_cast<int>(i_data);
-  return i_ost;
-}
-
-
-// get value of ToWindowType
-bool getTypeValue(ToWindowType *o_type, const tstring &i_name)
-{
-  return getTypeValue(o_type, i_name,
-                     g_toWindowTypeTable, NUMBER_OF(g_toWindowTypeTable));
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// GravityType
-
-
-// GravityType table
-typedef TypeTable<GravityType> TypeTable_GravityType;
-static const TypeTable_GravityType g_gravityTypeTable[] =
-{
-  { GravityType_C,  _T("C")  },
-  { GravityType_N,  _T("N")  },
-  { GravityType_E,  _T("E")  },
-  { GravityType_W,  _T("W")  },
-  { GravityType_S,  _T("S")  },
-  { GravityType_NW, _T("NW") },
-  { GravityType_NW, _T("WN") },
-  { GravityType_NE, _T("NE") },
-  { GravityType_NE, _T("EN") },
-  { GravityType_SW, _T("SW") },
-  { GravityType_SW, _T("WS") },
-  { GravityType_SE, _T("SE") },
-  { GravityType_SE, _T("ES") },
-};
-
-
-// stream output
-tostream &operator<<(tostream &i_ost, GravityType i_data)
-{
-  tstring name;
-  if (getTypeName(&name, i_data,
-                 g_gravityTypeTable, NUMBER_OF(g_gravityTypeTable)))
-    i_ost << name;
-  else
-    i_ost << _T("(GravityType internal error)");
-  return i_ost;
-}
-
-
-// get value of GravityType
-bool getTypeValue(GravityType *o_type, const tstring &i_name)
-{
-  return getTypeValue(o_type, i_name,
-                     g_gravityTypeTable, NUMBER_OF(g_gravityTypeTable));
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// MouseHookType
-
-
-// MouseHookType table
-typedef TypeTable<MouseHookType> TypeTable_MouseHookType;
-static const TypeTable_MouseHookType g_mouseHookTypeTable[] =
-{
-  { MouseHookType_None,  _T("None")  },
-  { MouseHookType_Wheel,  _T("Wheel")  },
-  { MouseHookType_WindowMove,  _T("WindowMove")  },
-};
-
-
-// stream output
-tostream &operator<<(tostream &i_ost, MouseHookType i_data)
-{
-  tstring name;
-  if (getTypeName(&name, i_data,
-                 g_mouseHookTypeTable, NUMBER_OF(g_mouseHookTypeTable)))
-    i_ost << name;
-  else
-    i_ost << _T("(MouseHookType internal error)");
-  return i_ost;
-}
-
-
-// get value of MouseHookType
-bool getTypeValue(MouseHookType *o_type, const tstring &i_name)
-{
-  return getTypeValue(o_type, i_name, g_mouseHookTypeTable,
-                     NUMBER_OF(g_mouseHookTypeTable));
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// MayuDialogType
-
-
-// ModifierLockType table
-typedef TypeTable<MayuDialogType> TypeTable_MayuDialogType;
-static const TypeTable_MayuDialogType g_mayuDialogTypeTable[] =
-{
-  { MayuDialogType_investigate, _T("investigate")  },
-  { MayuDialogType_log,         _T("log")          },
-};
-
-
-// stream output
-tostream &operator<<(tostream &i_ost, MayuDialogType i_data)
-{
-  tstring name;
-  if (getTypeName(&name, i_data,
-                 g_mayuDialogTypeTable, NUMBER_OF(g_mayuDialogTypeTable)))
-    i_ost << name;
-  else
-    i_ost << _T("(MayuDialogType internal error)");
-  return i_ost;
-}
-
-
-// get value of MayuDialogType
-bool getTypeValue(MayuDialogType *o_type, const tstring &i_name)
-{
-  return getTypeValue(o_type, i_name, g_mayuDialogTypeTable,
-                     NUMBER_OF(g_mayuDialogTypeTable));
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// ToggleType
-
-
-// ToggleType table
-typedef TypeTable<ToggleType> TypeTable_ToggleType;
-static const TypeTable_ToggleType g_toggleType[] =
-{
-  { ToggleType_toggle, _T("toggle") },
-  { ToggleType_off, _T("off") },
-  { ToggleType_off, _T("false") },
-  { ToggleType_off, _T("released") },
-  { ToggleType_on,  _T("on")  },
-  { ToggleType_on,  _T("true")  },
-  { ToggleType_on,  _T("pressed")  },
-};
-
-
-// stream output
-tostream &operator<<(tostream &i_ost, ToggleType i_data)
-{
-  tstring name;
-  if (getTypeName(&name, i_data, g_toggleType, NUMBER_OF(g_toggleType)))
-    i_ost << name;
-  else
-    i_ost << _T("(ToggleType internal error)");
-  return i_ost;
-}
-
-
-// get value of ToggleType
-bool getTypeValue(ToggleType *o_type, const tstring &i_name)
-{
-  return getTypeValue(o_type, i_name, g_toggleType,
-                     NUMBER_OF(g_toggleType));
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// ModifierLockType
-
-
-// ModifierLockType table
-typedef TypeTable<ModifierLockType> TypeTable_ModifierLockType;
-static const TypeTable_ModifierLockType g_modifierLockTypeTable[] =
-{
-  { ModifierLockType_Lock0, _T("lock0") },
-  { ModifierLockType_Lock1, _T("lock1") },
-  { ModifierLockType_Lock2, _T("lock2") },
-  { ModifierLockType_Lock3, _T("lock3") },
-  { ModifierLockType_Lock4, _T("lock4") },
-  { ModifierLockType_Lock5, _T("lock5") },
-  { ModifierLockType_Lock6, _T("lock6") },
-  { ModifierLockType_Lock7, _T("lock7") },
-  { ModifierLockType_Lock8, _T("lock8") },
-  { ModifierLockType_Lock9, _T("lock9") },
-};
-
-
-// stream output
-tostream &operator<<(tostream &i_ost, ModifierLockType i_data)
-{
-  tstring name;
-  if (getTypeName(&name, i_data,
-                 g_modifierLockTypeTable, NUMBER_OF(g_modifierLockTypeTable)))
-    i_ost << name;
-  else
-    i_ost << _T("(ModifierLockType internal error)");
-  return i_ost;
-}
-
-
-// get value of ModifierLockType
-bool getTypeValue(ModifierLockType *o_type, const tstring &i_name)
-{
-  return getTypeValue(o_type, i_name, g_modifierLockTypeTable,
-                     NUMBER_OF(g_modifierLockTypeTable));
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// ShowCommandType
-
-
-// ShowCommandType table
-typedef TypeTable<ShowCommandType> TypeTable_ShowCommandType;
-static const TypeTable_ShowCommandType g_showCommandTypeTable[] =
-{
-  { ShowCommandType_hide,            _T("hide")            },
-  { ShowCommandType_maximize,        _T("maximize")        },
-  { ShowCommandType_minimize,        _T("minimize")        },
-  { ShowCommandType_restore,         _T("restore")         },
-  { ShowCommandType_show,            _T("show")            },
-  { ShowCommandType_showDefault,     _T("showDefault")     },
-  { ShowCommandType_showMaximized,   _T("showMaximized")   },
-  { ShowCommandType_showMinimized,   _T("showMinimized")   },
-  { ShowCommandType_showMinNoActive, _T("showMinNoActive") },
-  { ShowCommandType_showNA,          _T("showNA")          },
-  { ShowCommandType_showNoActivate,  _T("showNoActivate")  },
-  { ShowCommandType_showNormal,      _T("showNormal")      },
-};
-
-
-// stream output
-tostream &operator<<(tostream &i_ost, ShowCommandType i_data)
-{
-  tstring name;
-  if (getTypeName(&name, i_data,
-                 g_showCommandTypeTable, NUMBER_OF(g_showCommandTypeTable)))
-    i_ost << name;
-  else
-    i_ost << _T("(ShowCommandType internal error)");
-  return i_ost;
-}
-
-
-// get value of ShowCommandType
-bool getTypeValue(ShowCommandType *o_type, const tstring &i_name)
-{
-  return getTypeValue(o_type, i_name, g_showCommandTypeTable,
-                     NUMBER_OF(g_showCommandTypeTable));
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// TargetWindowType
-
-
-// ModifierLockType table
-typedef TypeTable<TargetWindowType> TypeTable_TargetWindowType;
-static const TypeTable_TargetWindowType g_targetWindowType[] =
-{
-  { TargetWindowType_overlapped, _T("overlapped") },
-  { TargetWindowType_mdi,        _T("mdi")        },
-};
-
-
-// stream output
-tostream &operator<<(tostream &i_ost, TargetWindowType i_data)
-{
-  tstring name;
-  if (getTypeName(&name, i_data,
-                 g_targetWindowType, NUMBER_OF(g_targetWindowType)))
-    i_ost << name;
-  else
-    i_ost << _T("(TargetWindowType internal error)");
-  return i_ost;
-}
-
-
-// get value of TargetWindowType
-bool getTypeValue(TargetWindowType *o_type, const tstring &i_name)
-{
-  return getTypeValue(o_type, i_name, g_targetWindowType,
-                     NUMBER_OF(g_targetWindowType));
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// BooleanType
-
-
-// BooleanType table
-typedef TypeTable<BooleanType> TypeTable_BooleanType;
-static const TypeTable_BooleanType g_booleanType[] =
-{
-  { BooleanType_false, _T("false") },
-  { BooleanType_true,  _T("true")  },
-};
-
-
-// stream output
-tostream &operator<<(tostream &i_ost, BooleanType i_data)
-{
-  tstring name;
-  if (getTypeName(&name, i_data, g_booleanType, NUMBER_OF(g_booleanType)))
-    i_ost << name;
-  else
-    i_ost << _T("(BooleanType internal error)");
-  return i_ost;
-}
-
-
-// get value of BooleanType
-bool getTypeValue(BooleanType *o_type, const tstring &i_name)
-{
-  return getTypeValue(o_type, i_name, g_booleanType,
-                     NUMBER_OF(g_booleanType));
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// LogicalOperatorType
-
-
-// LogicalOperatorType table
-typedef TypeTable<LogicalOperatorType> TypeTable_LogicalOperatorType;
-static const TypeTable_LogicalOperatorType g_logicalOperatorType[] =
-{
-  { LogicalOperatorType_or, _T("||") },
-  { LogicalOperatorType_and,  _T("&&")  },
-};
-
-
-// stream output
-tostream &operator<<(tostream &i_ost, LogicalOperatorType i_data)
-{
-  tstring name;
-  if (getTypeName(&name, i_data, g_logicalOperatorType,
-                 NUMBER_OF(g_logicalOperatorType)))
-    i_ost << name;
-  else
-    i_ost << _T("(LogicalOperatorType internal error)");
-  return i_ost;
-}
-
-
-// get value of LogicalOperatorType
-bool getTypeValue(LogicalOperatorType *o_type, const tstring &i_name)
-{
-  return getTypeValue(o_type, i_name, g_logicalOperatorType,
-                     NUMBER_OF(g_logicalOperatorType));
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// WindowMonitorFromType
-
-
-// WindowMonitorFromType table
-typedef TypeTable<WindowMonitorFromType> TypeTable_WindowMonitorFromType;
-static const TypeTable_WindowMonitorFromType g_windowMonitorFromType[] =
-{
-  { WindowMonitorFromType_primary, _T("primary") },
-  { WindowMonitorFromType_current, _T("current") },
-};
-
-
-// stream output
-tostream &operator<<(tostream &i_ost, WindowMonitorFromType i_data)
-{
-  tstring name;
-  if(getTypeName(&name, i_data, g_windowMonitorFromType,
-                 NUMBER_OF(g_windowMonitorFromType)))
-    i_ost << name;
-  else
-    i_ost << _T("(WindowMonitorFromType internal error)");
-  return i_ost;
-}
-
-
-// get value of WindowMonitorFromType
-bool getTypeValue(WindowMonitorFromType *o_type, const tstring &i_name)
-{
-  return getTypeValue(o_type, i_name, g_windowMonitorFromType,
-                      NUMBER_OF(g_windowMonitorFromType));
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// std::list<tstringq>
-
-
-/// stream output
-tostream &operator<<(tostream &i_ost, const std::list<tstringq> &i_data)
-{
-  for (std::list<tstringq>::const_iterator
-        i = i_data.begin(); i != i_data.end(); ++ i)
-  {
-    i_ost << *i << _T(", ");
-  }
-  return i_ost;
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// FunctionData
-
-
-//
-FunctionData::~FunctionData()
-{
-}
-
-
-// stream output
-tostream &operator<<(tostream &i_ost, const FunctionData *i_data)
-{
-  return i_data->output(i_ost);
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// FunctionCreator
-
-
-///
-class FunctionCreator
-{
-public:
-  typedef FunctionData *(*Creator)();          /// 
-  
-public:
-  const _TCHAR *m_name;                                /// function name
-  Creator m_creator;                           /// function data creator
-};
-
-
-// create function
-FunctionData *createFunctionData(const tstring &i_name)
-{
-  static 
-#define FUNCTION_CREATOR
-#include "functions.h"
-#undef FUNCTION_CREATOR
-    ;
-
-  for (size_t i = 0; i != NUMBER_OF(functionCreators); ++ i)
-    if (i_name == functionCreators[i].m_name)
-      return functionCreators[i].m_creator();
-  return NULL;
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// misc. functions
-
-
-//
-bool getSuitableWindow(FunctionParam *i_param, HWND *o_hwnd)
-{
-  if (!i_param->m_isPressed)
-    return false;
-  *o_hwnd = getToplevelWindow(i_param->m_hwnd, NULL);
-  if (!*o_hwnd)
-    return false;
-  return true;
-}
-
-//
-bool getSuitableMdiWindow(FunctionParam *i_param, HWND *o_hwnd,
-                         TargetWindowType *io_twt,
-                         RECT *o_rcWindow = NULL, RECT *o_rcParent = NULL)
-{
-  if (!i_param->m_isPressed)
-    return false;
-  bool isMdi = *io_twt == TargetWindowType_mdi;
-  *o_hwnd = getToplevelWindow(i_param->m_hwnd, &isMdi);
-  *io_twt = isMdi ? TargetWindowType_mdi : TargetWindowType_overlapped;
-  if (!*o_hwnd)
-    return false;
-  switch (*io_twt)
-  {
-    case TargetWindowType_overlapped:
-      if (o_rcWindow)
-       GetWindowRect(*o_hwnd, o_rcWindow);
-      if (o_rcParent) {
-        HMONITOR hm = monitorFromWindow(i_param->m_hwnd,
-                                        MONITOR_DEFAULTTONEAREST);
-        MONITORINFO mi;
-        mi.cbSize = sizeof(mi);
-        getMonitorInfo(hm, &mi);
-        *o_rcParent = mi.rcWork;
-      }
-      break;
-    case TargetWindowType_mdi:
-      if (o_rcWindow)
-       getChildWindowRect(*o_hwnd, o_rcWindow);
-      if (o_rcParent)
-       GetClientRect(GetParent(*o_hwnd), o_rcParent);
-      break;
-  }
-  return true;
-}
-
-// get clipboard text (you must call closeClopboard())
-static const _TCHAR *getTextFromClipboard(HGLOBAL *o_hdata)
-{
-  *o_hdata = NULL;
-  
-  if (!OpenClipboard(NULL))
-    return NULL;
-
-#ifdef UNICODE
-  *o_hdata = GetClipboardData(CF_UNICODETEXT);
-#else
-  *o_hdata = GetClipboardData(CF_TEXT);
-#endif
-  if (!*o_hdata)
-    return NULL;
-  
-  _TCHAR *data = reinterpret_cast<_TCHAR *>(GlobalLock(*o_hdata));
-  if (!data)
-    return NULL;
-  return data;
-}
-
-// close clipboard that opend by getTextFromClipboard()
-static void closeClipboard(HGLOBAL i_hdata, HGLOBAL i_hdataNew = NULL)
-{
-  if (i_hdata)
-    GlobalUnlock(i_hdata);
-  if (i_hdataNew)
-  {
-    EmptyClipboard();
-#ifdef UNICODE
-    SetClipboardData(CF_UNICODETEXT, i_hdataNew);
-#else
-    SetClipboardData(CF_TEXT, i_hdataNew);
-#endif
-  }
-  CloseClipboard();
-}
-
-
-// EmacsEditKillLineFunc.
-// clear the contents of the clopboard
-// at that time, confirm if it is the result of the previous kill-line
-void Engine::EmacsEditKillLine::func()
-{
-  if (!m_buf.empty())
-  {
-    HGLOBAL g;
-    const _TCHAR *text = getTextFromClipboard(&g);
-    if (text == NULL || m_buf != text)
-      reset();
-    closeClipboard(g);
-  }
-  if (OpenClipboard(NULL))
-  {
-    EmptyClipboard();
-    CloseClipboard();
-  }
-}
-
-
-/** if the text of the clipboard is
-@doc
-<pre>
-1: EDIT Control (at EOL C-K): ""            =&gt; buf + "\r\n", Delete   
-0: EDIT Control (other  C-K): "(.+)"        =&gt; buf + "\1"             
-0: IE FORM TEXTAREA (at EOL C-K): "\r\n"    =&gt; buf + "\r\n"           
-2: IE FORM TEXTAREA (other C-K): "(.+)\r\n" =&gt; buf + "\1", Return Left
-^retval
-</pre>
-*/
-HGLOBAL Engine::EmacsEditKillLine::makeNewKillLineBuf(
-  const _TCHAR *i_data, int *o_retval)
-{
-  size_t len = m_buf.size();
-  len += _tcslen(i_data) + 3;
-  
-  HGLOBAL hdata = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE,
-                             len * sizeof(_TCHAR));
-  if (!hdata)
-    return NULL;
-  _TCHAR *dataNew = reinterpret_cast<_TCHAR *>(GlobalLock(hdata));
-  *dataNew = _T('\0');
-  if (!m_buf.empty())
-    _tcscpy(dataNew, m_buf.c_str());
-  
-  len = _tcslen(i_data);
-  if (3 <= len &&
-      i_data[len - 2] == _T('\r') && i_data[len - 1] == _T('\n'))
-  {
-    _tcscat(dataNew, i_data);
-    len = _tcslen(dataNew);
-    dataNew[len - 2] = _T('\0'); // chomp
-    *o_retval = 2;
-  }
-  else if (len == 0)
-  {
-    _tcscat(dataNew, _T("\r\n"));
-    *o_retval = 1;
-  }
-  else
-  {
-    _tcscat(dataNew, i_data);
-    *o_retval = 0;
-  }
-  
-  m_buf = dataNew;
-  
-  GlobalUnlock(hdata);
-  return hdata;
-}
-
-
-// EmacsEditKillLinePred
-int Engine::EmacsEditKillLine::pred()
-{
-  HGLOBAL g;
-  const _TCHAR *text = getTextFromClipboard(&g);
-  int retval;
-  HGLOBAL hdata = makeNewKillLineBuf(text ? text : _T(""), &retval);
-  closeClipboard(g, hdata);
-  return retval;
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// functions
-
-
-// send a default key to Windows
-void Engine::funcDefault(FunctionParam *i_param)
-{
-  {
-    Acquire a(&m_log, 1);
-    m_log << std::endl;
-    i_param->m_doesNeedEndl = false;
-  }
-  if (i_param->m_isPressed)
-    generateModifierEvents(i_param->m_c.m_mkey.m_modifier);
-  generateKeyEvent(i_param->m_c.m_mkey.m_key, i_param->m_isPressed, true);
-}
-
-// use a corresponding key of a parent keymap
-void Engine::funcKeymapParent(FunctionParam *i_param)
-{
-  Current c(i_param->m_c);
-  c.m_keymap = c.m_keymap->getParentKeymap();
-  if (!c.m_keymap)
-  {
-    funcDefault(i_param);
-    return;
-  }
-  
-  {
-    Acquire a(&m_log, 1);
-    m_log << _T("(") << c.m_keymap->getName() << _T(")") << std::endl;
-  }
-  i_param->m_doesNeedEndl = false;
-  generateKeyboardEvents(c);
-}
-
-// use a corresponding key of a current window
-void Engine::funcKeymapWindow(FunctionParam *i_param)
-{
-  Current c(i_param->m_c);
-  c.m_keymap = m_currentFocusOfThread->m_keymaps.front();
-  c.m_i = m_currentFocusOfThread->m_keymaps.begin();
-  generateKeyboardEvents(c);
-}
-
-// use a corresponding key of the previous prefixed keymap
-void Engine::funcKeymapPrevPrefix(FunctionParam *i_param, int i_previous)
-{
-  Current c(i_param->m_c);
-  if (0 < i_previous && 0 <= m_keymapPrefixHistory.size() - i_previous)
-  {
-    int n = i_previous - 1;
-    KeymapPtrList::reverse_iterator i = m_keymapPrefixHistory.rbegin();
-    while (0 < n && i != m_keymapPrefixHistory.rend())
-      --n, ++i;
-    c.m_keymap = *i;
-    generateKeyboardEvents(c);
-  }
-}
-
-// use a corresponding key of an other window class, or use a default key
-void Engine::funcOtherWindowClass(FunctionParam *i_param)
-{
-  Current c(i_param->m_c);
-  ++ c.m_i;
-  if (c.m_i == m_currentFocusOfThread->m_keymaps.end())
-  {
-    funcDefault(i_param);
-    return;
-  }
-  
-  c.m_keymap = *c.m_i;
-  {
-    Acquire a(&m_log, 1);
-    m_log << _T("(") << c.m_keymap->getName() << _T(")") << std::endl;
-  }
-  i_param->m_doesNeedEndl = false;
-  generateKeyboardEvents(c);
-}
-
-// prefix key
-void Engine::funcPrefix(FunctionParam *i_param, const Keymap *i_keymap,
-                       BooleanType i_doesIgnoreModifiers)
-{
-  if (!i_param->m_isPressed)
-    return;
-  
-  setCurrentKeymap(i_keymap, true);
-  
-  // generate prefixed event
-  generateEvents(i_param->m_c, m_currentKeymap, &Event::prefixed);
-  
-  m_isPrefix = true;
-  m_doesEditNextModifier = false;
-  m_doesIgnoreModifierForPrefix = !!i_doesIgnoreModifiers;
-
-  {
-    Acquire a(&m_log, 1);
-    m_log << _T("(") << i_keymap->getName() << _T(", ")
-         << (i_doesIgnoreModifiers ? _T("true") : _T("false")) << _T(")");
-  }
-}
-
-// other keymap's key
-void Engine::funcKeymap(FunctionParam *i_param, const Keymap *i_keymap)
-{
-  Current c(i_param->m_c);
-  c.m_keymap = i_keymap;
-  {
-    Acquire a(&m_log, 1);
-    m_log << _T("(") << c.m_keymap->getName() << _T(")") << std::endl;
-    i_param->m_doesNeedEndl = false;
-  }
-  generateKeyboardEvents(c);
-}
-
-// sync
-void Engine::funcSync(FunctionParam *i_param)
-{
-  if (i_param->m_isPressed)
-    generateModifierEvents(i_param->m_af->m_modifier);
-  if (!i_param->m_isPressed || m_currentFocusOfThread->m_isConsole)
-    return;
-  
-  Key *sync = m_setting->m_keyboard.getSyncKey();
-  if (sync->getScanCodesSize() == 0)
-    return;
-  const ScanCode *sc = sync->getScanCodes();
-  
-  // set variables exported from mayu.dll
-  g_hookData->m_syncKey = sc->m_scan;
-  g_hookData->m_syncKeyIsExtended = !!(sc->m_flags & ScanCode::E0E1);
-  m_isSynchronizing = true;
-  generateKeyEvent(sync, false, false);
-  
-  m_cs.release();
-  DWORD r = WaitForSingleObject(m_eSync, 5000);
-  if (r == WAIT_TIMEOUT)
-  {
-    Acquire a(&m_log, 0);
-    m_log << _T(" *FAILED*") << std::endl;
-  }
-  m_cs.acquire();
-  m_isSynchronizing = false;
-}
-
-// toggle lock
-void Engine::funcToggle(FunctionParam *i_param, ModifierLockType i_lock,
-                       ToggleType i_toggle)
-{
-  if (i_param->m_isPressed)                    // ignore PRESS
-    return;
-
-  Modifier::Type mt = static_cast<Modifier::Type>(i_lock);
-  switch (i_toggle)
-  {
-    case ToggleType_toggle:
-      m_currentLock.press(mt, !m_currentLock.isPressed(mt));
-      break;
-    case ToggleType_off:
-      m_currentLock.press(mt, false);
-      break;
-    case ToggleType_on:
-      m_currentLock.press(mt, true);
-      break;
-  }
-}
-
-// edit next user input key's modifier
-void Engine::funcEditNextModifier(FunctionParam *i_param,
-                                 const Modifier &i_modifier)
-{
-  if (!i_param->m_isPressed)
-    return;
-  
-  m_isPrefix = true;
-  m_doesEditNextModifier = true;
-  m_doesIgnoreModifierForPrefix = true;
-  m_modifierForNextKey = i_modifier;
-}
-
-// variable
-void Engine::funcVariable(FunctionParam *i_param, int i_mag, int i_inc)
-{
-  if (!i_param->m_isPressed)
-    return;
-  m_variable *= i_mag;
-  m_variable += i_inc;
-}
-
-// repeat N times
-void Engine::funcRepeat(FunctionParam *i_param, const KeySeq *i_keySeq,
-                       int i_max)
-{
-  if (i_param->m_isPressed)
-  {
-    int end = MIN(m_variable, i_max);
-    for (int i = 0; i < end - 1; ++ i)
-      generateKeySeqEvents(i_param->m_c, i_keySeq, Part_all);
-    if (0 < end)
-      generateKeySeqEvents(i_param->m_c, i_keySeq, Part_down);
-  }
-  else
-    generateKeySeqEvents(i_param->m_c, i_keySeq, Part_up);
-}
-
-// undefined (bell)
-void Engine::funcUndefined(FunctionParam *i_param)
-{
-  if (!i_param->m_isPressed)
-    return;
-  MessageBeep(MB_OK);
-}
-
-// ignore
-void Engine::funcIgnore(FunctionParam *)
-{
-  // do nothing
-}
-
-// post message
-void Engine::funcPostMessage(FunctionParam *i_param, ToWindowType i_window,
-                            UINT i_message, WPARAM i_wParam, LPARAM i_lParam)
-{
-  if (!i_param->m_isPressed)
-    return;
-
-  int window = static_cast<int>(i_window);
-  
-  HWND hwnd = i_param->m_hwnd;
-  if (0 < window)
-  {
-    for (int i = 0; i < window; ++ i)
-      hwnd = GetParent(hwnd);
-  }
-  else if (window == ToWindowType_toMainWindow)
-  {
-    while (true)
-    {
-      HWND p = GetParent(hwnd);
-      if (!p)
-       break;
-      hwnd = p;
-    }
-  }
-  else if (window == ToWindowType_toOverlappedWindow)
-  {
-    while (hwnd)
-    {
-#ifdef MAYU64
-      LONG_PTR style = GetWindowLongPtr(hwnd, GWL_STYLE);
-#else
-      LONG style = GetWindowLong(hwnd, GWL_STYLE);
-#endif
-      if ((style & WS_CHILD) == 0)
-       break;
-      hwnd = GetParent(hwnd);
-    }
-  }
-
-  if (hwnd)
-    PostMessage(hwnd, i_message, i_wParam, i_lParam);
-}
-
-
-// ShellExecute
-void Engine::funcShellExecute(FunctionParam *i_param,
-                             const StrExprArg &/*i_operation*/,
-                             const StrExprArg &/*i_file*/,
-                             const StrExprArg &/*i_parameters*/,
-                             const StrExprArg &/*i_directory*/,
-                             ShowCommandType /*i_showCommand*/)
-{
-  if (!i_param->m_isPressed)
-    return;
-  m_afShellExecute = i_param->m_af;
-  PostMessage(m_hwndAssocWindow,
-             WM_APP_engineNotify, EngineNotify_shellExecute, 0);
-}
-
-
-// shell execute
-void Engine::shellExecute()
-{
-  Acquire a(&m_cs);
-  
-  FunctionData_ShellExecute *fd =
-    reinterpret_cast<FunctionData_ShellExecute *>(
-      m_afShellExecute->m_functionData);
-  
-  int r = (int)ShellExecute(
-    NULL,
-    fd->m_operation.eval().empty() ? _T("open") : fd->m_operation.eval().c_str(),
-    fd->m_file.eval().empty() ? NULL : fd->m_file.eval().c_str(),
-    fd->m_parameters.eval().empty() ? NULL : fd->m_parameters.eval().c_str(),
-    fd->m_directory.eval().empty() ? NULL : fd->m_directory.eval().c_str(),
-    fd->m_showCommand);
-  if (32 < r)
-    return; // success
-
-  typedef TypeTable<int> ErrorTable;
-  static const ErrorTable errorTable[] =
-  {
-    { 0, _T("The operating system is out of memory or resources.") },
-    { ERROR_FILE_NOT_FOUND, _T("The specified file was not found.") },
-    { ERROR_PATH_NOT_FOUND, _T("The specified path was not found.") },
-    { ERROR_BAD_FORMAT, _T("The .exe file is invalid ")
-      _T("(non-Win32R .exe or error in .exe image).") },
-    { SE_ERR_ACCESSDENIED,
-      _T("The operating system denied access to the specified file.") },
-    { SE_ERR_ASSOCINCOMPLETE,
-      _T("The file name association is incomplete or invalid.") },
-    { SE_ERR_DDEBUSY,
-      _T("The DDE transaction could not be completed ")
-      _T("because other DDE transactions were being processed. ") },
-    { SE_ERR_DDEFAIL, _T("The DDE transaction failed.") },
-    { SE_ERR_DDETIMEOUT, _T("The DDE transaction could not be completed ")
-      _T("because the request timed out.") },
-    { SE_ERR_DLLNOTFOUND,
-      _T("The specified dynamic-link library was not found.") },
-    { SE_ERR_FNF, _T("The specified file was not found.") },
-    { SE_ERR_NOASSOC, _T("There is no application associated ")
-      _T("with the given file name extension.") },
-    { SE_ERR_OOM,
-      _T("There was not enough memory to complete the operation.") },
-    { SE_ERR_PNF, _T("The specified path was not found.") },
-    { SE_ERR_SHARE, _T("A sharing violation occurred.") },
-  };
-
-  tstring errorMessage(_T("Unknown error."));
-  getTypeName(&errorMessage, r, errorTable, NUMBER_OF(errorTable));
-  
-  Acquire b(&m_log, 0);
-  m_log << _T("error: ") << fd << _T(": ") << errorMessage << std::endl;
-}
-
-
-struct EnumWindowsForSetForegroundWindowParam
-{
-  const FunctionData_SetForegroundWindow *m_fd;
-  HWND m_hwnd;
-
-public:
-  EnumWindowsForSetForegroundWindowParam(
-    const FunctionData_SetForegroundWindow *i_fd)
-    : m_fd(i_fd),
-      m_hwnd(NULL)
-  {
-  }
-};
-
-
-/// enum windows for SetForegroundWindow
-static BOOL CALLBACK enumWindowsForSetForegroundWindow(
-  HWND i_hwnd, LPARAM i_lParam)
-{
-  EnumWindowsForSetForegroundWindowParam &ep =
-    *reinterpret_cast<EnumWindowsForSetForegroundWindowParam *>(i_lParam);
-
-  _TCHAR name[GANA_MAX_ATOM_LENGTH];
-  if (!GetClassName(i_hwnd, name, NUMBER_OF(name)))
-    return TRUE;
-  tsmatch what;
-  if (!boost::regex_search(tstring(name), what, ep.m_fd->m_windowClassName))
-    if (ep.m_fd->m_logicalOp == LogicalOperatorType_and)
-      return TRUE;                             // match failed
-
-  if (ep.m_fd->m_logicalOp == LogicalOperatorType_and)
-  {
-    if (GetWindowText(i_hwnd, name, NUMBER_OF(name)) == 0)
-      name[0] = _T('\0');
-    if (!boost::regex_search(tstring(name), what,
-                            ep.m_fd->m_windowTitleName))
-      return TRUE;                             // match failed
-  }
-
-  ep.m_hwnd = i_hwnd;
-  return FALSE;
-}
-
-
-/// SetForegroundWindow
-void Engine::funcSetForegroundWindow(FunctionParam *i_param, const tregex &,
-                                    LogicalOperatorType , const tregex &)
-{
-  if (!i_param->m_isPressed)
-    return;
-  EnumWindowsForSetForegroundWindowParam
-    ep(static_cast<const FunctionData_SetForegroundWindow *>(
-      i_param->m_af->m_functionData));
-  EnumWindows(enumWindowsForSetForegroundWindow,
-             reinterpret_cast<LPARAM>(&ep));
-  if (ep.m_hwnd)
-    PostMessage(m_hwndAssocWindow,
-               WM_APP_engineNotify, EngineNotify_setForegroundWindow,
-               reinterpret_cast<LPARAM>(ep.m_hwnd));
-
-}
-
-
-// load setting
-void Engine::funcLoadSetting(FunctionParam *i_param, const StrExprArg &i_name)
-{
-  if (!i_param->m_isPressed)
-    return;
-  if (!i_name.eval().empty())
-  {
-    // set MAYU_REGISTRY_ROOT\.mayuIndex which name is same with i_name
-    Registry reg(MAYU_REGISTRY_ROOT);
-
-    tregex split(_T("^([^;]*);([^;]*);(.*)$"));
-    tstringi dot_mayu;
-    for (size_t i = 0; i < MAX_MAYU_REGISTRY_ENTRIES; ++ i)
-    {
-      _TCHAR buf[100];
-      _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), i);
-      if (!reg.read(buf, &dot_mayu))
-       break;
-      
-      tsmatch what;
-      if (boost::regex_match(dot_mayu, what, split) &&
-         what.str(1) == i_name.eval())
-      {        
-       reg.write(_T(".mayuIndex"), i);
-       goto success;
-      }
-    }
-
-    {
-      Acquire a(&m_log, 0);
-      m_log << _T("unknown setting name: ") << i_name;
-    }
-    return;
-    
-    success: ;
-  }
-  PostMessage(m_hwndAssocWindow,
-             WM_APP_engineNotify, EngineNotify_loadSetting, 0);
-}
-
-// virtual key
-void Engine::funcVK(FunctionParam *i_param, VKey i_vkey)
-{
-  long key = static_cast<long>(i_vkey);
-  BYTE vkey = static_cast<BYTE>(i_vkey);
-  bool isExtended = !!(key & VKey_extended);
-  bool isUp       = !i_param->m_isPressed && !!(key & VKey_released);
-  bool isDown     = i_param->m_isPressed && !!(key & VKey_pressed);
-  
-  if (vkey == VK_LBUTTON && isDown)
-    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
-  else if (vkey == VK_LBUTTON && isUp)
-    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
-  else if (vkey == VK_MBUTTON && isDown)
-    mouse_event(MOUSEEVENTF_MIDDLEDOWN, 0, 0, 0, 0);
-  else if (vkey == VK_MBUTTON && isUp)
-    mouse_event(MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0);
-  else if (vkey == VK_RBUTTON && isDown)
-    mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
-  else if (vkey == VK_RBUTTON && isUp)
-    mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
-  else if (vkey == VK_XBUTTON1 && isDown)
-    mouse_event(MOUSEEVENTF_XDOWN, 0, 0, XBUTTON1, 0);
-  else if (vkey == VK_XBUTTON1 && isUp)
-    mouse_event(MOUSEEVENTF_XUP, 0, 0, XBUTTON1, 0);
-  else if (vkey == VK_XBUTTON2 && isDown)
-    mouse_event(MOUSEEVENTF_XDOWN, 0, 0, XBUTTON2, 0);
-  else if (vkey == VK_XBUTTON2 && isUp)
-    mouse_event(MOUSEEVENTF_XUP, 0, 0, XBUTTON2, 0);
-  else if (isUp || isDown)
-    keybd_event(vkey,
-               static_cast<BYTE>(MapVirtualKey(vkey, 0)),
-               (isExtended ? KEYEVENTF_EXTENDEDKEY : 0) |
-               (i_param->m_isPressed ? 0 : KEYEVENTF_KEYUP), 0);
-}
-
-// wait
-void Engine::funcWait(FunctionParam *i_param, int i_milliSecond)
-{
-  if (!i_param->m_isPressed)
-    return;
-  if (i_milliSecond < 0 || 5000 < i_milliSecond)       // too long wait
-    return;
-  
-  m_isSynchronizing = true;
-  m_cs.release();
-  Sleep(i_milliSecond);
-  m_cs.acquire();
-  m_isSynchronizing = false;
-}
-
-// investigate WM_COMMAND, WM_SYSCOMMAND
-void Engine::funcInvestigateCommand(FunctionParam *i_param)
-{
-  if (!i_param->m_isPressed)
-    return;
-  Acquire a(&m_log, 0);
-  g_hookData->m_doesNotifyCommand = !g_hookData->m_doesNotifyCommand;
-  if (g_hookData->m_doesNotifyCommand)
-    m_log << _T(" begin") << std::endl;
-  else
-    m_log << _T(" end") << std::endl;
-}
-
-// show mayu dialog box
-void Engine::funcMayuDialog(FunctionParam *i_param, MayuDialogType i_dialog,
-                           ShowCommandType i_showCommand)
-{
-  if (!i_param->m_isPressed)
-    return;
-  PostMessage(getAssociatedWndow(), WM_APP_engineNotify, EngineNotify_showDlg,
-             static_cast<LPARAM>(i_dialog) |
-             static_cast<LPARAM>(i_showCommand));
-}
-
-// describe bindings
-void Engine::funcDescribeBindings(FunctionParam *i_param)
-{
-  if (!i_param->m_isPressed)
-    return;
-  {
-    Acquire a(&m_log, 1);
-    m_log << std::endl;
-  }
-  describeBindings();
-}
-
-// show help message
-void Engine::funcHelpMessage(FunctionParam *i_param, const StrExprArg &i_title,
-                            const StrExprArg &i_message)
-{
-  if (!i_param->m_isPressed)
-    return;
-
-  m_helpTitle = i_title.eval();
-  m_helpMessage = i_message.eval();
-  bool doesShow = !(i_title.eval().size() == 0 && i_message.eval().size() == 0);
-  PostMessage(getAssociatedWndow(), WM_APP_engineNotify,
-             EngineNotify_helpMessage, doesShow);
-}
-
-// show variable
-void Engine::funcHelpVariable(FunctionParam *i_param, const StrExprArg &i_title)
-{
-  if (!i_param->m_isPressed)
-    return;
-
-  _TCHAR buf[20];
-  _sntprintf(buf, NUMBER_OF(buf), _T("%d"), m_variable);
-
-  m_helpTitle = i_title.eval();
-  m_helpMessage = buf;
-  PostMessage(getAssociatedWndow(), WM_APP_engineNotify,
-             EngineNotify_helpMessage, true);
-}
-
-// raise window
-void Engine::funcWindowRaise(FunctionParam *i_param,
-                            TargetWindowType i_twt)
-{
-  HWND hwnd;
-  if (!getSuitableMdiWindow(i_param, &hwnd, &i_twt))
-    return;
-  SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0,
-              SWP_ASYNCWINDOWPOS | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOSIZE);
-}
-
-// lower window
-void Engine::funcWindowLower(FunctionParam *i_param, TargetWindowType i_twt)
-{
-  HWND hwnd;
-  if (!getSuitableMdiWindow(i_param, &hwnd, &i_twt))
-    return;
-  SetWindowPos(hwnd, HWND_BOTTOM, 0, 0, 0, 0,
-              SWP_ASYNCWINDOWPOS | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOSIZE);
-}
-
-// minimize window
-void Engine::funcWindowMinimize(FunctionParam *i_param, TargetWindowType i_twt)
-{
-  HWND hwnd;
-  if (!getSuitableMdiWindow(i_param, &hwnd, &i_twt))
-    return;
-  PostMessage(hwnd, WM_SYSCOMMAND,
-             IsIconic(hwnd) ? SC_RESTORE : SC_MINIMIZE, 0);
-}
-
-// maximize window
-void Engine::funcWindowMaximize(FunctionParam *i_param, TargetWindowType i_twt)
-{
-  HWND hwnd;
-  if (!getSuitableMdiWindow(i_param, &hwnd, &i_twt))
-    return;
-  PostMessage(hwnd, WM_SYSCOMMAND,
-             IsZoomed(hwnd) ? SC_RESTORE : SC_MAXIMIZE, 0);
-}
-
-// maximize horizontally or virtically
-void Engine::funcWindowHVMaximize(FunctionParam *i_param,
-                                 BooleanType i_isHorizontal,
-                                 TargetWindowType i_twt)
-{
-  HWND hwnd;
-  RECT rc, rcd;
-  if (!getSuitableMdiWindow(i_param, &hwnd, &i_twt, &rc, &rcd))
-    return;
-
-  // erase non window
-  while (true)
-  {
-    WindowPositions::iterator i = m_windowPositions.begin();
-    WindowPositions::iterator end = m_windowPositions.end();
-    for (; i != end; ++ i)
-      if (!IsWindow((*i).m_hwnd))
-       break;
-    if (i == end)
-      break;
-    m_windowPositions.erase(i);
-  }
-
-  // find target
-  WindowPositions::iterator i = m_windowPositions.begin();
-  WindowPositions::iterator end = m_windowPositions.end();
-  WindowPositions::iterator target = end;
-  for (; i != end; ++ i)
-    if ((*i).m_hwnd == hwnd)
-    {
-      target = i;
-      break;
-    }
-  
-  if (IsZoomed(hwnd))
-    PostMessage(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0);
-  else
-  {
-    WindowPosition::Mode mode = WindowPosition::Mode_normal;
-    
-    if (target != end)
-    {
-      WindowPosition &wp = *target;
-      rc = wp.m_rc;
-      if (wp.m_mode == WindowPosition::Mode_HV)
-       mode = wp.m_mode =
-         i_isHorizontal ? WindowPosition::Mode_V : WindowPosition::Mode_H;
-      else if (( i_isHorizontal && wp.m_mode == WindowPosition::Mode_V) ||
-              (!i_isHorizontal && wp.m_mode == WindowPosition::Mode_H))
-       mode = wp.m_mode = WindowPosition::Mode_HV;
-      else
-       m_windowPositions.erase(target);
-    }
-    else
-    {
-      mode = i_isHorizontal ? WindowPosition::Mode_H : WindowPosition::Mode_V;
-      m_windowPositions.push_front(WindowPosition(hwnd, rc, mode));
-    }
-    
-    if (static_cast<int>(mode) & static_cast<int>(WindowPosition::Mode_H))
-      rc.left = rcd.left, rc.right = rcd.right;
-    if (static_cast<int>(mode) & static_cast<int>(WindowPosition::Mode_V))
-      rc.top = rcd.top, rc.bottom = rcd.bottom;
-    
-    asyncMoveWindow(hwnd, rc.left, rc.top, rcWidth(&rc), rcHeight(&rc));
-  }
-}
-
-// maximize window horizontally
-void Engine::funcWindowHMaximize(FunctionParam *i_param,
-                                TargetWindowType i_twt)
-{
-  funcWindowHVMaximize(i_param, BooleanType_true, i_twt);
-}
-
-// maximize window virtically
-void Engine::funcWindowVMaximize(FunctionParam *i_param,
-                                TargetWindowType i_twt)
-{
-  funcWindowHVMaximize(i_param, BooleanType_false, i_twt);
-}
-
-// move window
-void Engine::funcWindowMove(FunctionParam *i_param, int i_dx, int i_dy,
-                           TargetWindowType i_twt)
-{
-  funcWindowMoveTo(i_param, GravityType_C, i_dx, i_dy, i_twt);
-}
-
-// move window to ...
-void Engine::funcWindowMoveTo(FunctionParam *i_param,
-                             GravityType i_gravityType,
-                             int i_dx, int i_dy, TargetWindowType i_twt)
-{
-  HWND hwnd;
-  RECT rc, rcd;
-  if (!getSuitableMdiWindow(i_param, &hwnd, &i_twt, &rc, &rcd))
-    return;
-  
-  int x = rc.left + i_dx;
-  int y = rc.top + i_dy;
-
-  if (i_gravityType & GravityType_N)
-    y = i_dy + rcd.top;
-  if (i_gravityType & GravityType_E)
-    x = i_dx + rcd.right - rcWidth(&rc);
-  if (i_gravityType & GravityType_W)
-    x = i_dx + rcd.left;
-  if (i_gravityType & GravityType_S)
-    y = i_dy + rcd.bottom - rcHeight(&rc);
-  asyncMoveWindow(hwnd, x, y);
-}
-
-
-// move window visibly
-void Engine::funcWindowMoveVisibly(FunctionParam *i_param,
-                                  TargetWindowType i_twt)
-{
-  HWND hwnd;
-  RECT rc, rcd;
-  if (!getSuitableMdiWindow(i_param, &hwnd, &i_twt, &rc, &rcd))
-    return;
-
-  int x = rc.left;
-  int y = rc.top;
-  if (rc.left < rcd.left)
-    x = rcd.left;
-  else if (rcd.right < rc.right)
-    x = rcd.right - rcWidth(&rc);
-  if (rc.top < rcd.top)
-    y = rcd.top;
-  else if (rcd.bottom < rc.bottom)
-    y = rcd.bottom - rcHeight(&rc);
-  asyncMoveWindow(hwnd, x, y);
-}
-
-
-struct EnumDisplayMonitorsForWindowMonitorToParam
-{
-  std::vector<HMONITOR> m_monitors;
-  std::vector<MONITORINFO> m_monitorinfos;
-  int m_primaryMonitorIdx;
-  int m_currentMonitorIdx;
-
-  HMONITOR m_hmon;
-
-public:
-  EnumDisplayMonitorsForWindowMonitorToParam(HMONITOR i_hmon)
-    : m_hmon(i_hmon),
-      m_primaryMonitorIdx(-1), m_currentMonitorIdx(-1)
-  {
-  }
-};
-
-static BOOL CALLBACK enumDisplayMonitorsForWindowMonitorTo(
-  HMONITOR i_hmon, HDC i_hdc, LPRECT i_rcMonitor, LPARAM i_data)
-{
-  EnumDisplayMonitorsForWindowMonitorToParam &ep =
-    *reinterpret_cast<EnumDisplayMonitorsForWindowMonitorToParam *>(i_data);
-
-  ep.m_monitors.push_back(i_hmon);
-
-  MONITORINFO mi;
-  mi.cbSize = sizeof(mi);
-  getMonitorInfo(i_hmon, &mi);
-  ep.m_monitorinfos.push_back(mi);
-
-  if(mi.dwFlags & MONITORINFOF_PRIMARY)
-    ep.m_primaryMonitorIdx = ep.m_monitors.size() - 1;
-  if(i_hmon == ep.m_hmon)
-    ep.m_currentMonitorIdx = ep.m_monitors.size() - 1;
-
-  return TRUE;
-}
-
-/// move window to other monitor
-void Engine::funcWindowMonitorTo(
-    FunctionParam *i_param, WindowMonitorFromType i_fromType, int i_monitor,
-    BooleanType i_adjustPos, BooleanType i_adjustSize)
-{
-  HWND hwnd;
-  if(! getSuitableWindow(i_param, &hwnd))
-    return;
-
-  HMONITOR hmonCur;
-  hmonCur = monitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
-
-  EnumDisplayMonitorsForWindowMonitorToParam ep(hmonCur);
-  enumDisplayMonitors(NULL, NULL, enumDisplayMonitorsForWindowMonitorTo,
-                      reinterpret_cast<LPARAM>(&ep));
-  if(ep.m_monitors.size() < 1 ||
-     ep.m_primaryMonitorIdx < 0 || ep.m_currentMonitorIdx < 0)
-    return;
-
-  int targetIdx;
-  switch(i_fromType) {
-  case WindowMonitorFromType_primary:
-    targetIdx = (ep.m_primaryMonitorIdx + i_monitor) % ep.m_monitors.size();
-    break;
-
-  case WindowMonitorFromType_current:
-    targetIdx = (ep.m_currentMonitorIdx + i_monitor) % ep.m_monitors.size();
-    break;
-  }
-  if(ep.m_currentMonitorIdx == targetIdx)
-    return;
-
-  RECT rcCur, rcTarget, rcWin;
-  rcCur = ep.m_monitorinfos[ep.m_currentMonitorIdx].rcWork;
-  rcTarget = ep.m_monitorinfos[targetIdx].rcWork;
-  GetWindowRect(hwnd, &rcWin);
-
-  int x = rcTarget.left + (rcWin.left - rcCur.left);
-  int y = rcTarget.top + (rcWin.top - rcCur.top);
-  int w = rcWidth(&rcWin);
-  int h = rcHeight(&rcWin);
-
-  if(i_adjustPos) {
-    if(x + w > rcTarget.right)
-      x = rcTarget.right - w;
-    if(x < rcTarget.left)
-      x = rcTarget.left;
-    if(w > rcWidth(&rcTarget)) {
-      x = rcTarget.left;
-      w = rcWidth(&rcTarget);
-    }
-
-    if(y + h > rcTarget.bottom)
-      y = rcTarget.bottom - h;
-    if(y < rcTarget.top)
-      y = rcTarget.top;
-    if(h > rcHeight(&rcTarget)) {
-      y = rcTarget.top;
-      h = rcHeight(&rcTarget);
-    }
-  }
-
-  if(i_adjustPos && i_adjustSize) {
-    if(IsZoomed(hwnd))
-      PostMessage(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0);
-    asyncMoveWindow(hwnd, x, y, w, h);
-  } else {
-    asyncMoveWindow(hwnd, x, y);
-  }
-}
-
-/// move window to other monitor
-void Engine::funcWindowMonitor(
-    FunctionParam *i_param, int i_monitor,
-    BooleanType i_adjustPos, BooleanType i_adjustSize)
-{
-  funcWindowMonitorTo(i_param, WindowMonitorFromType_primary, i_monitor,
-                      i_adjustPos, i_adjustSize);
-}
-
-
-//
-void Engine::funcWindowClingToLeft(FunctionParam *i_param,
-                                  TargetWindowType i_twt)
-{
-  funcWindowMoveTo(i_param, GravityType_W, 0, 0, i_twt);
-}
-
-//
-void Engine::funcWindowClingToRight(FunctionParam *i_param,
-                                   TargetWindowType i_twt)
-{
-  funcWindowMoveTo(i_param, GravityType_E, 0, 0, i_twt);
-}
-
-//
-void Engine::funcWindowClingToTop(FunctionParam *i_param,
-                                 TargetWindowType i_twt)
-{
-  funcWindowMoveTo(i_param, GravityType_N, 0, 0, i_twt);
-}
-
-//
-void Engine::funcWindowClingToBottom(FunctionParam *i_param,
-                                    TargetWindowType i_twt)
-{
-  funcWindowMoveTo(i_param, GravityType_S, 0, 0, i_twt);
-}
-
-// close window
-void Engine::funcWindowClose(FunctionParam *i_param, TargetWindowType i_twt)
-{
-  HWND hwnd;
-  if (!getSuitableMdiWindow(i_param, &hwnd, &i_twt))
-    return;
-  PostMessage(hwnd, WM_SYSCOMMAND, SC_CLOSE, 0);
-}
-
-// toggle top-most flag of the window
-void Engine::funcWindowToggleTopMost(FunctionParam *i_param)
-{
-  HWND hwnd;
-  if (!getSuitableWindow(i_param, &hwnd))
-    return;
-  SetWindowPos(
-    hwnd,
-#ifdef MAYU64
-    (GetWindowLongPtr(hwnd, GWL_EXSTYLE) & WS_EX_TOPMOST) ?
-#else
-    (GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_TOPMOST) ?
-#endif
-    HWND_NOTOPMOST : HWND_TOPMOST,
-    0, 0, 0, 0,
-    SWP_ASYNCWINDOWPOS | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOSIZE);
-}
-
-// identify the window
-void Engine::funcWindowIdentify(FunctionParam *i_param)
-{
-  if (!i_param->m_isPressed)
-    return;
-
-  _TCHAR className[GANA_MAX_ATOM_LENGTH];
-  bool ok = false;
-  if (GetClassName(i_param->m_hwnd, className, NUMBER_OF(className)))
-  {
-    if (_tcsicmp(className, _T("ConsoleWindowClass")) == 0)
-    {
-      _TCHAR titleName[1024];
-      if (GetWindowText(i_param->m_hwnd, titleName, NUMBER_OF(titleName)) == 0)
-       titleName[0] = _T('\0');
-      {
-       Acquire a(&m_log, 1);
-       m_log << _T("HWND:\t") << std::hex
-             << reinterpret_cast<int>(i_param->m_hwnd)
-             << std::dec << std::endl;
-      }
-      Acquire a(&m_log, 0);
-      m_log << _T("CLASS:\t") << className << std::endl;
-      m_log << _T("TITLE:\t") << titleName << std::endl;
-
-      HWND hwnd = getToplevelWindow(i_param->m_hwnd, NULL);
-      RECT rc;
-      GetWindowRect(hwnd, &rc);
-      m_log << _T("Toplevel Window Position/Size: (")
-           << rc.left << _T(", ") << rc.top << _T(") / (")
-           << rcWidth(&rc) << _T("x") << rcHeight(&rc)
-           << _T(")") << std::endl;
-      
-      SystemParametersInfo(SPI_GETWORKAREA, 0, (void *)&rc, FALSE);
-      m_log << _T("Desktop Window Position/Size: (")
-           << rc.left << _T(", ") << rc.top << _T(") / (")
-           << rcWidth(&rc) << _T("x") << rcHeight(&rc)
-           << _T(")") << std::endl;
-
-      m_log << std::endl;
-      ok = true;
-    }
-  }
-  if (!ok)
-  {
-    UINT WM_MAYU_MESSAGE = RegisterWindowMessage(
-               addSessionId(WM_MAYU_MESSAGE_NAME).c_str());
-    CHECK_TRUE( PostMessage(i_param->m_hwnd, WM_MAYU_MESSAGE,
-                           MayuMessage_notifyName, 0) );
-  }
-}
-
-// set alpha blending parameter to the window
-void Engine::funcWindowSetAlpha(FunctionParam *i_param, int i_alpha)
-{
-  HWND hwnd;
-  if (!getSuitableWindow(i_param, &hwnd))
-    return;
-  
-  if (i_alpha < 0)     // remove all alpha
-  {
-    for (WindowsWithAlpha::iterator i = m_windowsWithAlpha.begin(); 
-        i != m_windowsWithAlpha.end(); ++ i)
-    {
-#ifdef MAYU64
-      SetWindowLongPtr(*i, GWL_EXSTYLE,
-                   GetWindowLongPtr(*i, GWL_EXSTYLE) & ~WS_EX_LAYERED);
-#else
-      SetWindowLong(*i, GWL_EXSTYLE,
-                   GetWindowLong(*i, GWL_EXSTYLE) & ~WS_EX_LAYERED);
-#endif
-      RedrawWindow(*i, NULL, NULL,
-                  RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
-    }
-    m_windowsWithAlpha.clear();
-  }
-  else
-  {
-#ifdef MAYU64
-    LONG_PTR exStyle = GetWindowLongPtr(hwnd, GWL_EXSTYLE);
-#else
-    LONG exStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
-#endif
-    if (exStyle & WS_EX_LAYERED)       // remove alpha
-    {
-      WindowsWithAlpha::iterator
-       i = std::find(m_windowsWithAlpha.begin(), m_windowsWithAlpha.end(),
-                     hwnd);
-      if (i == m_windowsWithAlpha.end())
-       return; // already layered by the application
-    
-      m_windowsWithAlpha.erase(i);
-    
-#ifdef MAYU64
-      SetWindowLongPtr(hwnd, GWL_EXSTYLE, exStyle & ~WS_EX_LAYERED);
-#else    
-      SetWindowLong(hwnd, GWL_EXSTYLE, exStyle & ~WS_EX_LAYERED);
-#endif
-    }
-    else       // add alpha
-    {
-#ifdef MAYU64
-      SetWindowLongPtr(hwnd, GWL_EXSTYLE, exStyle | WS_EX_LAYERED);
-#else
-      SetWindowLong(hwnd, GWL_EXSTYLE, exStyle | WS_EX_LAYERED);
-#endif
-      i_alpha %= 101;
-      if (!setLayeredWindowAttributes(hwnd, 0,
-                                     (BYTE)(255 * i_alpha / 100), LWA_ALPHA))
-      {
-       Acquire a(&m_log, 0);
-       m_log << _T("error: &WindowSetAlpha(") << i_alpha
-             << _T(") failed for HWND: ") << std::hex
-             << hwnd << std::dec << std::endl;
-       return;
-      }
-      m_windowsWithAlpha.push_front(hwnd);
-    }
-    RedrawWindow(hwnd, NULL, NULL,
-                RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
-  }
-}
-
-
-// redraw the window
-void Engine::funcWindowRedraw(FunctionParam *i_param)
-{
-  HWND hwnd;
-  if (!getSuitableWindow(i_param, &hwnd))
-    return;
-  RedrawWindow(hwnd, NULL, NULL,
-              RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
-}
-
-// resize window to
-void Engine::funcWindowResizeTo(FunctionParam *i_param, int i_width,
-                               int i_height, TargetWindowType i_twt)
-{
-  HWND hwnd;
-  RECT rc, rcd;
-  if (!getSuitableMdiWindow(i_param, &hwnd, &i_twt, &rc, &rcd))
-    return;
-  
-  if (i_width == 0)
-    i_width = rcWidth(&rc);
-  else if (i_width < 0)
-    i_width += rcWidth(&rcd);
-  
-  if (i_height == 0)
-    i_height = rcHeight(&rc);
-  else if (i_height < 0)
-    i_height += rcHeight(&rcd);
-  
-  asyncResize(hwnd, i_width, i_height);
-}
-
-// move the mouse cursor
-void Engine::funcMouseMove(FunctionParam *i_param, int i_dx, int i_dy)
-{
-  if (!i_param->m_isPressed)
-    return;
-  POINT pt;
-  GetCursorPos(&pt);
-  SetCursorPos(pt.x + i_dx, pt.y + i_dy);
-}
-
-// send a mouse-wheel-message to Windows
-void Engine::funcMouseWheel(FunctionParam *i_param, int i_delta)
-{
-  if (!i_param->m_isPressed)
-    return;
-  mouse_event(MOUSEEVENTF_WHEEL, 0, 0, i_delta, 0);
-}
-
-// convert the contents of the Clipboard to upper case
-void Engine::funcClipboardChangeCase(FunctionParam *i_param,
-                                    BooleanType i_doesConvertToUpperCase)
-{
-  if (!i_param->m_isPressed)
-    return;
-  
-  HGLOBAL hdata;
-  const _TCHAR *text = getTextFromClipboard(&hdata);
-  HGLOBAL hdataNew = NULL;
-  if (text)
-  {
-    int size = static_cast<int>(GlobalSize(hdata));
-    hdataNew = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, size);
-    if (hdataNew)
-    {
-      if (_TCHAR *dataNew = reinterpret_cast<_TCHAR *>(GlobalLock(hdataNew)))
-      {
-       std::memcpy(dataNew, text, size);
-       _TCHAR *dataEnd = dataNew + size;
-       while (dataNew < dataEnd && *dataNew)
-       {
-         _TCHAR c = *dataNew;
-         if (_istlead(c))
-           dataNew += 2;
-         else
-           *dataNew++ =
-             i_doesConvertToUpperCase ? _totupper(c) : _totlower(c);
-       }
-       GlobalUnlock(hdataNew);
-      }
-    }
-  }
-  closeClipboard(hdata, hdataNew);
-}
-
-// convert the contents of the Clipboard to upper case
-void Engine::funcClipboardUpcaseWord(FunctionParam *i_param)
-{
-  funcClipboardChangeCase(i_param, BooleanType_true);
-}
-
-// convert the contents of the Clipboard to lower case
-void Engine::funcClipboardDowncaseWord(FunctionParam *i_param)
-{
-  funcClipboardChangeCase(i_param, BooleanType_false);
-}
-
-// set the contents of the Clipboard to the string
-void Engine::funcClipboardCopy(FunctionParam *i_param, const StrExprArg &i_text)
-{
-  if (!i_param->m_isPressed)
-    return;
-  if (!OpenClipboard(NULL))
-    return;
-  
-  HGLOBAL hdataNew =
-    GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE,
-               (i_text.eval().size() + 1) * sizeof(_TCHAR));
-  if (!hdataNew)
-    return;
-  _TCHAR *dataNew = reinterpret_cast<_TCHAR *>(GlobalLock(hdataNew));
-  _tcscpy(dataNew, i_text.eval().c_str());
-  GlobalUnlock(hdataNew);
-  closeClipboard(NULL, hdataNew);
-}
-
-//
-void Engine::funcEmacsEditKillLinePred(
-  FunctionParam *i_param, const KeySeq *i_keySeq1, const KeySeq *i_keySeq2)
-{
-  m_emacsEditKillLine.m_doForceReset = false;
-  if (!i_param->m_isPressed)
-    return;
-  
-  int r = m_emacsEditKillLine.pred();
-  const KeySeq *keySeq;
-  if (r == 1)
-    keySeq = i_keySeq1;
-  else if (r == 2)
-    keySeq = i_keySeq2;
-  else // r == 0
-    return;
-  ASSERT(keySeq);
-  generateKeySeqEvents(i_param->m_c, keySeq, Part_all);
-}
-
-//
-void Engine::funcEmacsEditKillLineFunc(FunctionParam *i_param)
-{
-  if (!i_param->m_isPressed)
-    return;
-  m_emacsEditKillLine.func();
-  m_emacsEditKillLine.m_doForceReset = false;
-}
-
-// clear log
-void Engine::funcLogClear(FunctionParam *i_param)
-{
-  if (!i_param->m_isPressed)
-    return;
-  PostMessage(getAssociatedWndow(), WM_APP_engineNotify,
-             EngineNotify_clearLog, 0);
-}
-
-// recenter
-void Engine::funcRecenter(FunctionParam *i_param)
-{
-  if (!i_param->m_isPressed)
-    return;
-  if (m_hwndFocus)
-  {
-    UINT WM_MAYU_MESSAGE = RegisterWindowMessage(
-               addSessionId(WM_MAYU_MESSAGE_NAME).c_str());
-    PostMessage(m_hwndFocus, WM_MAYU_MESSAGE, MayuMessage_funcRecenter, 0);
-  }
-}
-
-// set IME open status
-void Engine::funcSetImeStatus(FunctionParam *i_param, ToggleType i_toggle)
-{
-  if (!i_param->m_isPressed)
-    return;
-  if (m_hwndFocus)
-  {
-    UINT WM_MAYU_MESSAGE = RegisterWindowMessage(
-               addSessionId(WM_MAYU_MESSAGE_NAME).c_str());
-    int status = -1;
-    switch (i_toggle)
-    {
-      case ToggleType_toggle:
-       status = -1;
-       break;
-      case ToggleType_off:
-       status = 0;
-       break;
-      case ToggleType_on:
-       status = 1;
-       break;
-    }
-    PostMessage(m_hwndFocus, WM_MAYU_MESSAGE, MayuMessage_funcSetImeStatus, status);
-  }
-}
-
-// set IME open status
-void Engine::funcSetImeString(FunctionParam *i_param, const StrExprArg &i_data)
-{
-  if (!i_param->m_isPressed)
-    return;
-  if (m_hwndFocus)
-  {
-    UINT WM_MAYU_MESSAGE = RegisterWindowMessage(
-               addSessionId(WM_MAYU_MESSAGE_NAME).c_str());
-    PostMessage(m_hwndFocus, WM_MAYU_MESSAGE, MayuMessage_funcSetImeString, i_data.eval().size() * sizeof(_TCHAR));
-
-    DWORD len = 0;
-    DWORD error;
-    DisconnectNamedPipe(m_hookPipe);
-    ConnectNamedPipe(m_hookPipe, NULL);
-    error = WriteFile(m_hookPipe, i_data.eval().c_str(),
-                     i_data.eval().size() * sizeof(_TCHAR),
-                     &len, NULL);
-
-    //FlushFileBuffers(m_hookPipe);
-  }
-}
-
-// Direct SSTP Server
-class DirectSSTPServer
-{
-public:
-  tstring m_path;
-  HWND m_hwnd;
-  tstring m_name;
-  tstring m_keroname;
-
-public:
-  DirectSSTPServer()
-    : m_hwnd(NULL)
-  {
-  }
-};
-
-
-class ParseDirectSSTPData
-{
-  typedef boost::match_results<boost::regex::const_iterator> MR;
-
-public:
-  typedef std::map<tstring, DirectSSTPServer> DirectSSTPServers;
-
-private:
-  DirectSSTPServers *m_directSSTPServers;
-  
-public:
-  // constructor
-  ParseDirectSSTPData(DirectSSTPServers *i_directSSTPServers)
-    : m_directSSTPServers(i_directSSTPServers)
-  {
-  }
-  
-  bool operator()(const MR& i_what)
-  {
-#ifdef _UNICODE
-    tstring id(to_wstring(std::string(i_what[1].first, i_what[1].second)));
-    tstring member(to_wstring(std::string(i_what[2].first, i_what[2].second)));
-    tstring value(to_wstring(std::string(i_what[3].first, i_what[3].second)));
-#else
-    tstring id(i_what[1].first, i_what[1].second);
-    tstring member(i_what[2].first, i_what[2].second);
-    tstring value(i_what[3].first, i_what[3].second);
-#endif
-
-    if (member == _T("path"))
-      (*m_directSSTPServers)[id].m_path = value;
-    else if (member == _T("hwnd"))
-      (*m_directSSTPServers)[id].m_hwnd =
-       reinterpret_cast<HWND>(_ttoi(value.c_str()));
-    else if (member == _T("name"))
-      (*m_directSSTPServers)[id].m_name = value;
-    else if (member == _T("keroname"))
-      (*m_directSSTPServers)[id].m_keroname = value;
-    return true; 
-  }
-};
-
-// Direct SSTP
-void Engine::funcDirectSSTP(FunctionParam *i_param,
-                           const tregex &i_name,
-                           const StrExprArg &i_protocol,
-                           const std::list<tstringq> &i_headers)
-{
-  if (!i_param->m_isPressed)
-    return;
-
-  // check Direct SSTP server exist ?
-  if (HANDLE hm = OpenMutex(MUTEX_ALL_ACCESS, FALSE, _T("sakura")))
-    CloseHandle(hm);
-  else
-  {
-    Acquire a(&m_log, 0);
-    m_log << _T(" Error(1): Direct SSTP server does not exist.");
-    return;
-  }
-
-  HANDLE hfm = OpenFileMapping(FILE_MAP_READ, FALSE, _T("Sakura"));
-  if (!hfm)
-  {
-    Acquire a(&m_log, 0);
-    m_log << _T(" Error(2): Direct SSTP server does not provide data.");
-    return;
-  }
-  
-  char *data =
-    reinterpret_cast<char *>(MapViewOfFile(hfm, FILE_MAP_READ, 0, 0, 0));
-  if (!data)
-  {
-    CloseHandle(hfm);
-    Acquire a(&m_log, 0);
-    m_log << _T(" Error(3): Direct SSTP server does not provide data.");
-    return;
-  }
-  
-  long length = *(long *)data;
-  const char *begin = data + 4;
-  const char *end = data + length;
-  boost::regex getSakura("([0-9a-fA-F]{32})\\.([^\x01]+)\x01(.*?)\r\n");
-  
-  ParseDirectSSTPData::DirectSSTPServers servers;
-  boost::regex_iterator<boost::regex::const_iterator>
-    it(begin, end, getSakura), last;
-  for (; it != last; ++it)
-    ((ParseDirectSSTPData)(&servers))(*it);
-
-  // make request
-  tstring request;
-  if (!i_protocol.eval().size())
-    request += _T("NOTIFY SSTP/1.1");
-  else
-    request += i_protocol.eval();
-  request += _T("\r\n");
-
-  bool hasSender = false;
-  for (std::list<tstringq>::const_iterator
-        i = i_headers.begin(); i != i_headers.end(); ++ i)
-  {
-    if (_tcsnicmp(_T("Charset"), i->c_str(), 7) == 0 ||
-       _tcsnicmp(_T("Hwnd"),    i->c_str(), 4) == 0)
-      continue;
-    if (_tcsnicmp(_T("Sender"), i->c_str(), 6) == 0)
-      hasSender = true;
-    request += i->c_str();
-    request += _T("\r\n");
-  }
-
-  if (!hasSender)
-  {
-    request += _T("Sender: ");
-    request += loadString(IDS_mayu);
-    request += _T("\r\n");
-  }
-  
-  _TCHAR buf[100];
-  _sntprintf(buf, NUMBER_OF(buf), _T("HWnd: %d\r\n"),
-            reinterpret_cast<int>(m_hwndAssocWindow));
-  request += buf;
-
-#ifdef _UNICODE
-  request += _T("Charset: UTF-8\r\n");
-#else
-  request += _T("Charset: Shift_JIS\r\n");
-#endif
-  request += _T("\r\n");
-
-#ifdef _UNICODE
-  std::string request_UTF_8 = to_UTF_8(request);
-#endif
-
-  // send request to Direct SSTP Server which matches i_name;
-  for (ParseDirectSSTPData::DirectSSTPServers::iterator
-        i = servers.begin(); i != servers.end(); ++ i)
-  {
-    tsmatch what;
-    if (boost::regex_match(i->second.m_name, what, i_name))
-    {
-      COPYDATASTRUCT cd;
-      cd.dwData = 9801;
-#ifdef _UNICODE
-      cd.cbData = request_UTF_8.size();
-      cd.lpData = (void *)request_UTF_8.c_str();
-#else
-      cd.cbData = request.size();
-      cd.lpData = (void *)request.c_str();
-#endif
-#ifdef MAYU64
-      DWORD_PTR result;
-#else
-      DWORD result;
-#endif
-      SendMessageTimeout(i->second.m_hwnd, WM_COPYDATA,
-                        reinterpret_cast<WPARAM>(m_hwndAssocWindow),
-                        reinterpret_cast<LPARAM>(&cd),
-                        SMTO_ABORTIFHUNG | SMTO_BLOCK, 5000, &result);
-    }
-  }
-  
-  UnmapViewOfFile(data);
-  CloseHandle(hfm);
-}
-
-
-namespace shu
-{
-  class PlugIn
-  {
-    enum Type
-    {
-      Type_A,
-      Type_W
-    };
-    
-  private:
-    HMODULE m_dll;
-    FARPROC m_func;
-    Type m_type;
-    tstringq m_funcParam;
-    
-  public:
-    PlugIn() : m_dll(NULL)
-    {
-    }
-    
-    ~PlugIn()
-    {
-      FreeLibrary(m_dll);
-    }
-
-    bool load(const tstringq &i_dllName, const tstringq &i_funcName,
-             const tstringq &i_funcParam, tomsgstream &i_log)
-    {
-      m_dll = LoadLibrary((_T("Plugins\\") + i_dllName).c_str());
-      if (!m_dll)
-      {
-       m_dll = LoadLibrary((_T("Plugin\\") + i_dllName).c_str());
-       if (!m_dll)
-       {
-         m_dll = LoadLibrary(i_dllName.c_str());
-         if (!m_dll)
-         {
-           Acquire a(&i_log);
-           i_log << std::endl;
-           i_log << _T("error: &PlugIn() failed to load ") << i_dllName << std::endl;
-           return false;
-         }
-       }
-      }
-
-      // get function
-#ifdef UNICODE
-#  define to_wstring
-#else
-#  define to_string
-#endif
-      m_type = Type_W;
-      m_func = GetProcAddress(m_dll, to_string(_T("mayu") + i_funcName + _T("W")).c_str());
-      if (!m_func)
-      {
-       m_type = Type_A;
-       m_func
-         = GetProcAddress(m_dll, to_string(_T("mayu") + i_funcName + _T("A")).c_str());
-       if (!m_func)
-       {
-         m_func = GetProcAddress(m_dll, to_string(_T("mayu") + i_funcName).c_str());
-         if (!m_func)
-         {
-           m_func = GetProcAddress(m_dll, to_string(i_funcName).c_str());
-           if (!m_func)
-           {
-             Acquire a(&i_log);
-             i_log << std::endl;
-             i_log << _T("error: &PlugIn() failed to find function: ")
-                   << i_funcName << std::endl;
-             return false;
-           }
-         }
-       }
-      }
-      
-      m_funcParam = i_funcParam;
-      return true;
-    }
-
-    void exec()
-    {
-      ASSERT( m_dll );
-      ASSERT( m_func );
-      
-      typedef void (WINAPI * PLUGIN_FUNCTION_A)(const char *i_arg);
-      typedef void (WINAPI * PLUGIN_FUNCTION_W)(const wchar_t *i_arg);
-      switch (m_type)
-      {
-       case Type_A:
-         reinterpret_cast<PLUGIN_FUNCTION_A>(m_func)(to_string(m_funcParam).c_str());
-         break;
-       case Type_W:
-         reinterpret_cast<PLUGIN_FUNCTION_W>(m_func)(to_wstring(m_funcParam).c_str());
-         break;
-      }
-    }
-#undef to_string
-#undef to_wstring
-  };
-
-  static void plugInThread(void *i_plugin)
-  {
-    PlugIn *plugin = static_cast<PlugIn *>(i_plugin);
-    plugin->exec();
-    delete plugin;
-  }
-}
-
-void Engine::funcPlugIn(FunctionParam *i_param,
-                       const StrExprArg &i_dllName,
-                       const StrExprArg &i_funcName,
-                       const StrExprArg &i_funcParam,
-                       BooleanType i_doesCreateThread)
-{
-  if (!i_param->m_isPressed)
-    return;
-
-  shu::PlugIn *plugin = new shu::PlugIn();
-  if (!plugin->load(i_dllName.eval(), i_funcName.eval(), i_funcParam.eval(), m_log))
-  {
-    delete plugin;
-    return;
-  }
-  if (i_doesCreateThread)
-  {
-    if (_beginthread(shu::plugInThread, 0, plugin) == -1)
-    {
-      delete plugin;
-      Acquire a(&m_log);
-      m_log << std::endl;
-      m_log << _T("error: &PlugIn() failed to create thread.");
-    }
-    return;
-  }
-  else
-    plugin->exec();
-}
-
-
-void Engine::funcMouseHook(FunctionParam *i_param,
-                          MouseHookType i_hookType, int i_hookParam)
-{
-  GetCursorPos(&g_hookData->m_mousePos);
-  g_hookData->m_mouseHookType = i_hookType;
-  g_hookData->m_mouseHookParam = i_hookParam;
-
-  switch (i_hookType)
-  {
-    case MouseHookType_WindowMove:
-    {
-      // For this type, g_hookData->m_mouseHookParam means
-      // target window type to move.
-      HWND target;
-      bool isMDI;
-
-      // i_hooParam < 0 means target window to move is MDI.
-      if (i_hookParam < 0)
-       isMDI = true;
-      else
-       isMDI = false;
-
-      // abs(i_hookParam) == 2: target is window under mouse cursor
-      // otherwise: target is current focus window
-      if (i_hookParam == 2 || i_hookParam == -2)
-       target = WindowFromPoint(g_hookData->m_mousePos);
-      else
-       target = i_param->m_hwnd;
-
-      g_hookData->m_hwndMouseHookTarget =
-       reinterpret_cast<DWORD>(getToplevelWindow(target, &isMDI));
-      break;
-    default:
-      g_hookData->m_hwndMouseHookTarget = NULL;
-      break;
-    }
-  }
-  return;
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// StrExpr
-class StrExpr
-{
-private:
-  tstringq m_symbol;
-protected:
-  static const Engine *s_engine;
-public:
-  StrExpr(const tstringq &i_symbol) : m_symbol(i_symbol) {};
-
-  virtual ~StrExpr() {};
-
-  virtual StrExpr *clone() const
-  {
-    return new StrExpr(*this);
-  }
-
-  virtual tstringq eval() const
-  {
-    return m_symbol;
-  }
-
-  static void setEngine(const Engine *i_engine) { s_engine = i_engine; }
-};
-
-const Engine *StrExpr::s_engine = NULL;
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// StrExprClipboard
-class StrExprClipboard : public StrExpr
-{
-public:
-  StrExprClipboard(const tstringq &i_symbol) : StrExpr(i_symbol) {};
-
-  ~StrExprClipboard() {};
-
-  StrExpr *clone() const
-  {
-    return new StrExprClipboard(*this);
-  }
-
-  tstringq eval() const
-  {
-    HGLOBAL g;
-    const _TCHAR *text = getTextFromClipboard(&g);
-    const tstring value(text == NULL ? _T("") : text);
-    closeClipboard(g);
-    return value;
-  }
-};
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// StrExprWindowClassName
-class StrExprWindowClassName : public StrExpr
-{
-public:
-  StrExprWindowClassName(const tstringq &i_symbol) : StrExpr(i_symbol) {};
-
-  ~StrExprWindowClassName() {};
-
-  StrExpr *clone() const
-  {
-    return new StrExprWindowClassName(*this);
-  }
-
-  tstringq eval() const
-  {
-    return s_engine->getCurrentWindowClassName();
-  }
-};
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// StrExprWindowTitleName
-class StrExprWindowTitleName : public StrExpr
-{
-public:
-  StrExprWindowTitleName(const tstringq &i_symbol) : StrExpr(i_symbol) {};
-
-  ~StrExprWindowTitleName() {};
-
-  StrExpr *clone() const
-  {
-    return new StrExprWindowTitleName(*this);
-  }
-
-  tstringq eval() const
-  {
-    return s_engine->getCurrentWindowTitleName();
-  }
-};
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// StrExprArg
-
-
-// default constructor
-StrExprArg::StrExprArg()
-{
-  m_expr = new StrExpr(_T(""));
-}
-
-
-// copy contructor
-StrExprArg::StrExprArg(const StrExprArg &i_data)
-{
-  m_expr = i_data.m_expr->clone();
-}
-
-
-StrExprArg &StrExprArg::operator=(const StrExprArg &i_data)
-{
-  if (i_data.m_expr == m_expr)
-    return *this;
-
-  delete m_expr;
-  m_expr = i_data.m_expr->clone();
-
-  return *this;
-}
-
-
-// initializer
-StrExprArg::StrExprArg(const tstringq &i_symbol, Type i_type)
-{
-  switch (i_type)
-  {
-    case Literal:
-      m_expr = new StrExpr(i_symbol);
-      break;
-    case Builtin:
-      if (i_symbol == _T("Clipboard"))
-       m_expr = new StrExprClipboard(i_symbol);
-      else if (i_symbol == _T("WindowClassName"))
-       m_expr = new StrExprWindowClassName(i_symbol);
-      else if (i_symbol == _T("WindowTitleName"))
-       m_expr = new StrExprWindowTitleName(i_symbol);
-      break;
-    default:
-      break;
-  }
-}
-
-
-StrExprArg::~StrExprArg()
-{
-  delete m_expr;
-}
-
-
-tstringq StrExprArg::eval() const
-{
-  return m_expr->eval();
-}
-
-void StrExprArg::setEngine(const Engine *i_engine)
-{
-  StrExpr::setEngine(i_engine);
-}
-
-// stream output
-tostream &operator<<(tostream &i_ost, const StrExprArg &i_data)
-{
-  i_ost << i_data.eval();
-  return i_ost;
-}
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// function.cpp\r
+\r
+\r
+#include "engine.h"\r
+#include "hook.h"\r
+#include "mayu.h"\r
+#include "mayurc.h"\r
+#include "misc.h"\r
+#include "registry.h"\r
+#include "vkeytable.h"\r
+#include "windowstool.h"\r
+#include <algorithm>\r
+#include <process.h>\r
+\r
+#define FUNCTION_DATA\r
+#include "functions.h"\r
+#undef FUNCTION_DATA\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// TypeTable\r
+\r
+\r
+template <class T> class TypeTable\r
+{\r
+public:\r
+  T m_type;\r
+  const _TCHAR *m_name;\r
+};\r
+\r
+\r
+template <class T> static inline\r
+bool getTypeName(tstring *o_name, T i_type,\r
+                const TypeTable<T> *i_table, size_t i_n)\r
+{\r
+  for (size_t i = 0; i < i_n; ++ i)\r
+    if (i_table[i].m_type == i_type)\r
+    {\r
+      *o_name = i_table[i].m_name;\r
+      return true;\r
+    }\r
+  return false;\r
+}\r
+\r
+template <class T> static inline\r
+bool getTypeValue(T *o_type, const tstringi &i_name,\r
+                 const TypeTable<T> *i_table, size_t i_n)\r
+{\r
+  for (size_t i = 0; i < i_n; ++ i)\r
+    if (i_table[i].m_name == i_name)\r
+    {\r
+      *o_type = i_table[i].m_type;\r
+      return true;\r
+    }\r
+  return false;\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// VKey\r
+\r
+\r
+// stream output\r
+tostream &operator<<(tostream &i_ost, VKey i_data)\r
+{\r
+  if (i_data & VKey_extended)\r
+    i_ost << _T("E-");\r
+  if (i_data & VKey_released)\r
+    i_ost << _T("U-");\r
+  if (i_data & VKey_pressed)\r
+    i_ost << _T("D-");\r
+\r
+  u_int8 code = i_data & ~(VKey_extended | VKey_released | VKey_pressed);\r
+  const VKeyTable *vkt;\r
+  for (vkt = g_vkeyTable; vkt->m_name; ++ vkt)\r
+    if (vkt->m_code == code)\r
+      break;\r
+  if (vkt->m_name)\r
+    i_ost << vkt->m_name;\r
+  else\r
+    i_ost << _T("0x") << std::hex << code << std::dec;\r
+  return i_ost;\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// ToWindowType\r
+\r
+\r
+// ToWindowType table\r
+typedef TypeTable<ToWindowType> TypeTable_ToWindowType;\r
+static const TypeTable_ToWindowType g_toWindowTypeTable[] =\r
+{\r
+  { ToWindowType_toOverlappedWindow, _T("toOverlappedWindow") },\r
+  { ToWindowType_toMainWindow,       _T("toMainWindow")       },\r
+  { ToWindowType_toItself,           _T("toItself")           },\r
+  { ToWindowType_toParentWindow,     _T("toParentWindow")     },\r
+};\r
+\r
+\r
+// stream output\r
+tostream &operator<<(tostream &i_ost, ToWindowType i_data)\r
+{\r
+  tstring name;\r
+  if (getTypeName(&name, i_data,\r
+                 g_toWindowTypeTable, NUMBER_OF(g_toWindowTypeTable)))\r
+    i_ost << name;\r
+  else\r
+    i_ost << static_cast<int>(i_data);\r
+  return i_ost;\r
+}\r
+\r
+\r
+// get value of ToWindowType\r
+bool getTypeValue(ToWindowType *o_type, const tstring &i_name)\r
+{\r
+  return getTypeValue(o_type, i_name,\r
+                     g_toWindowTypeTable, NUMBER_OF(g_toWindowTypeTable));\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// GravityType\r
+\r
+\r
+// GravityType table\r
+typedef TypeTable<GravityType> TypeTable_GravityType;\r
+static const TypeTable_GravityType g_gravityTypeTable[] =\r
+{\r
+  { GravityType_C,  _T("C")  },\r
+  { GravityType_N,  _T("N")  },\r
+  { GravityType_E,  _T("E")  },\r
+  { GravityType_W,  _T("W")  },\r
+  { GravityType_S,  _T("S")  },\r
+  { GravityType_NW, _T("NW") },\r
+  { GravityType_NW, _T("WN") },\r
+  { GravityType_NE, _T("NE") },\r
+  { GravityType_NE, _T("EN") },\r
+  { GravityType_SW, _T("SW") },\r
+  { GravityType_SW, _T("WS") },\r
+  { GravityType_SE, _T("SE") },\r
+  { GravityType_SE, _T("ES") },\r
+};\r
+\r
+\r
+// stream output\r
+tostream &operator<<(tostream &i_ost, GravityType i_data)\r
+{\r
+  tstring name;\r
+  if (getTypeName(&name, i_data,\r
+                 g_gravityTypeTable, NUMBER_OF(g_gravityTypeTable)))\r
+    i_ost << name;\r
+  else\r
+    i_ost << _T("(GravityType internal error)");\r
+  return i_ost;\r
+}\r
+\r
+\r
+// get value of GravityType\r
+bool getTypeValue(GravityType *o_type, const tstring &i_name)\r
+{\r
+  return getTypeValue(o_type, i_name,\r
+                     g_gravityTypeTable, NUMBER_OF(g_gravityTypeTable));\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// MouseHookType\r
+\r
+\r
+// MouseHookType table\r
+typedef TypeTable<MouseHookType> TypeTable_MouseHookType;\r
+static const TypeTable_MouseHookType g_mouseHookTypeTable[] =\r
+{\r
+  { MouseHookType_None,  _T("None")  },\r
+  { MouseHookType_Wheel,  _T("Wheel")  },\r
+  { MouseHookType_WindowMove,  _T("WindowMove")  },\r
+};\r
+\r
+\r
+// stream output\r
+tostream &operator<<(tostream &i_ost, MouseHookType i_data)\r
+{\r
+  tstring name;\r
+  if (getTypeName(&name, i_data,\r
+                 g_mouseHookTypeTable, NUMBER_OF(g_mouseHookTypeTable)))\r
+    i_ost << name;\r
+  else\r
+    i_ost << _T("(MouseHookType internal error)");\r
+  return i_ost;\r
+}\r
+\r
+\r
+// get value of MouseHookType\r
+bool getTypeValue(MouseHookType *o_type, const tstring &i_name)\r
+{\r
+  return getTypeValue(o_type, i_name, g_mouseHookTypeTable,\r
+                     NUMBER_OF(g_mouseHookTypeTable));\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// MayuDialogType\r
+\r
+\r
+// ModifierLockType table\r
+typedef TypeTable<MayuDialogType> TypeTable_MayuDialogType;\r
+static const TypeTable_MayuDialogType g_mayuDialogTypeTable[] =\r
+{\r
+  { MayuDialogType_investigate, _T("investigate")  },\r
+  { MayuDialogType_log,         _T("log")          },\r
+};\r
+\r
+\r
+// stream output\r
+tostream &operator<<(tostream &i_ost, MayuDialogType i_data)\r
+{\r
+  tstring name;\r
+  if (getTypeName(&name, i_data,\r
+                 g_mayuDialogTypeTable, NUMBER_OF(g_mayuDialogTypeTable)))\r
+    i_ost << name;\r
+  else\r
+    i_ost << _T("(MayuDialogType internal error)");\r
+  return i_ost;\r
+}\r
+\r
+\r
+// get value of MayuDialogType\r
+bool getTypeValue(MayuDialogType *o_type, const tstring &i_name)\r
+{\r
+  return getTypeValue(o_type, i_name, g_mayuDialogTypeTable,\r
+                     NUMBER_OF(g_mayuDialogTypeTable));\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// ToggleType\r
+\r
+\r
+// ToggleType table\r
+typedef TypeTable<ToggleType> TypeTable_ToggleType;\r
+static const TypeTable_ToggleType g_toggleType[] =\r
+{\r
+  { ToggleType_toggle, _T("toggle") },\r
+  { ToggleType_off, _T("off") },\r
+  { ToggleType_off, _T("false") },\r
+  { ToggleType_off, _T("released") },\r
+  { ToggleType_on,  _T("on")  },\r
+  { ToggleType_on,  _T("true")  },\r
+  { ToggleType_on,  _T("pressed")  },\r
+};\r
+\r
+\r
+// stream output\r
+tostream &operator<<(tostream &i_ost, ToggleType i_data)\r
+{\r
+  tstring name;\r
+  if (getTypeName(&name, i_data, g_toggleType, NUMBER_OF(g_toggleType)))\r
+    i_ost << name;\r
+  else\r
+    i_ost << _T("(ToggleType internal error)");\r
+  return i_ost;\r
+}\r
+\r
+\r
+// get value of ToggleType\r
+bool getTypeValue(ToggleType *o_type, const tstring &i_name)\r
+{\r
+  return getTypeValue(o_type, i_name, g_toggleType,\r
+                     NUMBER_OF(g_toggleType));\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// ModifierLockType\r
+\r
+\r
+// ModifierLockType table\r
+typedef TypeTable<ModifierLockType> TypeTable_ModifierLockType;\r
+static const TypeTable_ModifierLockType g_modifierLockTypeTable[] =\r
+{\r
+  { ModifierLockType_Lock0, _T("lock0") },\r
+  { ModifierLockType_Lock1, _T("lock1") },\r
+  { ModifierLockType_Lock2, _T("lock2") },\r
+  { ModifierLockType_Lock3, _T("lock3") },\r
+  { ModifierLockType_Lock4, _T("lock4") },\r
+  { ModifierLockType_Lock5, _T("lock5") },\r
+  { ModifierLockType_Lock6, _T("lock6") },\r
+  { ModifierLockType_Lock7, _T("lock7") },\r
+  { ModifierLockType_Lock8, _T("lock8") },\r
+  { ModifierLockType_Lock9, _T("lock9") },\r
+};\r
+\r
+\r
+// stream output\r
+tostream &operator<<(tostream &i_ost, ModifierLockType i_data)\r
+{\r
+  tstring name;\r
+  if (getTypeName(&name, i_data,\r
+                 g_modifierLockTypeTable, NUMBER_OF(g_modifierLockTypeTable)))\r
+    i_ost << name;\r
+  else\r
+    i_ost << _T("(ModifierLockType internal error)");\r
+  return i_ost;\r
+}\r
+\r
+\r
+// get value of ModifierLockType\r
+bool getTypeValue(ModifierLockType *o_type, const tstring &i_name)\r
+{\r
+  return getTypeValue(o_type, i_name, g_modifierLockTypeTable,\r
+                     NUMBER_OF(g_modifierLockTypeTable));\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// ShowCommandType\r
+\r
+\r
+// ShowCommandType table\r
+typedef TypeTable<ShowCommandType> TypeTable_ShowCommandType;\r
+static const TypeTable_ShowCommandType g_showCommandTypeTable[] =\r
+{\r
+  { ShowCommandType_hide,            _T("hide")            },\r
+  { ShowCommandType_maximize,        _T("maximize")        },\r
+  { ShowCommandType_minimize,        _T("minimize")        },\r
+  { ShowCommandType_restore,         _T("restore")         },\r
+  { ShowCommandType_show,            _T("show")            },\r
+  { ShowCommandType_showDefault,     _T("showDefault")     },\r
+  { ShowCommandType_showMaximized,   _T("showMaximized")   },\r
+  { ShowCommandType_showMinimized,   _T("showMinimized")   },\r
+  { ShowCommandType_showMinNoActive, _T("showMinNoActive") },\r
+  { ShowCommandType_showNA,          _T("showNA")          },\r
+  { ShowCommandType_showNoActivate,  _T("showNoActivate")  },\r
+  { ShowCommandType_showNormal,      _T("showNormal")      },\r
+};\r
+\r
+\r
+// stream output\r
+tostream &operator<<(tostream &i_ost, ShowCommandType i_data)\r
+{\r
+  tstring name;\r
+  if (getTypeName(&name, i_data,\r
+                 g_showCommandTypeTable, NUMBER_OF(g_showCommandTypeTable)))\r
+    i_ost << name;\r
+  else\r
+    i_ost << _T("(ShowCommandType internal error)");\r
+  return i_ost;\r
+}\r
+\r
+\r
+// get value of ShowCommandType\r
+bool getTypeValue(ShowCommandType *o_type, const tstring &i_name)\r
+{\r
+  return getTypeValue(o_type, i_name, g_showCommandTypeTable,\r
+                     NUMBER_OF(g_showCommandTypeTable));\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// TargetWindowType\r
+\r
+\r
+// ModifierLockType table\r
+typedef TypeTable<TargetWindowType> TypeTable_TargetWindowType;\r
+static const TypeTable_TargetWindowType g_targetWindowType[] =\r
+{\r
+  { TargetWindowType_overlapped, _T("overlapped") },\r
+  { TargetWindowType_mdi,        _T("mdi")        },\r
+};\r
+\r
+\r
+// stream output\r
+tostream &operator<<(tostream &i_ost, TargetWindowType i_data)\r
+{\r
+  tstring name;\r
+  if (getTypeName(&name, i_data,\r
+                 g_targetWindowType, NUMBER_OF(g_targetWindowType)))\r
+    i_ost << name;\r
+  else\r
+    i_ost << _T("(TargetWindowType internal error)");\r
+  return i_ost;\r
+}\r
+\r
+\r
+// get value of TargetWindowType\r
+bool getTypeValue(TargetWindowType *o_type, const tstring &i_name)\r
+{\r
+  return getTypeValue(o_type, i_name, g_targetWindowType,\r
+                     NUMBER_OF(g_targetWindowType));\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// BooleanType\r
+\r
+\r
+// BooleanType table\r
+typedef TypeTable<BooleanType> TypeTable_BooleanType;\r
+static const TypeTable_BooleanType g_booleanType[] =\r
+{\r
+  { BooleanType_false, _T("false") },\r
+  { BooleanType_true,  _T("true")  },\r
+};\r
+\r
+\r
+// stream output\r
+tostream &operator<<(tostream &i_ost, BooleanType i_data)\r
+{\r
+  tstring name;\r
+  if (getTypeName(&name, i_data, g_booleanType, NUMBER_OF(g_booleanType)))\r
+    i_ost << name;\r
+  else\r
+    i_ost << _T("(BooleanType internal error)");\r
+  return i_ost;\r
+}\r
+\r
+\r
+// get value of BooleanType\r
+bool getTypeValue(BooleanType *o_type, const tstring &i_name)\r
+{\r
+  return getTypeValue(o_type, i_name, g_booleanType,\r
+                     NUMBER_OF(g_booleanType));\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// LogicalOperatorType\r
+\r
+\r
+// LogicalOperatorType table\r
+typedef TypeTable<LogicalOperatorType> TypeTable_LogicalOperatorType;\r
+static const TypeTable_LogicalOperatorType g_logicalOperatorType[] =\r
+{\r
+  { LogicalOperatorType_or, _T("||") },\r
+  { LogicalOperatorType_and,  _T("&&")  },\r
+};\r
+\r
+\r
+// stream output\r
+tostream &operator<<(tostream &i_ost, LogicalOperatorType i_data)\r
+{\r
+  tstring name;\r
+  if (getTypeName(&name, i_data, g_logicalOperatorType,\r
+                 NUMBER_OF(g_logicalOperatorType)))\r
+    i_ost << name;\r
+  else\r
+    i_ost << _T("(LogicalOperatorType internal error)");\r
+  return i_ost;\r
+}\r
+\r
+\r
+// get value of LogicalOperatorType\r
+bool getTypeValue(LogicalOperatorType *o_type, const tstring &i_name)\r
+{\r
+  return getTypeValue(o_type, i_name, g_logicalOperatorType,\r
+                     NUMBER_OF(g_logicalOperatorType));\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// WindowMonitorFromType\r
+\r
+\r
+// WindowMonitorFromType table\r
+typedef TypeTable<WindowMonitorFromType> TypeTable_WindowMonitorFromType;\r
+static const TypeTable_WindowMonitorFromType g_windowMonitorFromType[] =\r
+{\r
+  { WindowMonitorFromType_primary, _T("primary") },\r
+  { WindowMonitorFromType_current, _T("current") },\r
+};\r
+\r
+\r
+// stream output\r
+tostream &operator<<(tostream &i_ost, WindowMonitorFromType i_data)\r
+{\r
+  tstring name;\r
+  if(getTypeName(&name, i_data, g_windowMonitorFromType,\r
+                 NUMBER_OF(g_windowMonitorFromType)))\r
+    i_ost << name;\r
+  else\r
+    i_ost << _T("(WindowMonitorFromType internal error)");\r
+  return i_ost;\r
+}\r
+\r
+\r
+// get value of WindowMonitorFromType\r
+bool getTypeValue(WindowMonitorFromType *o_type, const tstring &i_name)\r
+{\r
+  return getTypeValue(o_type, i_name, g_windowMonitorFromType,\r
+                      NUMBER_OF(g_windowMonitorFromType));\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// std::list<tstringq>\r
+\r
+\r
+/// stream output\r
+tostream &operator<<(tostream &i_ost, const std::list<tstringq> &i_data)\r
+{\r
+  for (std::list<tstringq>::const_iterator\r
+        i = i_data.begin(); i != i_data.end(); ++ i)\r
+  {\r
+    i_ost << *i << _T(", ");\r
+  }\r
+  return i_ost;\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// FunctionData\r
+\r
+\r
+//\r
+FunctionData::~FunctionData()\r
+{\r
+}\r
+\r
+\r
+// stream output\r
+tostream &operator<<(tostream &i_ost, const FunctionData *i_data)\r
+{\r
+  return i_data->output(i_ost);\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// FunctionCreator\r
+\r
+\r
+///\r
+class FunctionCreator\r
+{\r
+public:\r
+  typedef FunctionData *(*Creator)();          /// \r
+  \r
+public:\r
+  const _TCHAR *m_name;                                /// function name\r
+  Creator m_creator;                           /// function data creator\r
+};\r
+\r
+\r
+// create function\r
+FunctionData *createFunctionData(const tstring &i_name)\r
+{\r
+  static \r
+#define FUNCTION_CREATOR\r
+#include "functions.h"\r
+#undef FUNCTION_CREATOR\r
+    ;\r
+\r
+  for (size_t i = 0; i != NUMBER_OF(functionCreators); ++ i)\r
+    if (i_name == functionCreators[i].m_name)\r
+      return functionCreators[i].m_creator();\r
+  return NULL;\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// misc. functions\r
+\r
+\r
+//\r
+bool getSuitableWindow(FunctionParam *i_param, HWND *o_hwnd)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return false;\r
+  *o_hwnd = getToplevelWindow(i_param->m_hwnd, NULL);\r
+  if (!*o_hwnd)\r
+    return false;\r
+  return true;\r
+}\r
+\r
+//\r
+bool getSuitableMdiWindow(FunctionParam *i_param, HWND *o_hwnd,\r
+                         TargetWindowType *io_twt,\r
+                         RECT *o_rcWindow = NULL, RECT *o_rcParent = NULL)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return false;\r
+  bool isMdi = *io_twt == TargetWindowType_mdi;\r
+  *o_hwnd = getToplevelWindow(i_param->m_hwnd, &isMdi);\r
+  *io_twt = isMdi ? TargetWindowType_mdi : TargetWindowType_overlapped;\r
+  if (!*o_hwnd)\r
+    return false;\r
+  switch (*io_twt)\r
+  {\r
+    case TargetWindowType_overlapped:\r
+      if (o_rcWindow)\r
+       GetWindowRect(*o_hwnd, o_rcWindow);\r
+      if (o_rcParent) {\r
+        HMONITOR hm = monitorFromWindow(i_param->m_hwnd,\r
+                                        MONITOR_DEFAULTTONEAREST);\r
+        MONITORINFO mi;\r
+        mi.cbSize = sizeof(mi);\r
+        getMonitorInfo(hm, &mi);\r
+        *o_rcParent = mi.rcWork;\r
+      }\r
+      break;\r
+    case TargetWindowType_mdi:\r
+      if (o_rcWindow)\r
+       getChildWindowRect(*o_hwnd, o_rcWindow);\r
+      if (o_rcParent)\r
+       GetClientRect(GetParent(*o_hwnd), o_rcParent);\r
+      break;\r
+  }\r
+  return true;\r
+}\r
+\r
+// get clipboard text (you must call closeClopboard())\r
+static const _TCHAR *getTextFromClipboard(HGLOBAL *o_hdata)\r
+{\r
+  *o_hdata = NULL;\r
+  \r
+  if (!OpenClipboard(NULL))\r
+    return NULL;\r
+\r
+#ifdef UNICODE\r
+  *o_hdata = GetClipboardData(CF_UNICODETEXT);\r
+#else\r
+  *o_hdata = GetClipboardData(CF_TEXT);\r
+#endif\r
+  if (!*o_hdata)\r
+    return NULL;\r
+  \r
+  _TCHAR *data = reinterpret_cast<_TCHAR *>(GlobalLock(*o_hdata));\r
+  if (!data)\r
+    return NULL;\r
+  return data;\r
+}\r
+\r
+// close clipboard that opend by getTextFromClipboard()\r
+static void closeClipboard(HGLOBAL i_hdata, HGLOBAL i_hdataNew = NULL)\r
+{\r
+  if (i_hdata)\r
+    GlobalUnlock(i_hdata);\r
+  if (i_hdataNew)\r
+  {\r
+    EmptyClipboard();\r
+#ifdef UNICODE\r
+    SetClipboardData(CF_UNICODETEXT, i_hdataNew);\r
+#else\r
+    SetClipboardData(CF_TEXT, i_hdataNew);\r
+#endif\r
+  }\r
+  CloseClipboard();\r
+}\r
+\r
+\r
+// EmacsEditKillLineFunc.\r
+// clear the contents of the clopboard\r
+// at that time, confirm if it is the result of the previous kill-line\r
+void Engine::EmacsEditKillLine::func()\r
+{\r
+  if (!m_buf.empty())\r
+  {\r
+    HGLOBAL g;\r
+    const _TCHAR *text = getTextFromClipboard(&g);\r
+    if (text == NULL || m_buf != text)\r
+      reset();\r
+    closeClipboard(g);\r
+  }\r
+  if (OpenClipboard(NULL))\r
+  {\r
+    EmptyClipboard();\r
+    CloseClipboard();\r
+  }\r
+}\r
+\r
+\r
+/** if the text of the clipboard is\r
+@doc\r
+<pre>\r
+1: EDIT Control (at EOL C-K): ""            =&gt; buf + "\r\n", Delete   \r
+0: EDIT Control (other  C-K): "(.+)"        =&gt; buf + "\1"             \r
+0: IE FORM TEXTAREA (at EOL C-K): "\r\n"    =&gt; buf + "\r\n"           \r
+2: IE FORM TEXTAREA (other C-K): "(.+)\r\n" =&gt; buf + "\1", Return Left\r
+^retval\r
+</pre>\r
+*/\r
+HGLOBAL Engine::EmacsEditKillLine::makeNewKillLineBuf(\r
+  const _TCHAR *i_data, int *o_retval)\r
+{\r
+  size_t len = m_buf.size();\r
+  len += _tcslen(i_data) + 3;\r
+  \r
+  HGLOBAL hdata = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE,\r
+                             len * sizeof(_TCHAR));\r
+  if (!hdata)\r
+    return NULL;\r
+  _TCHAR *dataNew = reinterpret_cast<_TCHAR *>(GlobalLock(hdata));\r
+  *dataNew = _T('\0');\r
+  if (!m_buf.empty())\r
+    _tcscpy(dataNew, m_buf.c_str());\r
+  \r
+  len = _tcslen(i_data);\r
+  if (3 <= len &&\r
+      i_data[len - 2] == _T('\r') && i_data[len - 1] == _T('\n'))\r
+  {\r
+    _tcscat(dataNew, i_data);\r
+    len = _tcslen(dataNew);\r
+    dataNew[len - 2] = _T('\0'); // chomp\r
+    *o_retval = 2;\r
+  }\r
+  else if (len == 0)\r
+  {\r
+    _tcscat(dataNew, _T("\r\n"));\r
+    *o_retval = 1;\r
+  }\r
+  else\r
+  {\r
+    _tcscat(dataNew, i_data);\r
+    *o_retval = 0;\r
+  }\r
+  \r
+  m_buf = dataNew;\r
+  \r
+  GlobalUnlock(hdata);\r
+  return hdata;\r
+}\r
+\r
+\r
+// EmacsEditKillLinePred\r
+int Engine::EmacsEditKillLine::pred()\r
+{\r
+  HGLOBAL g;\r
+  const _TCHAR *text = getTextFromClipboard(&g);\r
+  int retval;\r
+  HGLOBAL hdata = makeNewKillLineBuf(text ? text : _T(""), &retval);\r
+  closeClipboard(g, hdata);\r
+  return retval;\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// functions\r
+\r
+\r
+// send a default key to Windows\r
+void Engine::funcDefault(FunctionParam *i_param)\r
+{\r
+  {\r
+    Acquire a(&m_log, 1);\r
+    m_log << std::endl;\r
+    i_param->m_doesNeedEndl = false;\r
+  }\r
+  if (i_param->m_isPressed)\r
+    generateModifierEvents(i_param->m_c.m_mkey.m_modifier);\r
+  generateKeyEvent(i_param->m_c.m_mkey.m_key, i_param->m_isPressed, true);\r
+}\r
+\r
+// use a corresponding key of a parent keymap\r
+void Engine::funcKeymapParent(FunctionParam *i_param)\r
+{\r
+  Current c(i_param->m_c);\r
+  c.m_keymap = c.m_keymap->getParentKeymap();\r
+  if (!c.m_keymap)\r
+  {\r
+    funcDefault(i_param);\r
+    return;\r
+  }\r
+  \r
+  {\r
+    Acquire a(&m_log, 1);\r
+    m_log << _T("(") << c.m_keymap->getName() << _T(")") << std::endl;\r
+  }\r
+  i_param->m_doesNeedEndl = false;\r
+  generateKeyboardEvents(c);\r
+}\r
+\r
+// use a corresponding key of a current window\r
+void Engine::funcKeymapWindow(FunctionParam *i_param)\r
+{\r
+  Current c(i_param->m_c);\r
+  c.m_keymap = m_currentFocusOfThread->m_keymaps.front();\r
+  c.m_i = m_currentFocusOfThread->m_keymaps.begin();\r
+  generateKeyboardEvents(c);\r
+}\r
+\r
+// use a corresponding key of the previous prefixed keymap\r
+void Engine::funcKeymapPrevPrefix(FunctionParam *i_param, int i_previous)\r
+{\r
+  Current c(i_param->m_c);\r
+  if (0 < i_previous && 0 <= m_keymapPrefixHistory.size() - i_previous)\r
+  {\r
+    int n = i_previous - 1;\r
+    KeymapPtrList::reverse_iterator i = m_keymapPrefixHistory.rbegin();\r
+    while (0 < n && i != m_keymapPrefixHistory.rend())\r
+      --n, ++i;\r
+    c.m_keymap = *i;\r
+    generateKeyboardEvents(c);\r
+  }\r
+}\r
+\r
+// use a corresponding key of an other window class, or use a default key\r
+void Engine::funcOtherWindowClass(FunctionParam *i_param)\r
+{\r
+  Current c(i_param->m_c);\r
+  ++ c.m_i;\r
+  if (c.m_i == m_currentFocusOfThread->m_keymaps.end())\r
+  {\r
+    funcDefault(i_param);\r
+    return;\r
+  }\r
+  \r
+  c.m_keymap = *c.m_i;\r
+  {\r
+    Acquire a(&m_log, 1);\r
+    m_log << _T("(") << c.m_keymap->getName() << _T(")") << std::endl;\r
+  }\r
+  i_param->m_doesNeedEndl = false;\r
+  generateKeyboardEvents(c);\r
+}\r
+\r
+// prefix key\r
+void Engine::funcPrefix(FunctionParam *i_param, const Keymap *i_keymap,\r
+                       BooleanType i_doesIgnoreModifiers)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+  \r
+  setCurrentKeymap(i_keymap, true);\r
+  \r
+  // generate prefixed event\r
+  generateEvents(i_param->m_c, m_currentKeymap, &Event::prefixed);\r
+  \r
+  m_isPrefix = true;\r
+  m_doesEditNextModifier = false;\r
+  m_doesIgnoreModifierForPrefix = !!i_doesIgnoreModifiers;\r
+\r
+  {\r
+    Acquire a(&m_log, 1);\r
+    m_log << _T("(") << i_keymap->getName() << _T(", ")\r
+         << (i_doesIgnoreModifiers ? _T("true") : _T("false")) << _T(")");\r
+  }\r
+}\r
+\r
+// other keymap's key\r
+void Engine::funcKeymap(FunctionParam *i_param, const Keymap *i_keymap)\r
+{\r
+  Current c(i_param->m_c);\r
+  c.m_keymap = i_keymap;\r
+  {\r
+    Acquire a(&m_log, 1);\r
+    m_log << _T("(") << c.m_keymap->getName() << _T(")") << std::endl;\r
+    i_param->m_doesNeedEndl = false;\r
+  }\r
+  generateKeyboardEvents(c);\r
+}\r
+\r
+// sync\r
+void Engine::funcSync(FunctionParam *i_param)\r
+{\r
+  if (i_param->m_isPressed)\r
+    generateModifierEvents(i_param->m_af->m_modifier);\r
+  if (!i_param->m_isPressed || m_currentFocusOfThread->m_isConsole)\r
+    return;\r
+  \r
+  Key *sync = m_setting->m_keyboard.getSyncKey();\r
+  if (sync->getScanCodesSize() == 0)\r
+    return;\r
+  const ScanCode *sc = sync->getScanCodes();\r
+  \r
+  // set variables exported from mayu.dll\r
+  g_hookData->m_syncKey = sc->m_scan;\r
+  g_hookData->m_syncKeyIsExtended = !!(sc->m_flags & ScanCode::E0E1);\r
+  m_isSynchronizing = true;\r
+  generateKeyEvent(sync, false, false);\r
+  \r
+  m_cs.release();\r
+  DWORD r = WaitForSingleObject(m_eSync, 5000);\r
+  if (r == WAIT_TIMEOUT)\r
+  {\r
+    Acquire a(&m_log, 0);\r
+    m_log << _T(" *FAILED*") << std::endl;\r
+  }\r
+  m_cs.acquire();\r
+  m_isSynchronizing = false;\r
+}\r
+\r
+// toggle lock\r
+void Engine::funcToggle(FunctionParam *i_param, ModifierLockType i_lock,\r
+                       ToggleType i_toggle)\r
+{\r
+  if (i_param->m_isPressed)                    // ignore PRESS\r
+    return;\r
+\r
+  Modifier::Type mt = static_cast<Modifier::Type>(i_lock);\r
+  switch (i_toggle)\r
+  {\r
+    case ToggleType_toggle:\r
+      m_currentLock.press(mt, !m_currentLock.isPressed(mt));\r
+      break;\r
+    case ToggleType_off:\r
+      m_currentLock.press(mt, false);\r
+      break;\r
+    case ToggleType_on:\r
+      m_currentLock.press(mt, true);\r
+      break;\r
+  }\r
+}\r
+\r
+// edit next user input key's modifier\r
+void Engine::funcEditNextModifier(FunctionParam *i_param,\r
+                                 const Modifier &i_modifier)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+  \r
+  m_isPrefix = true;\r
+  m_doesEditNextModifier = true;\r
+  m_doesIgnoreModifierForPrefix = true;\r
+  m_modifierForNextKey = i_modifier;\r
+}\r
+\r
+// variable\r
+void Engine::funcVariable(FunctionParam *i_param, int i_mag, int i_inc)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+  m_variable *= i_mag;\r
+  m_variable += i_inc;\r
+}\r
+\r
+// repeat N times\r
+void Engine::funcRepeat(FunctionParam *i_param, const KeySeq *i_keySeq,\r
+                       int i_max)\r
+{\r
+  if (i_param->m_isPressed)\r
+  {\r
+    int end = MIN(m_variable, i_max);\r
+    for (int i = 0; i < end - 1; ++ i)\r
+      generateKeySeqEvents(i_param->m_c, i_keySeq, Part_all);\r
+    if (0 < end)\r
+      generateKeySeqEvents(i_param->m_c, i_keySeq, Part_down);\r
+  }\r
+  else\r
+    generateKeySeqEvents(i_param->m_c, i_keySeq, Part_up);\r
+}\r
+\r
+// undefined (bell)\r
+void Engine::funcUndefined(FunctionParam *i_param)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+  MessageBeep(MB_OK);\r
+}\r
+\r
+// ignore\r
+void Engine::funcIgnore(FunctionParam *)\r
+{\r
+  // do nothing\r
+}\r
+\r
+// post message\r
+void Engine::funcPostMessage(FunctionParam *i_param, ToWindowType i_window,\r
+                            UINT i_message, WPARAM i_wParam, LPARAM i_lParam)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+\r
+  int window = static_cast<int>(i_window);\r
+  \r
+  HWND hwnd = i_param->m_hwnd;\r
+  if (0 < window)\r
+  {\r
+    for (int i = 0; i < window; ++ i)\r
+      hwnd = GetParent(hwnd);\r
+  }\r
+  else if (window == ToWindowType_toMainWindow)\r
+  {\r
+    while (true)\r
+    {\r
+      HWND p = GetParent(hwnd);\r
+      if (!p)\r
+       break;\r
+      hwnd = p;\r
+    }\r
+  }\r
+  else if (window == ToWindowType_toOverlappedWindow)\r
+  {\r
+    while (hwnd)\r
+    {\r
+#ifdef MAYU64\r
+      LONG_PTR style = GetWindowLongPtr(hwnd, GWL_STYLE);\r
+#else\r
+      LONG style = GetWindowLong(hwnd, GWL_STYLE);\r
+#endif\r
+      if ((style & WS_CHILD) == 0)\r
+       break;\r
+      hwnd = GetParent(hwnd);\r
+    }\r
+  }\r
+\r
+  if (hwnd)\r
+    PostMessage(hwnd, i_message, i_wParam, i_lParam);\r
+}\r
+\r
+\r
+// ShellExecute\r
+void Engine::funcShellExecute(FunctionParam *i_param,\r
+                             const StrExprArg &/*i_operation*/,\r
+                             const StrExprArg &/*i_file*/,\r
+                             const StrExprArg &/*i_parameters*/,\r
+                             const StrExprArg &/*i_directory*/,\r
+                             ShowCommandType /*i_showCommand*/)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+  m_afShellExecute = i_param->m_af;\r
+  PostMessage(m_hwndAssocWindow,\r
+             WM_APP_engineNotify, EngineNotify_shellExecute, 0);\r
+}\r
+\r
+\r
+// shell execute\r
+void Engine::shellExecute()\r
+{\r
+  Acquire a(&m_cs);\r
+  \r
+  FunctionData_ShellExecute *fd =\r
+    reinterpret_cast<FunctionData_ShellExecute *>(\r
+      m_afShellExecute->m_functionData);\r
+  \r
+  int r = (int)ShellExecute(\r
+    NULL,\r
+    fd->m_operation.eval().empty() ? _T("open") : fd->m_operation.eval().c_str(),\r
+    fd->m_file.eval().empty() ? NULL : fd->m_file.eval().c_str(),\r
+    fd->m_parameters.eval().empty() ? NULL : fd->m_parameters.eval().c_str(),\r
+    fd->m_directory.eval().empty() ? NULL : fd->m_directory.eval().c_str(),\r
+    fd->m_showCommand);\r
+  if (32 < r)\r
+    return; // success\r
+\r
+  typedef TypeTable<int> ErrorTable;\r
+  static const ErrorTable errorTable[] =\r
+  {\r
+    { 0, _T("The operating system is out of memory or resources.") },\r
+    { ERROR_FILE_NOT_FOUND, _T("The specified file was not found.") },\r
+    { ERROR_PATH_NOT_FOUND, _T("The specified path was not found.") },\r
+    { ERROR_BAD_FORMAT, _T("The .exe file is invalid ")\r
+      _T("(non-Win32R .exe or error in .exe image).") },\r
+    { SE_ERR_ACCESSDENIED,\r
+      _T("The operating system denied access to the specified file.") },\r
+    { SE_ERR_ASSOCINCOMPLETE,\r
+      _T("The file name association is incomplete or invalid.") },\r
+    { SE_ERR_DDEBUSY,\r
+      _T("The DDE transaction could not be completed ")\r
+      _T("because other DDE transactions were being processed. ") },\r
+    { SE_ERR_DDEFAIL, _T("The DDE transaction failed.") },\r
+    { SE_ERR_DDETIMEOUT, _T("The DDE transaction could not be completed ")\r
+      _T("because the request timed out.") },\r
+    { SE_ERR_DLLNOTFOUND,\r
+      _T("The specified dynamic-link library was not found.") },\r
+    { SE_ERR_FNF, _T("The specified file was not found.") },\r
+    { SE_ERR_NOASSOC, _T("There is no application associated ")\r
+      _T("with the given file name extension.") },\r
+    { SE_ERR_OOM,\r
+      _T("There was not enough memory to complete the operation.") },\r
+    { SE_ERR_PNF, _T("The specified path was not found.") },\r
+    { SE_ERR_SHARE, _T("A sharing violation occurred.") },\r
+  };\r
+\r
+  tstring errorMessage(_T("Unknown error."));\r
+  getTypeName(&errorMessage, r, errorTable, NUMBER_OF(errorTable));\r
+  \r
+  Acquire b(&m_log, 0);\r
+  m_log << _T("error: ") << fd << _T(": ") << errorMessage << std::endl;\r
+}\r
+\r
+\r
+struct EnumWindowsForSetForegroundWindowParam\r
+{\r
+  const FunctionData_SetForegroundWindow *m_fd;\r
+  HWND m_hwnd;\r
+\r
+public:\r
+  EnumWindowsForSetForegroundWindowParam(\r
+    const FunctionData_SetForegroundWindow *i_fd)\r
+    : m_fd(i_fd),\r
+      m_hwnd(NULL)\r
+  {\r
+  }\r
+};\r
+\r
+\r
+/// enum windows for SetForegroundWindow\r
+static BOOL CALLBACK enumWindowsForSetForegroundWindow(\r
+  HWND i_hwnd, LPARAM i_lParam)\r
+{\r
+  EnumWindowsForSetForegroundWindowParam &ep =\r
+    *reinterpret_cast<EnumWindowsForSetForegroundWindowParam *>(i_lParam);\r
+\r
+  _TCHAR name[GANA_MAX_ATOM_LENGTH];\r
+  if (!GetClassName(i_hwnd, name, NUMBER_OF(name)))\r
+    return TRUE;\r
+  tsmatch what;\r
+  if (!boost::regex_search(tstring(name), what, ep.m_fd->m_windowClassName))\r
+    if (ep.m_fd->m_logicalOp == LogicalOperatorType_and)\r
+      return TRUE;                             // match failed\r
+\r
+  if (ep.m_fd->m_logicalOp == LogicalOperatorType_and)\r
+  {\r
+    if (GetWindowText(i_hwnd, name, NUMBER_OF(name)) == 0)\r
+      name[0] = _T('\0');\r
+    if (!boost::regex_search(tstring(name), what,\r
+                            ep.m_fd->m_windowTitleName))\r
+      return TRUE;                             // match failed\r
+  }\r
+\r
+  ep.m_hwnd = i_hwnd;\r
+  return FALSE;\r
+}\r
+\r
+\r
+/// SetForegroundWindow\r
+void Engine::funcSetForegroundWindow(FunctionParam *i_param, const tregex &,\r
+                                    LogicalOperatorType , const tregex &)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+  EnumWindowsForSetForegroundWindowParam\r
+    ep(static_cast<const FunctionData_SetForegroundWindow *>(\r
+      i_param->m_af->m_functionData));\r
+  EnumWindows(enumWindowsForSetForegroundWindow,\r
+             reinterpret_cast<LPARAM>(&ep));\r
+  if (ep.m_hwnd)\r
+    PostMessage(m_hwndAssocWindow,\r
+               WM_APP_engineNotify, EngineNotify_setForegroundWindow,\r
+               reinterpret_cast<LPARAM>(ep.m_hwnd));\r
+\r
+}\r
+\r
+\r
+// load setting\r
+void Engine::funcLoadSetting(FunctionParam *i_param, const StrExprArg &i_name)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+  if (!i_name.eval().empty())\r
+  {\r
+    // set MAYU_REGISTRY_ROOT\.mayuIndex which name is same with i_name\r
+    Registry reg(MAYU_REGISTRY_ROOT);\r
+\r
+    tregex split(_T("^([^;]*);([^;]*);(.*)$"));\r
+    tstringi dot_mayu;\r
+    for (size_t i = 0; i < MAX_MAYU_REGISTRY_ENTRIES; ++ i)\r
+    {\r
+      _TCHAR buf[100];\r
+      _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), i);\r
+      if (!reg.read(buf, &dot_mayu))\r
+       break;\r
+      \r
+      tsmatch what;\r
+      if (boost::regex_match(dot_mayu, what, split) &&\r
+         what.str(1) == i_name.eval())\r
+      {        \r
+       reg.write(_T(".mayuIndex"), i);\r
+       goto success;\r
+      }\r
+    }\r
+\r
+    {\r
+      Acquire a(&m_log, 0);\r
+      m_log << _T("unknown setting name: ") << i_name;\r
+    }\r
+    return;\r
+    \r
+    success: ;\r
+  }\r
+  PostMessage(m_hwndAssocWindow,\r
+             WM_APP_engineNotify, EngineNotify_loadSetting, 0);\r
+}\r
+\r
+// virtual key\r
+void Engine::funcVK(FunctionParam *i_param, VKey i_vkey)\r
+{\r
+  long key = static_cast<long>(i_vkey);\r
+  BYTE vkey = static_cast<BYTE>(i_vkey);\r
+  bool isExtended = !!(key & VKey_extended);\r
+  bool isUp       = !i_param->m_isPressed && !!(key & VKey_released);\r
+  bool isDown     = i_param->m_isPressed && !!(key & VKey_pressed);\r
+  \r
+  if (vkey == VK_LBUTTON && isDown)\r
+    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);\r
+  else if (vkey == VK_LBUTTON && isUp)\r
+    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);\r
+  else if (vkey == VK_MBUTTON && isDown)\r
+    mouse_event(MOUSEEVENTF_MIDDLEDOWN, 0, 0, 0, 0);\r
+  else if (vkey == VK_MBUTTON && isUp)\r
+    mouse_event(MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0);\r
+  else if (vkey == VK_RBUTTON && isDown)\r
+    mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);\r
+  else if (vkey == VK_RBUTTON && isUp)\r
+    mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);\r
+  else if (vkey == VK_XBUTTON1 && isDown)\r
+    mouse_event(MOUSEEVENTF_XDOWN, 0, 0, XBUTTON1, 0);\r
+  else if (vkey == VK_XBUTTON1 && isUp)\r
+    mouse_event(MOUSEEVENTF_XUP, 0, 0, XBUTTON1, 0);\r
+  else if (vkey == VK_XBUTTON2 && isDown)\r
+    mouse_event(MOUSEEVENTF_XDOWN, 0, 0, XBUTTON2, 0);\r
+  else if (vkey == VK_XBUTTON2 && isUp)\r
+    mouse_event(MOUSEEVENTF_XUP, 0, 0, XBUTTON2, 0);\r
+  else if (isUp || isDown)\r
+    keybd_event(vkey,\r
+               static_cast<BYTE>(MapVirtualKey(vkey, 0)),\r
+               (isExtended ? KEYEVENTF_EXTENDEDKEY : 0) |\r
+               (i_param->m_isPressed ? 0 : KEYEVENTF_KEYUP), 0);\r
+}\r
+\r
+// wait\r
+void Engine::funcWait(FunctionParam *i_param, int i_milliSecond)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+  if (i_milliSecond < 0 || 5000 < i_milliSecond)       // too long wait\r
+    return;\r
+  \r
+  m_isSynchronizing = true;\r
+  m_cs.release();\r
+  Sleep(i_milliSecond);\r
+  m_cs.acquire();\r
+  m_isSynchronizing = false;\r
+}\r
+\r
+// investigate WM_COMMAND, WM_SYSCOMMAND\r
+void Engine::funcInvestigateCommand(FunctionParam *i_param)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+  Acquire a(&m_log, 0);\r
+  g_hookData->m_doesNotifyCommand = !g_hookData->m_doesNotifyCommand;\r
+  if (g_hookData->m_doesNotifyCommand)\r
+    m_log << _T(" begin") << std::endl;\r
+  else\r
+    m_log << _T(" end") << std::endl;\r
+}\r
+\r
+// show mayu dialog box\r
+void Engine::funcMayuDialog(FunctionParam *i_param, MayuDialogType i_dialog,\r
+                           ShowCommandType i_showCommand)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+  PostMessage(getAssociatedWndow(), WM_APP_engineNotify, EngineNotify_showDlg,\r
+             static_cast<LPARAM>(i_dialog) |\r
+             static_cast<LPARAM>(i_showCommand));\r
+}\r
+\r
+// describe bindings\r
+void Engine::funcDescribeBindings(FunctionParam *i_param)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+  {\r
+    Acquire a(&m_log, 1);\r
+    m_log << std::endl;\r
+  }\r
+  describeBindings();\r
+}\r
+\r
+// show help message\r
+void Engine::funcHelpMessage(FunctionParam *i_param, const StrExprArg &i_title,\r
+                            const StrExprArg &i_message)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+\r
+  m_helpTitle = i_title.eval();\r
+  m_helpMessage = i_message.eval();\r
+  bool doesShow = !(i_title.eval().size() == 0 && i_message.eval().size() == 0);\r
+  PostMessage(getAssociatedWndow(), WM_APP_engineNotify,\r
+             EngineNotify_helpMessage, doesShow);\r
+}\r
+\r
+// show variable\r
+void Engine::funcHelpVariable(FunctionParam *i_param, const StrExprArg &i_title)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+\r
+  _TCHAR buf[20];\r
+  _sntprintf(buf, NUMBER_OF(buf), _T("%d"), m_variable);\r
+\r
+  m_helpTitle = i_title.eval();\r
+  m_helpMessage = buf;\r
+  PostMessage(getAssociatedWndow(), WM_APP_engineNotify,\r
+             EngineNotify_helpMessage, true);\r
+}\r
+\r
+// raise window\r
+void Engine::funcWindowRaise(FunctionParam *i_param,\r
+                            TargetWindowType i_twt)\r
+{\r
+  HWND hwnd;\r
+  if (!getSuitableMdiWindow(i_param, &hwnd, &i_twt))\r
+    return;\r
+  SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0,\r
+              SWP_ASYNCWINDOWPOS | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOSIZE);\r
+}\r
+\r
+// lower window\r
+void Engine::funcWindowLower(FunctionParam *i_param, TargetWindowType i_twt)\r
+{\r
+  HWND hwnd;\r
+  if (!getSuitableMdiWindow(i_param, &hwnd, &i_twt))\r
+    return;\r
+  SetWindowPos(hwnd, HWND_BOTTOM, 0, 0, 0, 0,\r
+              SWP_ASYNCWINDOWPOS | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOSIZE);\r
+}\r
+\r
+// minimize window\r
+void Engine::funcWindowMinimize(FunctionParam *i_param, TargetWindowType i_twt)\r
+{\r
+  HWND hwnd;\r
+  if (!getSuitableMdiWindow(i_param, &hwnd, &i_twt))\r
+    return;\r
+  PostMessage(hwnd, WM_SYSCOMMAND,\r
+             IsIconic(hwnd) ? SC_RESTORE : SC_MINIMIZE, 0);\r
+}\r
+\r
+// maximize window\r
+void Engine::funcWindowMaximize(FunctionParam *i_param, TargetWindowType i_twt)\r
+{\r
+  HWND hwnd;\r
+  if (!getSuitableMdiWindow(i_param, &hwnd, &i_twt))\r
+    return;\r
+  PostMessage(hwnd, WM_SYSCOMMAND,\r
+             IsZoomed(hwnd) ? SC_RESTORE : SC_MAXIMIZE, 0);\r
+}\r
+\r
+// maximize horizontally or virtically\r
+void Engine::funcWindowHVMaximize(FunctionParam *i_param,\r
+                                 BooleanType i_isHorizontal,\r
+                                 TargetWindowType i_twt)\r
+{\r
+  HWND hwnd;\r
+  RECT rc, rcd;\r
+  if (!getSuitableMdiWindow(i_param, &hwnd, &i_twt, &rc, &rcd))\r
+    return;\r
+\r
+  // erase non window\r
+  while (true)\r
+  {\r
+    WindowPositions::iterator i = m_windowPositions.begin();\r
+    WindowPositions::iterator end = m_windowPositions.end();\r
+    for (; i != end; ++ i)\r
+      if (!IsWindow((*i).m_hwnd))\r
+       break;\r
+    if (i == end)\r
+      break;\r
+    m_windowPositions.erase(i);\r
+  }\r
+\r
+  // find target\r
+  WindowPositions::iterator i = m_windowPositions.begin();\r
+  WindowPositions::iterator end = m_windowPositions.end();\r
+  WindowPositions::iterator target = end;\r
+  for (; i != end; ++ i)\r
+    if ((*i).m_hwnd == hwnd)\r
+    {\r
+      target = i;\r
+      break;\r
+    }\r
+  \r
+  if (IsZoomed(hwnd))\r
+    PostMessage(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0);\r
+  else\r
+  {\r
+    WindowPosition::Mode mode = WindowPosition::Mode_normal;\r
+    \r
+    if (target != end)\r
+    {\r
+      WindowPosition &wp = *target;\r
+      rc = wp.m_rc;\r
+      if (wp.m_mode == WindowPosition::Mode_HV)\r
+       mode = wp.m_mode =\r
+         i_isHorizontal ? WindowPosition::Mode_V : WindowPosition::Mode_H;\r
+      else if (( i_isHorizontal && wp.m_mode == WindowPosition::Mode_V) ||\r
+              (!i_isHorizontal && wp.m_mode == WindowPosition::Mode_H))\r
+       mode = wp.m_mode = WindowPosition::Mode_HV;\r
+      else\r
+       m_windowPositions.erase(target);\r
+    }\r
+    else\r
+    {\r
+      mode = i_isHorizontal ? WindowPosition::Mode_H : WindowPosition::Mode_V;\r
+      m_windowPositions.push_front(WindowPosition(hwnd, rc, mode));\r
+    }\r
+    \r
+    if (static_cast<int>(mode) & static_cast<int>(WindowPosition::Mode_H))\r
+      rc.left = rcd.left, rc.right = rcd.right;\r
+    if (static_cast<int>(mode) & static_cast<int>(WindowPosition::Mode_V))\r
+      rc.top = rcd.top, rc.bottom = rcd.bottom;\r
+    \r
+    asyncMoveWindow(hwnd, rc.left, rc.top, rcWidth(&rc), rcHeight(&rc));\r
+  }\r
+}\r
+\r
+// maximize window horizontally\r
+void Engine::funcWindowHMaximize(FunctionParam *i_param,\r
+                                TargetWindowType i_twt)\r
+{\r
+  funcWindowHVMaximize(i_param, BooleanType_true, i_twt);\r
+}\r
+\r
+// maximize window virtically\r
+void Engine::funcWindowVMaximize(FunctionParam *i_param,\r
+                                TargetWindowType i_twt)\r
+{\r
+  funcWindowHVMaximize(i_param, BooleanType_false, i_twt);\r
+}\r
+\r
+// move window\r
+void Engine::funcWindowMove(FunctionParam *i_param, int i_dx, int i_dy,\r
+                           TargetWindowType i_twt)\r
+{\r
+  funcWindowMoveTo(i_param, GravityType_C, i_dx, i_dy, i_twt);\r
+}\r
+\r
+// move window to ...\r
+void Engine::funcWindowMoveTo(FunctionParam *i_param,\r
+                             GravityType i_gravityType,\r
+                             int i_dx, int i_dy, TargetWindowType i_twt)\r
+{\r
+  HWND hwnd;\r
+  RECT rc, rcd;\r
+  if (!getSuitableMdiWindow(i_param, &hwnd, &i_twt, &rc, &rcd))\r
+    return;\r
+  \r
+  int x = rc.left + i_dx;\r
+  int y = rc.top + i_dy;\r
+\r
+  if (i_gravityType & GravityType_N)\r
+    y = i_dy + rcd.top;\r
+  if (i_gravityType & GravityType_E)\r
+    x = i_dx + rcd.right - rcWidth(&rc);\r
+  if (i_gravityType & GravityType_W)\r
+    x = i_dx + rcd.left;\r
+  if (i_gravityType & GravityType_S)\r
+    y = i_dy + rcd.bottom - rcHeight(&rc);\r
+  asyncMoveWindow(hwnd, x, y);\r
+}\r
+\r
+\r
+// move window visibly\r
+void Engine::funcWindowMoveVisibly(FunctionParam *i_param,\r
+                                  TargetWindowType i_twt)\r
+{\r
+  HWND hwnd;\r
+  RECT rc, rcd;\r
+  if (!getSuitableMdiWindow(i_param, &hwnd, &i_twt, &rc, &rcd))\r
+    return;\r
+\r
+  int x = rc.left;\r
+  int y = rc.top;\r
+  if (rc.left < rcd.left)\r
+    x = rcd.left;\r
+  else if (rcd.right < rc.right)\r
+    x = rcd.right - rcWidth(&rc);\r
+  if (rc.top < rcd.top)\r
+    y = rcd.top;\r
+  else if (rcd.bottom < rc.bottom)\r
+    y = rcd.bottom - rcHeight(&rc);\r
+  asyncMoveWindow(hwnd, x, y);\r
+}\r
+\r
+\r
+struct EnumDisplayMonitorsForWindowMonitorToParam\r
+{\r
+  std::vector<HMONITOR> m_monitors;\r
+  std::vector<MONITORINFO> m_monitorinfos;\r
+  int m_primaryMonitorIdx;\r
+  int m_currentMonitorIdx;\r
+\r
+  HMONITOR m_hmon;\r
+\r
+public:\r
+  EnumDisplayMonitorsForWindowMonitorToParam(HMONITOR i_hmon)\r
+    : m_hmon(i_hmon),\r
+      m_primaryMonitorIdx(-1), m_currentMonitorIdx(-1)\r
+  {\r
+  }\r
+};\r
+\r
+static BOOL CALLBACK enumDisplayMonitorsForWindowMonitorTo(\r
+  HMONITOR i_hmon, HDC i_hdc, LPRECT i_rcMonitor, LPARAM i_data)\r
+{\r
+  EnumDisplayMonitorsForWindowMonitorToParam &ep =\r
+    *reinterpret_cast<EnumDisplayMonitorsForWindowMonitorToParam *>(i_data);\r
+\r
+  ep.m_monitors.push_back(i_hmon);\r
+\r
+  MONITORINFO mi;\r
+  mi.cbSize = sizeof(mi);\r
+  getMonitorInfo(i_hmon, &mi);\r
+  ep.m_monitorinfos.push_back(mi);\r
+\r
+  if(mi.dwFlags & MONITORINFOF_PRIMARY)\r
+    ep.m_primaryMonitorIdx = ep.m_monitors.size() - 1;\r
+  if(i_hmon == ep.m_hmon)\r
+    ep.m_currentMonitorIdx = ep.m_monitors.size() - 1;\r
+\r
+  return TRUE;\r
+}\r
+\r
+/// move window to other monitor\r
+void Engine::funcWindowMonitorTo(\r
+    FunctionParam *i_param, WindowMonitorFromType i_fromType, int i_monitor,\r
+    BooleanType i_adjustPos, BooleanType i_adjustSize)\r
+{\r
+  HWND hwnd;\r
+  if(! getSuitableWindow(i_param, &hwnd))\r
+    return;\r
+\r
+  HMONITOR hmonCur;\r
+  hmonCur = monitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);\r
+\r
+  EnumDisplayMonitorsForWindowMonitorToParam ep(hmonCur);\r
+  enumDisplayMonitors(NULL, NULL, enumDisplayMonitorsForWindowMonitorTo,\r
+                      reinterpret_cast<LPARAM>(&ep));\r
+  if(ep.m_monitors.size() < 1 ||\r
+     ep.m_primaryMonitorIdx < 0 || ep.m_currentMonitorIdx < 0)\r
+    return;\r
+\r
+  int targetIdx;\r
+  switch(i_fromType) {\r
+  case WindowMonitorFromType_primary:\r
+    targetIdx = (ep.m_primaryMonitorIdx + i_monitor) % ep.m_monitors.size();\r
+    break;\r
+\r
+  case WindowMonitorFromType_current:\r
+    targetIdx = (ep.m_currentMonitorIdx + i_monitor) % ep.m_monitors.size();\r
+    break;\r
+  }\r
+  if(ep.m_currentMonitorIdx == targetIdx)\r
+    return;\r
+\r
+  RECT rcCur, rcTarget, rcWin;\r
+  rcCur = ep.m_monitorinfos[ep.m_currentMonitorIdx].rcWork;\r
+  rcTarget = ep.m_monitorinfos[targetIdx].rcWork;\r
+  GetWindowRect(hwnd, &rcWin);\r
+\r
+  int x = rcTarget.left + (rcWin.left - rcCur.left);\r
+  int y = rcTarget.top + (rcWin.top - rcCur.top);\r
+  int w = rcWidth(&rcWin);\r
+  int h = rcHeight(&rcWin);\r
+\r
+  if(i_adjustPos) {\r
+    if(x + w > rcTarget.right)\r
+      x = rcTarget.right - w;\r
+    if(x < rcTarget.left)\r
+      x = rcTarget.left;\r
+    if(w > rcWidth(&rcTarget)) {\r
+      x = rcTarget.left;\r
+      w = rcWidth(&rcTarget);\r
+    }\r
+\r
+    if(y + h > rcTarget.bottom)\r
+      y = rcTarget.bottom - h;\r
+    if(y < rcTarget.top)\r
+      y = rcTarget.top;\r
+    if(h > rcHeight(&rcTarget)) {\r
+      y = rcTarget.top;\r
+      h = rcHeight(&rcTarget);\r
+    }\r
+  }\r
+\r
+  if(i_adjustPos && i_adjustSize) {\r
+    if(IsZoomed(hwnd))\r
+      PostMessage(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0);\r
+    asyncMoveWindow(hwnd, x, y, w, h);\r
+  } else {\r
+    asyncMoveWindow(hwnd, x, y);\r
+  }\r
+}\r
+\r
+/// move window to other monitor\r
+void Engine::funcWindowMonitor(\r
+    FunctionParam *i_param, int i_monitor,\r
+    BooleanType i_adjustPos, BooleanType i_adjustSize)\r
+{\r
+  funcWindowMonitorTo(i_param, WindowMonitorFromType_primary, i_monitor,\r
+                      i_adjustPos, i_adjustSize);\r
+}\r
+\r
+\r
+//\r
+void Engine::funcWindowClingToLeft(FunctionParam *i_param,\r
+                                  TargetWindowType i_twt)\r
+{\r
+  funcWindowMoveTo(i_param, GravityType_W, 0, 0, i_twt);\r
+}\r
+\r
+//\r
+void Engine::funcWindowClingToRight(FunctionParam *i_param,\r
+                                   TargetWindowType i_twt)\r
+{\r
+  funcWindowMoveTo(i_param, GravityType_E, 0, 0, i_twt);\r
+}\r
+\r
+//\r
+void Engine::funcWindowClingToTop(FunctionParam *i_param,\r
+                                 TargetWindowType i_twt)\r
+{\r
+  funcWindowMoveTo(i_param, GravityType_N, 0, 0, i_twt);\r
+}\r
+\r
+//\r
+void Engine::funcWindowClingToBottom(FunctionParam *i_param,\r
+                                    TargetWindowType i_twt)\r
+{\r
+  funcWindowMoveTo(i_param, GravityType_S, 0, 0, i_twt);\r
+}\r
+\r
+// close window\r
+void Engine::funcWindowClose(FunctionParam *i_param, TargetWindowType i_twt)\r
+{\r
+  HWND hwnd;\r
+  if (!getSuitableMdiWindow(i_param, &hwnd, &i_twt))\r
+    return;\r
+  PostMessage(hwnd, WM_SYSCOMMAND, SC_CLOSE, 0);\r
+}\r
+\r
+// toggle top-most flag of the window\r
+void Engine::funcWindowToggleTopMost(FunctionParam *i_param)\r
+{\r
+  HWND hwnd;\r
+  if (!getSuitableWindow(i_param, &hwnd))\r
+    return;\r
+  SetWindowPos(\r
+    hwnd,\r
+#ifdef MAYU64\r
+    (GetWindowLongPtr(hwnd, GWL_EXSTYLE) & WS_EX_TOPMOST) ?\r
+#else\r
+    (GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_TOPMOST) ?\r
+#endif\r
+    HWND_NOTOPMOST : HWND_TOPMOST,\r
+    0, 0, 0, 0,\r
+    SWP_ASYNCWINDOWPOS | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOSIZE);\r
+}\r
+\r
+// identify the window\r
+void Engine::funcWindowIdentify(FunctionParam *i_param)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+\r
+  _TCHAR className[GANA_MAX_ATOM_LENGTH];\r
+  bool ok = false;\r
+  if (GetClassName(i_param->m_hwnd, className, NUMBER_OF(className)))\r
+  {\r
+    if (_tcsicmp(className, _T("ConsoleWindowClass")) == 0)\r
+    {\r
+      _TCHAR titleName[1024];\r
+      if (GetWindowText(i_param->m_hwnd, titleName, NUMBER_OF(titleName)) == 0)\r
+       titleName[0] = _T('\0');\r
+      {\r
+       Acquire a(&m_log, 1);\r
+       m_log << _T("HWND:\t") << std::hex\r
+             << reinterpret_cast<int>(i_param->m_hwnd)\r
+             << std::dec << std::endl;\r
+      }\r
+      Acquire a(&m_log, 0);\r
+      m_log << _T("CLASS:\t") << className << std::endl;\r
+      m_log << _T("TITLE:\t") << titleName << std::endl;\r
+\r
+      HWND hwnd = getToplevelWindow(i_param->m_hwnd, NULL);\r
+      RECT rc;\r
+      GetWindowRect(hwnd, &rc);\r
+      m_log << _T("Toplevel Window Position/Size: (")\r
+           << rc.left << _T(", ") << rc.top << _T(") / (")\r
+           << rcWidth(&rc) << _T("x") << rcHeight(&rc)\r
+           << _T(")") << std::endl;\r
+      \r
+      SystemParametersInfo(SPI_GETWORKAREA, 0, (void *)&rc, FALSE);\r
+      m_log << _T("Desktop Window Position/Size: (")\r
+           << rc.left << _T(", ") << rc.top << _T(") / (")\r
+           << rcWidth(&rc) << _T("x") << rcHeight(&rc)\r
+           << _T(")") << std::endl;\r
+\r
+      m_log << std::endl;\r
+      ok = true;\r
+    }\r
+  }\r
+  if (!ok)\r
+  {\r
+    UINT WM_MAYU_MESSAGE = RegisterWindowMessage(\r
+               addSessionId(WM_MAYU_MESSAGE_NAME).c_str());\r
+    CHECK_TRUE( PostMessage(i_param->m_hwnd, WM_MAYU_MESSAGE,\r
+                           MayuMessage_notifyName, 0) );\r
+  }\r
+}\r
+\r
+// set alpha blending parameter to the window\r
+void Engine::funcWindowSetAlpha(FunctionParam *i_param, int i_alpha)\r
+{\r
+  HWND hwnd;\r
+  if (!getSuitableWindow(i_param, &hwnd))\r
+    return;\r
+  \r
+  if (i_alpha < 0)     // remove all alpha\r
+  {\r
+    for (WindowsWithAlpha::iterator i = m_windowsWithAlpha.begin(); \r
+        i != m_windowsWithAlpha.end(); ++ i)\r
+    {\r
+#ifdef MAYU64\r
+      SetWindowLongPtr(*i, GWL_EXSTYLE,\r
+                   GetWindowLongPtr(*i, GWL_EXSTYLE) & ~WS_EX_LAYERED);\r
+#else\r
+      SetWindowLong(*i, GWL_EXSTYLE,\r
+                   GetWindowLong(*i, GWL_EXSTYLE) & ~WS_EX_LAYERED);\r
+#endif\r
+      RedrawWindow(*i, NULL, NULL,\r
+                  RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);\r
+    }\r
+    m_windowsWithAlpha.clear();\r
+  }\r
+  else\r
+  {\r
+#ifdef MAYU64\r
+    LONG_PTR exStyle = GetWindowLongPtr(hwnd, GWL_EXSTYLE);\r
+#else\r
+    LONG exStyle = GetWindowLong(hwnd, GWL_EXSTYLE);\r
+#endif\r
+    if (exStyle & WS_EX_LAYERED)       // remove alpha\r
+    {\r
+      WindowsWithAlpha::iterator\r
+       i = std::find(m_windowsWithAlpha.begin(), m_windowsWithAlpha.end(),\r
+                     hwnd);\r
+      if (i == m_windowsWithAlpha.end())\r
+       return; // already layered by the application\r
+    \r
+      m_windowsWithAlpha.erase(i);\r
+    \r
+#ifdef MAYU64\r
+      SetWindowLongPtr(hwnd, GWL_EXSTYLE, exStyle & ~WS_EX_LAYERED);\r
+#else    \r
+      SetWindowLong(hwnd, GWL_EXSTYLE, exStyle & ~WS_EX_LAYERED);\r
+#endif\r
+    }\r
+    else       // add alpha\r
+    {\r
+#ifdef MAYU64\r
+      SetWindowLongPtr(hwnd, GWL_EXSTYLE, exStyle | WS_EX_LAYERED);\r
+#else\r
+      SetWindowLong(hwnd, GWL_EXSTYLE, exStyle | WS_EX_LAYERED);\r
+#endif\r
+      i_alpha %= 101;\r
+      if (!setLayeredWindowAttributes(hwnd, 0,\r
+                                     (BYTE)(255 * i_alpha / 100), LWA_ALPHA))\r
+      {\r
+       Acquire a(&m_log, 0);\r
+       m_log << _T("error: &WindowSetAlpha(") << i_alpha\r
+             << _T(") failed for HWND: ") << std::hex\r
+             << hwnd << std::dec << std::endl;\r
+       return;\r
+      }\r
+      m_windowsWithAlpha.push_front(hwnd);\r
+    }\r
+    RedrawWindow(hwnd, NULL, NULL,\r
+                RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);\r
+  }\r
+}\r
+\r
+\r
+// redraw the window\r
+void Engine::funcWindowRedraw(FunctionParam *i_param)\r
+{\r
+  HWND hwnd;\r
+  if (!getSuitableWindow(i_param, &hwnd))\r
+    return;\r
+  RedrawWindow(hwnd, NULL, NULL,\r
+              RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);\r
+}\r
+\r
+// resize window to\r
+void Engine::funcWindowResizeTo(FunctionParam *i_param, int i_width,\r
+                               int i_height, TargetWindowType i_twt)\r
+{\r
+  HWND hwnd;\r
+  RECT rc, rcd;\r
+  if (!getSuitableMdiWindow(i_param, &hwnd, &i_twt, &rc, &rcd))\r
+    return;\r
+  \r
+  if (i_width == 0)\r
+    i_width = rcWidth(&rc);\r
+  else if (i_width < 0)\r
+    i_width += rcWidth(&rcd);\r
+  \r
+  if (i_height == 0)\r
+    i_height = rcHeight(&rc);\r
+  else if (i_height < 0)\r
+    i_height += rcHeight(&rcd);\r
+  \r
+  asyncResize(hwnd, i_width, i_height);\r
+}\r
+\r
+// move the mouse cursor\r
+void Engine::funcMouseMove(FunctionParam *i_param, int i_dx, int i_dy)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+  POINT pt;\r
+  GetCursorPos(&pt);\r
+  SetCursorPos(pt.x + i_dx, pt.y + i_dy);\r
+}\r
+\r
+// send a mouse-wheel-message to Windows\r
+void Engine::funcMouseWheel(FunctionParam *i_param, int i_delta)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+  mouse_event(MOUSEEVENTF_WHEEL, 0, 0, i_delta, 0);\r
+}\r
+\r
+// convert the contents of the Clipboard to upper case\r
+void Engine::funcClipboardChangeCase(FunctionParam *i_param,\r
+                                    BooleanType i_doesConvertToUpperCase)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+  \r
+  HGLOBAL hdata;\r
+  const _TCHAR *text = getTextFromClipboard(&hdata);\r
+  HGLOBAL hdataNew = NULL;\r
+  if (text)\r
+  {\r
+    int size = static_cast<int>(GlobalSize(hdata));\r
+    hdataNew = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, size);\r
+    if (hdataNew)\r
+    {\r
+      if (_TCHAR *dataNew = reinterpret_cast<_TCHAR *>(GlobalLock(hdataNew)))\r
+      {\r
+       std::memcpy(dataNew, text, size);\r
+       _TCHAR *dataEnd = dataNew + size;\r
+       while (dataNew < dataEnd && *dataNew)\r
+       {\r
+         _TCHAR c = *dataNew;\r
+         if (_istlead(c))\r
+           dataNew += 2;\r
+         else\r
+           *dataNew++ =\r
+             i_doesConvertToUpperCase ? _totupper(c) : _totlower(c);\r
+       }\r
+       GlobalUnlock(hdataNew);\r
+      }\r
+    }\r
+  }\r
+  closeClipboard(hdata, hdataNew);\r
+}\r
+\r
+// convert the contents of the Clipboard to upper case\r
+void Engine::funcClipboardUpcaseWord(FunctionParam *i_param)\r
+{\r
+  funcClipboardChangeCase(i_param, BooleanType_true);\r
+}\r
+\r
+// convert the contents of the Clipboard to lower case\r
+void Engine::funcClipboardDowncaseWord(FunctionParam *i_param)\r
+{\r
+  funcClipboardChangeCase(i_param, BooleanType_false);\r
+}\r
+\r
+// set the contents of the Clipboard to the string\r
+void Engine::funcClipboardCopy(FunctionParam *i_param, const StrExprArg &i_text)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+  if (!OpenClipboard(NULL))\r
+    return;\r
+  \r
+  HGLOBAL hdataNew =\r
+    GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE,\r
+               (i_text.eval().size() + 1) * sizeof(_TCHAR));\r
+  if (!hdataNew)\r
+    return;\r
+  _TCHAR *dataNew = reinterpret_cast<_TCHAR *>(GlobalLock(hdataNew));\r
+  _tcscpy(dataNew, i_text.eval().c_str());\r
+  GlobalUnlock(hdataNew);\r
+  closeClipboard(NULL, hdataNew);\r
+}\r
+\r
+//\r
+void Engine::funcEmacsEditKillLinePred(\r
+  FunctionParam *i_param, const KeySeq *i_keySeq1, const KeySeq *i_keySeq2)\r
+{\r
+  m_emacsEditKillLine.m_doForceReset = false;\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+  \r
+  int r = m_emacsEditKillLine.pred();\r
+  const KeySeq *keySeq;\r
+  if (r == 1)\r
+    keySeq = i_keySeq1;\r
+  else if (r == 2)\r
+    keySeq = i_keySeq2;\r
+  else // r == 0\r
+    return;\r
+  ASSERT(keySeq);\r
+  generateKeySeqEvents(i_param->m_c, keySeq, Part_all);\r
+}\r
+\r
+//\r
+void Engine::funcEmacsEditKillLineFunc(FunctionParam *i_param)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+  m_emacsEditKillLine.func();\r
+  m_emacsEditKillLine.m_doForceReset = false;\r
+}\r
+\r
+// clear log\r
+void Engine::funcLogClear(FunctionParam *i_param)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+  PostMessage(getAssociatedWndow(), WM_APP_engineNotify,\r
+             EngineNotify_clearLog, 0);\r
+}\r
+\r
+// recenter\r
+void Engine::funcRecenter(FunctionParam *i_param)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+  if (m_hwndFocus)\r
+  {\r
+    UINT WM_MAYU_MESSAGE = RegisterWindowMessage(\r
+               addSessionId(WM_MAYU_MESSAGE_NAME).c_str());\r
+    PostMessage(m_hwndFocus, WM_MAYU_MESSAGE, MayuMessage_funcRecenter, 0);\r
+  }\r
+}\r
+\r
+// set IME open status\r
+void Engine::funcSetImeStatus(FunctionParam *i_param, ToggleType i_toggle)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+  if (m_hwndFocus)\r
+  {\r
+    UINT WM_MAYU_MESSAGE = RegisterWindowMessage(\r
+               addSessionId(WM_MAYU_MESSAGE_NAME).c_str());\r
+    int status = -1;\r
+    switch (i_toggle)\r
+    {\r
+      case ToggleType_toggle:\r
+       status = -1;\r
+       break;\r
+      case ToggleType_off:\r
+       status = 0;\r
+       break;\r
+      case ToggleType_on:\r
+       status = 1;\r
+       break;\r
+    }\r
+    PostMessage(m_hwndFocus, WM_MAYU_MESSAGE, MayuMessage_funcSetImeStatus, status);\r
+  }\r
+}\r
+\r
+// set IME open status\r
+void Engine::funcSetImeString(FunctionParam *i_param, const StrExprArg &i_data)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+  if (m_hwndFocus)\r
+  {\r
+    UINT WM_MAYU_MESSAGE = RegisterWindowMessage(\r
+               addSessionId(WM_MAYU_MESSAGE_NAME).c_str());\r
+    PostMessage(m_hwndFocus, WM_MAYU_MESSAGE, MayuMessage_funcSetImeString, i_data.eval().size() * sizeof(_TCHAR));\r
+\r
+    DWORD len = 0;\r
+    DWORD error;\r
+    DisconnectNamedPipe(m_hookPipe);\r
+    ConnectNamedPipe(m_hookPipe, NULL);\r
+    error = WriteFile(m_hookPipe, i_data.eval().c_str(),\r
+                     i_data.eval().size() * sizeof(_TCHAR),\r
+                     &len, NULL);\r
+\r
+    //FlushFileBuffers(m_hookPipe);\r
+  }\r
+}\r
+\r
+// Direct SSTP Server\r
+class DirectSSTPServer\r
+{\r
+public:\r
+  tstring m_path;\r
+  HWND m_hwnd;\r
+  tstring m_name;\r
+  tstring m_keroname;\r
+\r
+public:\r
+  DirectSSTPServer()\r
+    : m_hwnd(NULL)\r
+  {\r
+  }\r
+};\r
+\r
+\r
+class ParseDirectSSTPData\r
+{\r
+  typedef boost::match_results<boost::regex::const_iterator> MR;\r
+\r
+public:\r
+  typedef std::map<tstring, DirectSSTPServer> DirectSSTPServers;\r
+\r
+private:\r
+  DirectSSTPServers *m_directSSTPServers;\r
+  \r
+public:\r
+  // constructor\r
+  ParseDirectSSTPData(DirectSSTPServers *i_directSSTPServers)\r
+    : m_directSSTPServers(i_directSSTPServers)\r
+  {\r
+  }\r
+  \r
+  bool operator()(const MR& i_what)\r
+  {\r
+#ifdef _UNICODE\r
+    tstring id(to_wstring(std::string(i_what[1].first, i_what[1].second)));\r
+    tstring member(to_wstring(std::string(i_what[2].first, i_what[2].second)));\r
+    tstring value(to_wstring(std::string(i_what[3].first, i_what[3].second)));\r
+#else\r
+    tstring id(i_what[1].first, i_what[1].second);\r
+    tstring member(i_what[2].first, i_what[2].second);\r
+    tstring value(i_what[3].first, i_what[3].second);\r
+#endif\r
+\r
+    if (member == _T("path"))\r
+      (*m_directSSTPServers)[id].m_path = value;\r
+    else if (member == _T("hwnd"))\r
+      (*m_directSSTPServers)[id].m_hwnd =\r
+       reinterpret_cast<HWND>(_ttoi(value.c_str()));\r
+    else if (member == _T("name"))\r
+      (*m_directSSTPServers)[id].m_name = value;\r
+    else if (member == _T("keroname"))\r
+      (*m_directSSTPServers)[id].m_keroname = value;\r
+    return true; \r
+  }\r
+};\r
+\r
+// Direct SSTP\r
+void Engine::funcDirectSSTP(FunctionParam *i_param,\r
+                           const tregex &i_name,\r
+                           const StrExprArg &i_protocol,\r
+                           const std::list<tstringq> &i_headers)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+\r
+  // check Direct SSTP server exist ?\r
+  if (HANDLE hm = OpenMutex(MUTEX_ALL_ACCESS, FALSE, _T("sakura")))\r
+    CloseHandle(hm);\r
+  else\r
+  {\r
+    Acquire a(&m_log, 0);\r
+    m_log << _T(" Error(1): Direct SSTP server does not exist.");\r
+    return;\r
+  }\r
+\r
+  HANDLE hfm = OpenFileMapping(FILE_MAP_READ, FALSE, _T("Sakura"));\r
+  if (!hfm)\r
+  {\r
+    Acquire a(&m_log, 0);\r
+    m_log << _T(" Error(2): Direct SSTP server does not provide data.");\r
+    return;\r
+  }\r
+  \r
+  char *data =\r
+    reinterpret_cast<char *>(MapViewOfFile(hfm, FILE_MAP_READ, 0, 0, 0));\r
+  if (!data)\r
+  {\r
+    CloseHandle(hfm);\r
+    Acquire a(&m_log, 0);\r
+    m_log << _T(" Error(3): Direct SSTP server does not provide data.");\r
+    return;\r
+  }\r
+  \r
+  long length = *(long *)data;\r
+  const char *begin = data + 4;\r
+  const char *end = data + length;\r
+  boost::regex getSakura("([0-9a-fA-F]{32})\\.([^\x01]+)\x01(.*?)\r\n");\r
+  \r
+  ParseDirectSSTPData::DirectSSTPServers servers;\r
+  boost::regex_iterator<boost::regex::const_iterator>\r
+    it(begin, end, getSakura), last;\r
+  for (; it != last; ++it)\r
+    ((ParseDirectSSTPData)(&servers))(*it);\r
+\r
+  // make request\r
+  tstring request;\r
+  if (!i_protocol.eval().size())\r
+    request += _T("NOTIFY SSTP/1.1");\r
+  else\r
+    request += i_protocol.eval();\r
+  request += _T("\r\n");\r
+\r
+  bool hasSender = false;\r
+  for (std::list<tstringq>::const_iterator\r
+        i = i_headers.begin(); i != i_headers.end(); ++ i)\r
+  {\r
+    if (_tcsnicmp(_T("Charset"), i->c_str(), 7) == 0 ||\r
+       _tcsnicmp(_T("Hwnd"),    i->c_str(), 4) == 0)\r
+      continue;\r
+    if (_tcsnicmp(_T("Sender"), i->c_str(), 6) == 0)\r
+      hasSender = true;\r
+    request += i->c_str();\r
+    request += _T("\r\n");\r
+  }\r
+\r
+  if (!hasSender)\r
+  {\r
+    request += _T("Sender: ");\r
+    request += loadString(IDS_mayu);\r
+    request += _T("\r\n");\r
+  }\r
+  \r
+  _TCHAR buf[100];\r
+  _sntprintf(buf, NUMBER_OF(buf), _T("HWnd: %d\r\n"),\r
+            reinterpret_cast<int>(m_hwndAssocWindow));\r
+  request += buf;\r
+\r
+#ifdef _UNICODE\r
+  request += _T("Charset: UTF-8\r\n");\r
+#else\r
+  request += _T("Charset: Shift_JIS\r\n");\r
+#endif\r
+  request += _T("\r\n");\r
+\r
+#ifdef _UNICODE\r
+  std::string request_UTF_8 = to_UTF_8(request);\r
+#endif\r
+\r
+  // send request to Direct SSTP Server which matches i_name;\r
+  for (ParseDirectSSTPData::DirectSSTPServers::iterator\r
+        i = servers.begin(); i != servers.end(); ++ i)\r
+  {\r
+    tsmatch what;\r
+    if (boost::regex_match(i->second.m_name, what, i_name))\r
+    {\r
+      COPYDATASTRUCT cd;\r
+      cd.dwData = 9801;\r
+#ifdef _UNICODE\r
+      cd.cbData = request_UTF_8.size();\r
+      cd.lpData = (void *)request_UTF_8.c_str();\r
+#else\r
+      cd.cbData = request.size();\r
+      cd.lpData = (void *)request.c_str();\r
+#endif\r
+#ifdef MAYU64\r
+      DWORD_PTR result;\r
+#else\r
+      DWORD result;\r
+#endif\r
+      SendMessageTimeout(i->second.m_hwnd, WM_COPYDATA,\r
+                        reinterpret_cast<WPARAM>(m_hwndAssocWindow),\r
+                        reinterpret_cast<LPARAM>(&cd),\r
+                        SMTO_ABORTIFHUNG | SMTO_BLOCK, 5000, &result);\r
+    }\r
+  }\r
+  \r
+  UnmapViewOfFile(data);\r
+  CloseHandle(hfm);\r
+}\r
+\r
+\r
+namespace shu\r
+{\r
+  class PlugIn\r
+  {\r
+    enum Type\r
+    {\r
+      Type_A,\r
+      Type_W\r
+    };\r
+    \r
+  private:\r
+    HMODULE m_dll;\r
+    FARPROC m_func;\r
+    Type m_type;\r
+    tstringq m_funcParam;\r
+    \r
+  public:\r
+    PlugIn() : m_dll(NULL)\r
+    {\r
+    }\r
+    \r
+    ~PlugIn()\r
+    {\r
+      FreeLibrary(m_dll);\r
+    }\r
+\r
+    bool load(const tstringq &i_dllName, const tstringq &i_funcName,\r
+             const tstringq &i_funcParam, tomsgstream &i_log)\r
+    {\r
+      m_dll = LoadLibrary((_T("Plugins\\") + i_dllName).c_str());\r
+      if (!m_dll)\r
+      {\r
+       m_dll = LoadLibrary((_T("Plugin\\") + i_dllName).c_str());\r
+       if (!m_dll)\r
+       {\r
+         m_dll = LoadLibrary(i_dllName.c_str());\r
+         if (!m_dll)\r
+         {\r
+           Acquire a(&i_log);\r
+           i_log << std::endl;\r
+           i_log << _T("error: &PlugIn() failed to load ") << i_dllName << std::endl;\r
+           return false;\r
+         }\r
+       }\r
+      }\r
+\r
+      // get function\r
+#ifdef UNICODE\r
+#  define to_wstring\r
+#else\r
+#  define to_string\r
+#endif\r
+      m_type = Type_W;\r
+      m_func = GetProcAddress(m_dll, to_string(_T("mayu") + i_funcName + _T("W")).c_str());\r
+      if (!m_func)\r
+      {\r
+       m_type = Type_A;\r
+       m_func\r
+         = GetProcAddress(m_dll, to_string(_T("mayu") + i_funcName + _T("A")).c_str());\r
+       if (!m_func)\r
+       {\r
+         m_func = GetProcAddress(m_dll, to_string(_T("mayu") + i_funcName).c_str());\r
+         if (!m_func)\r
+         {\r
+           m_func = GetProcAddress(m_dll, to_string(i_funcName).c_str());\r
+           if (!m_func)\r
+           {\r
+             Acquire a(&i_log);\r
+             i_log << std::endl;\r
+             i_log << _T("error: &PlugIn() failed to find function: ")\r
+                   << i_funcName << std::endl;\r
+             return false;\r
+           }\r
+         }\r
+       }\r
+      }\r
+      \r
+      m_funcParam = i_funcParam;\r
+      return true;\r
+    }\r
+\r
+    void exec()\r
+    {\r
+      ASSERT( m_dll );\r
+      ASSERT( m_func );\r
+      \r
+      typedef void (WINAPI * PLUGIN_FUNCTION_A)(const char *i_arg);\r
+      typedef void (WINAPI * PLUGIN_FUNCTION_W)(const wchar_t *i_arg);\r
+      switch (m_type)\r
+      {\r
+       case Type_A:\r
+         reinterpret_cast<PLUGIN_FUNCTION_A>(m_func)(to_string(m_funcParam).c_str());\r
+         break;\r
+       case Type_W:\r
+         reinterpret_cast<PLUGIN_FUNCTION_W>(m_func)(to_wstring(m_funcParam).c_str());\r
+         break;\r
+      }\r
+    }\r
+#undef to_string\r
+#undef to_wstring\r
+  };\r
+\r
+  static void plugInThread(void *i_plugin)\r
+  {\r
+    PlugIn *plugin = static_cast<PlugIn *>(i_plugin);\r
+    plugin->exec();\r
+    delete plugin;\r
+  }\r
+}\r
+\r
+void Engine::funcPlugIn(FunctionParam *i_param,\r
+                       const StrExprArg &i_dllName,\r
+                       const StrExprArg &i_funcName,\r
+                       const StrExprArg &i_funcParam,\r
+                       BooleanType i_doesCreateThread)\r
+{\r
+  if (!i_param->m_isPressed)\r
+    return;\r
+\r
+  shu::PlugIn *plugin = new shu::PlugIn();\r
+  if (!plugin->load(i_dllName.eval(), i_funcName.eval(), i_funcParam.eval(), m_log))\r
+  {\r
+    delete plugin;\r
+    return;\r
+  }\r
+  if (i_doesCreateThread)\r
+  {\r
+    if (_beginthread(shu::plugInThread, 0, plugin) == -1)\r
+    {\r
+      delete plugin;\r
+      Acquire a(&m_log);\r
+      m_log << std::endl;\r
+      m_log << _T("error: &PlugIn() failed to create thread.");\r
+    }\r
+    return;\r
+  }\r
+  else\r
+    plugin->exec();\r
+}\r
+\r
+\r
+void Engine::funcMouseHook(FunctionParam *i_param,\r
+                          MouseHookType i_hookType, int i_hookParam)\r
+{\r
+  GetCursorPos(&g_hookData->m_mousePos);\r
+  g_hookData->m_mouseHookType = i_hookType;\r
+  g_hookData->m_mouseHookParam = i_hookParam;\r
+\r
+  switch (i_hookType)\r
+  {\r
+    case MouseHookType_WindowMove:\r
+    {\r
+      // For this type, g_hookData->m_mouseHookParam means\r
+      // target window type to move.\r
+      HWND target;\r
+      bool isMDI;\r
+\r
+      // i_hooParam < 0 means target window to move is MDI.\r
+      if (i_hookParam < 0)\r
+       isMDI = true;\r
+      else\r
+       isMDI = false;\r
+\r
+      // abs(i_hookParam) == 2: target is window under mouse cursor\r
+      // otherwise: target is current focus window\r
+      if (i_hookParam == 2 || i_hookParam == -2)\r
+       target = WindowFromPoint(g_hookData->m_mousePos);\r
+      else\r
+       target = i_param->m_hwnd;\r
+\r
+      g_hookData->m_hwndMouseHookTarget =\r
+       reinterpret_cast<DWORD>(getToplevelWindow(target, &isMDI));\r
+      break;\r
+    default:\r
+      g_hookData->m_hwndMouseHookTarget = NULL;\r
+      break;\r
+    }\r
+  }\r
+  return;\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// StrExpr\r
+class StrExpr\r
+{\r
+private:\r
+  tstringq m_symbol;\r
+protected:\r
+  static const Engine *s_engine;\r
+public:\r
+  StrExpr(const tstringq &i_symbol) : m_symbol(i_symbol) {};\r
+\r
+  virtual ~StrExpr() {};\r
+\r
+  virtual StrExpr *clone() const\r
+  {\r
+    return new StrExpr(*this);\r
+  }\r
+\r
+  virtual tstringq eval() const\r
+  {\r
+    return m_symbol;\r
+  }\r
+\r
+  static void setEngine(const Engine *i_engine) { s_engine = i_engine; }\r
+};\r
+\r
+const Engine *StrExpr::s_engine = NULL;\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// StrExprClipboard\r
+class StrExprClipboard : public StrExpr\r
+{\r
+public:\r
+  StrExprClipboard(const tstringq &i_symbol) : StrExpr(i_symbol) {};\r
+\r
+  ~StrExprClipboard() {};\r
+\r
+  StrExpr *clone() const\r
+  {\r
+    return new StrExprClipboard(*this);\r
+  }\r
+\r
+  tstringq eval() const\r
+  {\r
+    HGLOBAL g;\r
+    const _TCHAR *text = getTextFromClipboard(&g);\r
+    const tstring value(text == NULL ? _T("") : text);\r
+    closeClipboard(g);\r
+    return value;\r
+  }\r
+};\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// StrExprWindowClassName\r
+class StrExprWindowClassName : public StrExpr\r
+{\r
+public:\r
+  StrExprWindowClassName(const tstringq &i_symbol) : StrExpr(i_symbol) {};\r
+\r
+  ~StrExprWindowClassName() {};\r
+\r
+  StrExpr *clone() const\r
+  {\r
+    return new StrExprWindowClassName(*this);\r
+  }\r
+\r
+  tstringq eval() const\r
+  {\r
+    return s_engine->getCurrentWindowClassName();\r
+  }\r
+};\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// StrExprWindowTitleName\r
+class StrExprWindowTitleName : public StrExpr\r
+{\r
+public:\r
+  StrExprWindowTitleName(const tstringq &i_symbol) : StrExpr(i_symbol) {};\r
+\r
+  ~StrExprWindowTitleName() {};\r
+\r
+  StrExpr *clone() const\r
+  {\r
+    return new StrExprWindowTitleName(*this);\r
+  }\r
+\r
+  tstringq eval() const\r
+  {\r
+    return s_engine->getCurrentWindowTitleName();\r
+  }\r
+};\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// StrExprArg\r
+\r
+\r
+// default constructor\r
+StrExprArg::StrExprArg()\r
+{\r
+  m_expr = new StrExpr(_T(""));\r
+}\r
+\r
+\r
+// copy contructor\r
+StrExprArg::StrExprArg(const StrExprArg &i_data)\r
+{\r
+  m_expr = i_data.m_expr->clone();\r
+}\r
+\r
+\r
+StrExprArg &StrExprArg::operator=(const StrExprArg &i_data)\r
+{\r
+  if (i_data.m_expr == m_expr)\r
+    return *this;\r
+\r
+  delete m_expr;\r
+  m_expr = i_data.m_expr->clone();\r
+\r
+  return *this;\r
+}\r
+\r
+\r
+// initializer\r
+StrExprArg::StrExprArg(const tstringq &i_symbol, Type i_type)\r
+{\r
+  switch (i_type)\r
+  {\r
+    case Literal:\r
+      m_expr = new StrExpr(i_symbol);\r
+      break;\r
+    case Builtin:\r
+      if (i_symbol == _T("Clipboard"))\r
+       m_expr = new StrExprClipboard(i_symbol);\r
+      else if (i_symbol == _T("WindowClassName"))\r
+       m_expr = new StrExprWindowClassName(i_symbol);\r
+      else if (i_symbol == _T("WindowTitleName"))\r
+       m_expr = new StrExprWindowTitleName(i_symbol);\r
+      break;\r
+    default:\r
+      break;\r
+  }\r
+}\r
+\r
+\r
+StrExprArg::~StrExprArg()\r
+{\r
+  delete m_expr;\r
+}\r
+\r
+\r
+tstringq StrExprArg::eval() const\r
+{\r
+  return m_expr->eval();\r
+}\r
+\r
+void StrExprArg::setEngine(const Engine *i_engine)\r
+{\r
+  StrExpr::setEngine(i_engine);\r
+}\r
+\r
+// stream output\r
+tostream &operator<<(tostream &i_ost, const StrExprArg &i_data)\r
+{\r
+  i_ost << i_data.eval();\r
+  return i_ost;\r
+}\r
index f4d0b60..85dfd9c 100644 (file)
--- a/hook.cpp
+++ b/hook.cpp
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// hook.cpp
-
-
-#define _HOOK_CPP
-
-#include "misc.h"
-
-#include "hook.h"
-#include "stringtool.h"
-
-#include <locale.h>
-#include <imm.h>
-#include <richedit.h>
-
-
-///
-#define HOOK_DATA_NAME _T("{08D6E55C-5103-4e00-8209-A1C4AB13BBEF}") _T(VERSION)
-#ifdef _WIN64
-#define HOOK_DATA_NAME_ARCH _T("{290C0D51-8AEE-403d-9172-E43D46270996}") _T(VERSION)
-#else // !_WIN64
-#define HOOK_DATA_NAME_ARCH _T("{716A5DEB-CB02-4438-ABC8-D00E48673E45}") _T(VERSION)
-#endif // !_WIN64
-
-// Some applications use different values for below messages
-// when double click of title bar.
-#define SC_MAXIMIZE2 (SC_MAXIMIZE + 2)
-#define SC_MINIMIZE2 (SC_MINIMIZE + 2)
-#define SC_RESTORE2 (SC_RESTORE + 2)
-
-// Debug Macros
-#ifdef NDEBUG
-#define HOOK_RPT0(msg)
-#define HOOK_RPT1(msg, arg1)
-#define HOOK_RPT2(msg, arg1, arg2)
-#else
-#define HOOK_RPT0(msg) if (g.m_isLogging) { _RPT0(_CRT_WARN, msg); }
-#define HOOK_RPT1(msg, arg1) if (g.m_isLogging) { _RPT1(_CRT_WARN, msg, arg1); }
-#define HOOK_RPT2(msg, arg1, arg2) if (g.m_isLogging) { _RPT2(_CRT_WARN, msg, arg1, arg2); }
-#endif
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Global Variables
-
-
-DllExport HookData *g_hookData;                        ///
-
-///
-class HookDataArch
-{
-public:
-  HHOOK m_hHookGetMessage;                     ///
-  HHOOK m_hHookCallWndProc;                    ///
-};
-
-static HookDataArch *s_hookDataArch;
-
-struct Globals
-{
-  HANDLE m_hHookData;                          ///
-  HANDLE m_hHookDataArch;                      ///
-  HWND m_hwndFocus;                            /// 
-  HINSTANCE m_hInstDLL;                                ///
-  bool m_isInMenu;                             ///
-  UINT m_WM_MAYU_MESSAGE;                      ///
-  bool m_isImeLock;                            ///
-  bool m_isImeCompositioning;                  ///
-  HHOOK m_hHookMouseProc;                      ///
-#ifdef NO_DRIVER
-  HHOOK m_hHookKeyboardProc;                   ///
-  KEYBOARD_DETOUR m_keyboardDetour;
-  Engine *m_engine;
-#endif // NO_DRIVER
-  DWORD m_hwndTaskTray;                                ///
-  HANDLE m_hMailslot;
-  bool m_isInitialized;
-#ifndef NDEBUG
-  bool m_isLogging;
-  _TCHAR m_moduleName[GANA_MAX_PATH];
-#endif // !NDEBUG
-};
-
-static Globals g;
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Prototypes
-
-
-static void notifyThreadDetach();
-static void notifyShow(NotifyShow::Show i_show, bool i_isMDI);
-static void notifyLog(_TCHAR *i_msg);
-static bool mapHookData();
-static void unmapHookData();
-static bool initialize();
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Functions
-
-bool initialize()
-{
-#ifndef NDEBUG
-  _TCHAR path[GANA_MAX_PATH];
-  GetModuleFileName(NULL, path, GANA_MAX_PATH);
-  _tsplitpath_s(path, NULL, 0, NULL, 0, g.m_moduleName, GANA_MAX_PATH, NULL, 0);
-  if (_tcsncmp(g.m_moduleName, _T("Dbgview"), sizeof(_T("Dbgview"))/sizeof(_TCHAR)) != 0 &&
-      _tcsncmp(g.m_moduleName, _T("windbg"), sizeof(_T("windbg"))/sizeof(_TCHAR)) != 0)
-  {
-       g.m_isLogging = true;
-  }
-#endif // !NDEBUG
-#ifdef USE_MAILSLOT
-  g.m_hMailslot =
-         CreateFile(NOTIFY_MAILSLOT_NAME, GENERIC_WRITE,
-                    FILE_SHARE_READ | FILE_SHARE_WRITE,
-                    (SECURITY_ATTRIBUTES *)NULL, OPEN_EXISTING,
-                    FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL);
-  if (g.m_hMailslot == INVALID_HANDLE_VALUE)
-  {
-    HOOK_RPT2("MAYU: %S create mailslot failed(0x%08x)\r\n", g.m_moduleName, GetLastError());
-  }
-  else
-  {
-    HOOK_RPT1("MAYU: %S create mailslot successed\r\n", g.m_moduleName);
-  }
-#endif //USE_MAILSLOT
-  if (!mapHookData())
-    return false;
-  _tsetlocale(LC_ALL, _T(""));
-  g.m_WM_MAYU_MESSAGE =
-    RegisterWindowMessage(addSessionId(WM_MAYU_MESSAGE_NAME).c_str());
-  g.m_hwndTaskTray = g_hookData->m_hwndTaskTray;
-  g.m_isInitialized = true;
-  return true;
-}
-
-/// EntryPoint
-BOOL WINAPI DllMain(HINSTANCE i_hInstDLL, DWORD i_fdwReason,
-                   LPVOID /* i_lpvReserved */)
-{
-  switch (i_fdwReason)
-  {
-    case DLL_PROCESS_ATTACH:
-    {
-#ifndef NDEBUG
-      g.m_isLogging = false;
-#endif // !NDEBUG
-      g.m_isInitialized = false;
-      g.m_hInstDLL = i_hInstDLL;
-      break;
-    }
-    case DLL_THREAD_ATTACH:
-      break;
-    case DLL_PROCESS_DETACH:
-      notifyThreadDetach();
-      unmapHookData();
-#ifdef USE_MAILSLOT
-      if (g.m_hMailslot != INVALID_HANDLE_VALUE)
-      {
-       CloseHandle(g.m_hMailslot);
-       g.m_hMailslot = INVALID_HANDLE_VALUE;
-      }
-#endif //USE_MAILSLOT
-      break;
-    case DLL_THREAD_DETACH:
-      notifyThreadDetach();
-      break;
-    default:
-      break;
-  }
-  return TRUE;
-}
-
-
-/// map hook data
-static bool mapHookData()
-{
-  g.m_hHookData = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,
-                                   0, sizeof(HookData),
-                                   addSessionId(HOOK_DATA_NAME).c_str());
-  if (!g.m_hHookData)
-  {
-    unmapHookData();
-    return false;
-  }
-  
-  g_hookData =
-    (HookData *)MapViewOfFile(g.m_hHookData, FILE_MAP_READ | FILE_MAP_WRITE,
-                             0, 0, sizeof(HookData));
-  if (!g_hookData)
-  {
-    unmapHookData();
-    return false;
-  }
-
-  g.m_hHookDataArch = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,
-                                   0, sizeof(HookDataArch),
-                                   addSessionId(HOOK_DATA_NAME_ARCH).c_str());
-  if (!g.m_hHookDataArch)
-  {
-    unmapHookData();
-    return false;
-  }
-  
-  s_hookDataArch =
-    (HookDataArch *)MapViewOfFile(g.m_hHookDataArch, FILE_MAP_READ | FILE_MAP_WRITE,
-                             0, 0, sizeof(HookDataArch));
-  if (!s_hookDataArch)
-  {
-    unmapHookData();
-    return false;
-  }
-
-  return true;
-}
-
-
-/// unmap hook data
-static void unmapHookData()
-{
-  if (g_hookData)
-    UnmapViewOfFile(g_hookData);
-  g_hookData = NULL;
-  if (g.m_hHookData)
-    CloseHandle(g.m_hHookData);
-  g.m_hHookData = NULL;
-  if (s_hookDataArch)
-    UnmapViewOfFile(s_hookDataArch);
-  s_hookDataArch = NULL;
-  if (g.m_hHookDataArch)
-    CloseHandle(g.m_hHookDataArch);
-  g.m_hHookDataArch = NULL;
-}
-
-
-/// notify
-DllExport bool notify(void *i_data, size_t i_dataSize)
-{
-  COPYDATASTRUCT cd;
-#ifdef MAYU64
-  DWORD_PTR result;
-#else  // MAYU64
-  DWORD result;
-#endif // MAYU64
-
-#ifdef USE_MAILSLOT
-  DWORD len;
-  if (g.m_hMailslot != INVALID_HANDLE_VALUE)
-  {
-    BOOL ret;
-    ret = WriteFile(g.m_hMailslot, i_data, i_dataSize, &len, NULL);
-#ifndef NDEBUG
-    if (ret == 0)
-    {
-      HOOK_RPT2("MAYU: %S WriteFile to mailslot failed(0x%08x)\r\n", g.m_moduleName, GetLastError());
-    }
-    else
-    {
-      HOOK_RPT1("MAYU: %S WriteFile to mailslot successed\r\n", g.m_moduleName);
-    }
-#endif // !NDEBUG
-  }
-#else // !USE_MAILSLOT
-  cd.dwData = reinterpret_cast<Notify *>(i_data)->m_type;
-  cd.cbData = i_dataSize;
-  cd.lpData = i_data;
-  if (g.m_hwndTaskTray == 0)
-    return false;
-  if (!SendMessageTimeout(reinterpret_cast<HWND>(g.m_hwndTaskTray),
-                         WM_COPYDATA, NULL, reinterpret_cast<LPARAM>(&cd),
-                         SMTO_ABORTIFHUNG | SMTO_NORMAL, 5000, &result))
-  {
-    _RPT0(_CRT_WARN, "MAYU: SendMessageTimeout() timeouted\r\n");
-    return false;
-  }
-#endif // !USE_MAILSLOT
-  return true;
-}
-
-
-/// get class name and title name
-static void getClassNameTitleName(HWND i_hwnd, bool i_isInMenu, 
-                                 tstringi *o_className,
-                                 tstring *o_titleName)
-{
-  tstringi &className = *o_className;
-  tstring &titleName = *o_titleName;
-  
-  bool isTheFirstTime = true;
-  
-  if (i_isInMenu)
-  {
-    className = titleName = _T("MENU");
-    isTheFirstTime = false;
-  }
-
-  while (true)
-  {
-    _TCHAR buf[MAX(GANA_MAX_PATH, GANA_MAX_ATOM_LENGTH)];
-
-    // get class name
-    if (i_hwnd)
-      GetClassName(i_hwnd, buf, NUMBER_OF(buf));
-    else
-      GetModuleFileName(GetModuleHandle(NULL), buf, NUMBER_OF(buf));
-    buf[NUMBER_OF(buf) - 1] = _T('\0');
-    if (isTheFirstTime)
-      className = buf;
-    else
-      className = tstringi(buf) + _T(":") + className;
-    
-    // get title name
-    if (i_hwnd)
-    {
-      GetWindowText(i_hwnd, buf, NUMBER_OF(buf));
-      buf[NUMBER_OF(buf) - 1] = _T('\0');
-      for (_TCHAR *b = buf; *b; ++ b)
-       if (_istlead(*b) && b[1])
-         b ++;
-       else if (_istcntrl(*b))
-         *b = _T('?');
-    }
-    if (isTheFirstTime)
-      titleName = buf;
-    else
-      titleName = tstring(buf) + _T(":") + titleName;
-
-    // next loop or exit
-    if (!i_hwnd)
-      break;
-    i_hwnd = GetParent(i_hwnd);
-    isTheFirstTime = false;
-  }
-}
-
-
-/// update show
-static void updateShow(HWND i_hwnd, NotifyShow::Show i_show)
-{
-  bool isMDI = false;
-
-  if (!i_hwnd)
-    return;
-
-#ifdef MAYU64
-  LONG_PTR style = GetWindowLongPtr(i_hwnd, GWL_STYLE);
-#else
-  LONG style = GetWindowLong(i_hwnd, GWL_STYLE);
-#endif
-  if (!(style & WS_MAXIMIZEBOX) && !(style & WS_MAXIMIZEBOX))
-    return; // ignore window that has neither maximize or minimize button
-
-  if (style & WS_CHILD)
-  {
-#ifdef MAYU64
-    LONG_PTR exStyle = GetWindowLongPtr(i_hwnd, GWL_EXSTYLE);
-#else
-    LONG exStyle = GetWindowLong(i_hwnd, GWL_EXSTYLE);
-#endif
-    if (exStyle & WS_EX_MDICHILD)
-    {
-      isMDI = true;
-    }
-    else
-      return; // ignore non-MDI child window case
-  }
-
-  notifyShow(i_show, isMDI);
-}
-
-
-/// notify WM_Targetted
-static void notifyName(HWND i_hwnd, Notify::Type i_type = Notify::Type_name)
-{
-  tstringi className;
-  tstring titleName;
-  getClassNameTitleName(i_hwnd, g.m_isInMenu, &className, &titleName);
-  
-  NotifySetFocus *nfc = new NotifySetFocus;
-  nfc->m_type = i_type;
-  nfc->m_threadId = GetCurrentThreadId();
-  nfc->m_hwnd = reinterpret_cast<DWORD>(i_hwnd);
-  tcslcpy(nfc->m_className, className.c_str(), NUMBER_OF(nfc->m_className));
-  tcslcpy(nfc->m_titleName, titleName.c_str(), NUMBER_OF(nfc->m_titleName));
-
-  notify(nfc, sizeof(*nfc));
-  delete nfc;
-}
-
-
-/// notify WM_SETFOCUS
-static void notifySetFocus(bool i_doesForce = false)
-{
-  HWND hwnd = GetFocus();
-  if (i_doesForce || hwnd != g.m_hwndFocus)
-  {
-    g.m_hwndFocus = hwnd;
-    notifyName(hwnd, Notify::Type_setFocus);
-  }
-}
-
-
-/// notify sync
-static void notifySync()
-{
-  Notify n;
-  n.m_type = Notify::Type_sync;
-  notify(&n, sizeof(n));
-}
-
-
-/// notify DLL_THREAD_DETACH
-static void notifyThreadDetach()
-{
-  NotifyThreadDetach ntd;
-  ntd.m_type = Notify::Type_threadDetach;
-  ntd.m_threadId = GetCurrentThreadId();
-  notify(&ntd, sizeof(ntd));
-}
-
-
-/// notify WM_COMMAND, WM_SYSCOMMAND
-static void notifyCommand(
-  HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam)
-{
-#ifndef _WIN64
-  if (g_hookData->m_doesNotifyCommand)
-  {
-    NotifyCommand ntc;
-    ntc.m_type = Notify::Type_command;
-    ntc.m_hwnd = i_hwnd;
-    ntc.m_message = i_message;
-    ntc.m_wParam = i_wParam;
-    ntc.m_lParam = i_lParam;
-    notify(&ntc, sizeof(ntc));
-  }
-#endif
-}
-
-
-/// notify show of current window
-static void notifyShow(NotifyShow::Show i_show, bool i_isMDI)
-{
-  NotifyShow ns;
-  ns.m_type = Notify::Type_show;
-  ns.m_show = i_show;
-  ns.m_isMDI = i_isMDI;
-  notify(&ns, sizeof(ns));
-}
-
-
-/// notify log
-static void notifyLog(_TCHAR *i_msg)
-{
-  NotifyLog nl;
-  nl.m_type = Notify::Type_log;
-  tcslcpy(nl.m_msg, i_msg, NUMBER_OF(nl.m_msg));
-  notify(&nl, sizeof(nl));
-}
-
-
-/// &Recenter
-static void funcRecenter(HWND i_hwnd)
-{
-  _TCHAR buf[MAX(GANA_MAX_PATH, GANA_MAX_ATOM_LENGTH)];
-  GetClassName(i_hwnd, buf, NUMBER_OF(buf));
-  bool isEdit;
-  if (_tcsicmp(buf, _T("Edit")) == 0)
-    isEdit = true;
-  else if (_tcsnicmp(buf, _T("RichEdit"), 8) == 0)
-    isEdit = false;
-  else
-    return;    // this function only works for Edit control
-
-#ifdef MAYU64
-  LONG_PTR style = GetWindowLongPtr(i_hwnd, GWL_STYLE);
-#else
-  LONG style = GetWindowLong(i_hwnd, GWL_STYLE);
-#endif
-  if (!(style & ES_MULTILINE))
-    return;    // this function only works for multi line Edit control
-
-  RECT rc;
-  GetClientRect(i_hwnd, &rc);
-  POINTL p = { (rc.right + rc.left) / 2, (rc.top + rc.bottom) / 2 };
-  int line;
-  if (isEdit)
-  {
-    line = SendMessage(i_hwnd, EM_CHARFROMPOS, 0, MAKELPARAM(p.x, p.y));
-    line = HIWORD(line);
-  }
-  else
-  {
-    int ci = SendMessage(i_hwnd, EM_CHARFROMPOS, 0, (LPARAM)&p);
-    line = SendMessage(i_hwnd, EM_EXLINEFROMCHAR, 0, ci);
-  }
-  int caretLine = SendMessage(i_hwnd, EM_LINEFROMCHAR, -1, 0);
-  SendMessage(i_hwnd, EM_LINESCROLL, 0, caretLine - line);
-}
-
-
-// &SetImeStatus
-static void funcSetImeStatus(HWND i_hwnd, int i_status)
-{
-  HIMC hIMC;
-
-  hIMC = ImmGetContext(i_hwnd);
-  if (hIMC == INVALID_HANDLE_VALUE)
-    return;
-
-  if (i_status < 0)
-    i_status = !ImmGetOpenStatus(hIMC);
-
-  ImmSetOpenStatus(hIMC, i_status);
-  ImmReleaseContext(i_hwnd, hIMC);
-}
-
-
-// &SetImeString
-static void funcSetImeString(HWND i_hwnd, int i_size)
-{
-  _TCHAR *buf = new _TCHAR(i_size);
-  DWORD len = 0;
-  _TCHAR ImeDesc[GANA_MAX_ATOM_LENGTH];
-  UINT ImeDescLen;
-  DWORD error;
-  DWORD denom = 1;
-  HANDLE hPipe
-    = CreateFile(addSessionId(HOOK_PIPE_NAME).c_str(), GENERIC_READ,
-                FILE_SHARE_READ, (SECURITY_ATTRIBUTES *)NULL,
-                OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL);
-  error = ReadFile(hPipe, buf, i_size, &len, NULL);
-  CloseHandle(hPipe);
-
-  ImeDescLen = ImmGetDescription(GetKeyboardLayout(0),
-                                ImeDesc, sizeof(ImeDesc));
-  if (_tcsncmp(ImeDesc, _T("SKKIME"), ImeDescLen) > 0)
-    denom = sizeof(_TCHAR);
-
-  HIMC hIMC = ImmGetContext(i_hwnd);
-  if (hIMC == INVALID_HANDLE_VALUE)
-    return;
-
-  int status = ImmGetOpenStatus(hIMC);
-  ImmSetCompositionString(hIMC, SCS_SETSTR, buf, len / denom, NULL, 0);
-  delete buf;
-  ImmNotifyIME(hIMC, NI_COMPOSITIONSTR, CPS_COMPLETE, 0);
-  if (!status)
-    ImmSetOpenStatus(hIMC, status);
-  ImmReleaseContext(i_hwnd, hIMC);
-}
-
-/// notify lock state
-/*DllExport*/ void notifyLockState(int i_cause)
-{
-  NotifyLockState n;
-  n.m_type = Notify::Type_lockState;
-  n.m_isNumLockToggled = !!(GetKeyState(VK_NUMLOCK) & 1);
-  n.m_isCapsLockToggled = !!(GetKeyState(VK_CAPITAL) & 1);
-  n.m_isScrollLockToggled = !!(GetKeyState(VK_SCROLL) & 1);
-  n.m_isKanaLockToggled = !!(GetKeyState(VK_KANA) & 1);
-  n.m_isImeLockToggled = g.m_isImeLock;
-  n.m_isImeCompToggled = g.m_isImeCompositioning;
-  n.m_debugParam = i_cause;
-  notify(&n, sizeof(n));
-}
-
-DllExport void notifyLockState()
-{
-  notifyLockState(9);
-}
-
-
-/// hook of GetMessage
-LRESULT CALLBACK getMessageProc(int i_nCode, WPARAM i_wParam, LPARAM i_lParam)
-{
-  if (!g.m_isInitialized)
-    initialize();
-
-  if (!g_hookData)
-    return 0;
-  
-  MSG &msg = (*(MSG *)i_lParam);
-
-  if (i_wParam != PM_REMOVE)
-    goto finally;
-
-  switch (msg.message)
-  {
-    case WM_COMMAND:
-    case WM_SYSCOMMAND:
-      notifyCommand(msg.hwnd, msg.message, msg.wParam, msg.lParam);
-      break;
-    case WM_KEYDOWN:
-    case WM_KEYUP:
-    case WM_SYSKEYDOWN:
-    case WM_SYSKEYUP:
-    {
-      if (HIMC hIMC = ImmGetContext(msg.hwnd))
-      {
-       bool prev = g.m_isImeLock;
-       g.m_isImeLock = !!ImmGetOpenStatus(hIMC);
-       ImmReleaseContext(msg.hwnd, hIMC);
-       if (prev != g.m_isImeLock) {
-         notifyLockState(1);
-       }
-      }
-      int nVirtKey = (int)msg.wParam;
-      // int repeatCount = (msg.lParam & 0xffff);
-      BYTE scanCode   = (BYTE)((msg.lParam >> 16) & 0xff);
-      bool isExtended = !!(msg.lParam & (1 << 24));
-      // bool isAltDown  = !!(msg.lParam & (1 << 29));
-      // bool isKeyup    = !!(msg.lParam & (1 << 31));
-      
-      if (nVirtKey == VK_CAPITAL ||
-         nVirtKey == VK_NUMLOCK ||
-         nVirtKey == VK_KANA ||
-         nVirtKey == VK_SCROLL)
-       notifyLockState(2);
-      else if (scanCode == g_hookData->m_syncKey &&
-              isExtended == g_hookData->m_syncKeyIsExtended)
-       notifySync();
-      break;
-    }
-    case WM_IME_STARTCOMPOSITION:
-      g.m_isImeCompositioning = true;
-      notifyLockState(3);
-      break;
-    case WM_IME_ENDCOMPOSITION:
-      g.m_isImeCompositioning = false;
-      notifyLockState(4);
-      break;
-    default:
-      if (i_wParam == PM_REMOVE && msg.message == g.m_WM_MAYU_MESSAGE)
-      {
-       switch (msg.wParam)
-       {
-         case MayuMessage_notifyName:
-           notifyName(msg.hwnd);
-           break;
-         case MayuMessage_funcRecenter:
-           funcRecenter(msg.hwnd);
-           break;
-         case MayuMessage_funcSetImeStatus:
-           funcSetImeStatus(msg.hwnd, msg.lParam);
-           break;
-         case MayuMessage_funcSetImeString:
-           funcSetImeString(msg.hwnd, msg.lParam);
-           break;
-       }
-      }
-      break;
-  }
- finally:
-  return CallNextHookEx(s_hookDataArch->m_hHookGetMessage,
-                       i_nCode, i_wParam, i_lParam);
-}
-
-
-/// hook of SendMessage
-LRESULT CALLBACK callWndProc(int i_nCode, WPARAM i_wParam, LPARAM i_lParam)
-{
-  if (!g.m_isInitialized)
-    initialize();
-
-  if (!g_hookData)
-    return 0;
-  
-  CWPSTRUCT &cwps = *(CWPSTRUCT *)i_lParam;
-  
-  if (0 <= i_nCode)
-  {
-    switch (cwps.message)
-    {
-      case WM_ACTIVATEAPP:
-      case WM_NCACTIVATE:
-       if (i_wParam)
-         notifySetFocus();
-       break;
-      case WM_SYSCOMMAND:
-       switch (cwps.wParam)
-       {
-         case SC_MAXIMIZE:
-         case SC_MAXIMIZE2:
-           updateShow(cwps.hwnd, NotifyShow::Show_Maximized);
-           break;
-         case SC_MINIMIZE:
-         case SC_MINIMIZE2:
-           updateShow(cwps.hwnd, NotifyShow::Show_Minimized);
-           break;
-         case SC_RESTORE:
-         case SC_RESTORE2:
-           updateShow(cwps.hwnd, NotifyShow::Show_Normal);
-           break;
-         default:
-           break;
-       }
-       /* through below */
-      case WM_COMMAND:
-       notifyCommand(cwps.hwnd, cwps.message, cwps.wParam, cwps.lParam);
-       break;
-      case WM_SIZE:
-       switch (cwps.wParam)
-       {
-         case SIZE_MAXIMIZED:
-           updateShow(cwps.hwnd, NotifyShow::Show_Maximized);
-           break;
-         case SIZE_MINIMIZED:
-           updateShow(cwps.hwnd, NotifyShow::Show_Minimized);
-           break;
-         case SIZE_RESTORED:
-           updateShow(cwps.hwnd, NotifyShow::Show_Normal);
-           break;
-         default:
-           break;
-       }
-       break;
-      case WM_MOUSEACTIVATE:
-       notifySetFocus();
-       break;
-      case WM_ACTIVATE:
-       if (LOWORD(cwps.wParam) != WA_INACTIVE)
-       {
-         notifySetFocus();
-         if (HIWORD(cwps.wParam)) // check minimized flag
-         {
-           // minimized flag on
-           notifyShow(NotifyShow::Show_Minimized, false);
-           //notifyShow(NotifyShow::Show_Normal, true);
-         }
-       }
-       break;
-      case WM_ENTERMENULOOP:
-       g.m_isInMenu = true;
-       notifySetFocus(true);
-       break;
-      case WM_EXITMENULOOP:
-       g.m_isInMenu = false;
-       notifySetFocus(true);
-       break;
-      case WM_SETFOCUS:
-       g.m_isInMenu = false;
-       // for kana
-       if (g_hookData->m_correctKanaLockHandling) {
-         if (HIMC hIMC = ImmGetContext(cwps.hwnd)) {
-           bool status = !!ImmGetOpenStatus(hIMC);
-           // this code set the VK_KANA state correctly.
-           ImmSetOpenStatus(hIMC, !status);
-           ImmSetOpenStatus(hIMC, status);
-           ImmReleaseContext(cwps.hwnd, hIMC);
-         }
-       }
-       notifySetFocus();
-       notifyLockState(5);
-       break;
-      case WM_IME_STARTCOMPOSITION:
-       g.m_isImeCompositioning = true;
-       notifyLockState(6);
-       break;
-      case WM_IME_ENDCOMPOSITION:
-       g.m_isImeCompositioning = false;
-       notifyLockState(7);
-       break;
-      case WM_IME_NOTIFY:
-       if (cwps.wParam == IMN_SETOPENSTATUS)
-         if (HIMC hIMC = ImmGetContext(cwps.hwnd))
-         {
-           g.m_isImeLock = !!ImmGetOpenStatus(hIMC);
-           ImmReleaseContext(cwps.hwnd, hIMC);
-           notifyLockState(8);
-         }
-       break;
-    }
-  }
-  return CallNextHookEx(s_hookDataArch->m_hHookCallWndProc, i_nCode,
-                       i_wParam, i_lParam);
-}
-
-
-static LRESULT CALLBACK lowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
-{
-  MSLLHOOKSTRUCT *pMsll = (MSLLHOOKSTRUCT*)lParam;
-  LONG dx = pMsll->pt.x - g_hookData->m_mousePos.x;
-  LONG dy = pMsll->pt.y - g_hookData->m_mousePos.y;
-  HWND target = reinterpret_cast<HWND>(g_hookData->m_hwndMouseHookTarget);
-
-  if (!g.m_isInitialized)
-    initialize();
-
-  if (!g_hookData || nCode < 0 || wParam != WM_MOUSEMOVE)
-    goto through;
-
-  switch (g_hookData->m_mouseHookType)
-  {
-    case MouseHookType_Wheel:
-      // For this type, g_hookData->m_mouseHookParam means
-      // translate rate mouse move to wheel.
-      mouse_event(MOUSEEVENTF_WHEEL, 0, 0,
-                 g_hookData->m_mouseHookParam * dy, 0);
-      return 1;
-      break;
-    case MouseHookType_WindowMove:
-    {
-      RECT curRect;
-
-      if (!GetWindowRect(target, &curRect))
-       goto through;
-
-      // g_hookData->m_mouseHookParam < 0 means
-      // target window to move is MDI.
-      if (g_hookData->m_mouseHookParam < 0)
-      {
-       HWND parent = GetParent(target);
-       POINT p = {curRect.left, curRect.top};
-
-       if (parent == NULL || !ScreenToClient(parent, &p))
-         goto through;
-
-       curRect.left = p.x;
-       curRect.top = p.y;
-      }
-       
-      SetWindowPos(target, NULL,
-                  curRect.left + dx,
-                  curRect.top + dy,
-                  0, 0,
-                  SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE |
-                  SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
-      g_hookData->m_mousePos = pMsll->pt;
-      goto through;
-      break;
-    }
-    case MouseHookType_None:
-    default:
-      goto through;
-      break;
-  }
-    
- through:
-  return CallNextHookEx(g.m_hHookMouseProc,
-                       nCode, wParam, lParam);
-}
-
-
-#ifdef NO_DRIVER
-static LRESULT CALLBACK lowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
-{
-  KBDLLHOOKSTRUCT *pKbll = (KBDLLHOOKSTRUCT*)lParam;
-
-  if (!g.m_isInitialized)
-    initialize();
-
-  if (!g_hookData || nCode < 0)
-    goto through;
-
-  if (g.m_keyboardDetour && g.m_engine)
-  {
-    unsigned int result;
-    result = g.m_keyboardDetour(g.m_engine, pKbll);
-    if (result)
-    {
-      return 1;
-    }
-  }
- through:
-  return CallNextHookEx(g.m_hHookKeyboardProc,
-                       nCode, wParam, lParam);
-}
-#endif // NO_DRIVER
-
-
-/// install hooks
-DllExport int installHooks(KEYBOARD_DETOUR i_keyboardDetour, Engine *i_engine)
-{
-  if (!g.m_isInitialized)
-    initialize();
-
-  g.m_hwndTaskTray = g_hookData->m_hwndTaskTray;
-  s_hookDataArch->m_hHookGetMessage =
-    SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)getMessageProc,
-                    g.m_hInstDLL, 0);
-  s_hookDataArch->m_hHookCallWndProc =
-    SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)callWndProc, g.m_hInstDLL, 0);
-  g_hookData->m_mouseHookType = MouseHookType_None;
-  if (i_engine != NULL)
-  {
-#ifdef NO_DRIVER
-    g.m_keyboardDetour = i_keyboardDetour;
-    g.m_engine = i_engine;
-    g.m_hHookKeyboardProc =
-      SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)lowLevelKeyboardProc,
-                      g.m_hInstDLL, 0);
-#endif // NO_DRIVER
-    g.m_hHookMouseProc =
-      SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)lowLevelMouseProc,
-                      g.m_hInstDLL, 0);
-  }
-  return 0;
-}
-
-
-/// uninstall hooks
-DllExport int uninstallHooks()
-{
-  if (s_hookDataArch->m_hHookGetMessage)
-    UnhookWindowsHookEx(s_hookDataArch->m_hHookGetMessage);
-  s_hookDataArch->m_hHookGetMessage = NULL;
-  if (s_hookDataArch->m_hHookCallWndProc)
-    UnhookWindowsHookEx(s_hookDataArch->m_hHookCallWndProc);
-  s_hookDataArch->m_hHookCallWndProc = NULL;
-  if (g.m_hHookMouseProc)
-    UnhookWindowsHookEx(g.m_hHookMouseProc);
-  g.m_hHookMouseProc = NULL;
-#ifdef NO_DRIVER
-  if (g.m_hHookKeyboardProc)
-    UnhookWindowsHookEx(g.m_hHookKeyboardProc);
-  g.m_hHookKeyboardProc = NULL;
-#endif // NO_DRIVER
-  g.m_hwndTaskTray = 0;
-  return 0;
-}
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// hook.cpp\r
+\r
+\r
+#define _HOOK_CPP\r
+\r
+#include "misc.h"\r
+\r
+#include "hook.h"\r
+#include "stringtool.h"\r
+\r
+#include <locale.h>\r
+#include <imm.h>\r
+#include <richedit.h>\r
+\r
+\r
+///\r
+#define HOOK_DATA_NAME _T("{08D6E55C-5103-4e00-8209-A1C4AB13BBEF}") _T(VERSION)\r
+#ifdef _WIN64\r
+#define HOOK_DATA_NAME_ARCH _T("{290C0D51-8AEE-403d-9172-E43D46270996}") _T(VERSION)\r
+#else // !_WIN64\r
+#define HOOK_DATA_NAME_ARCH _T("{716A5DEB-CB02-4438-ABC8-D00E48673E45}") _T(VERSION)\r
+#endif // !_WIN64\r
+\r
+// Some applications use different values for below messages\r
+// when double click of title bar.\r
+#define SC_MAXIMIZE2 (SC_MAXIMIZE + 2)\r
+#define SC_MINIMIZE2 (SC_MINIMIZE + 2)\r
+#define SC_RESTORE2 (SC_RESTORE + 2)\r
+\r
+// Debug Macros\r
+#ifdef NDEBUG\r
+#define HOOK_RPT0(msg)\r
+#define HOOK_RPT1(msg, arg1)\r
+#define HOOK_RPT2(msg, arg1, arg2)\r
+#else\r
+#define HOOK_RPT0(msg) if (g.m_isLogging) { _RPT0(_CRT_WARN, msg); }\r
+#define HOOK_RPT1(msg, arg1) if (g.m_isLogging) { _RPT1(_CRT_WARN, msg, arg1); }\r
+#define HOOK_RPT2(msg, arg1, arg2) if (g.m_isLogging) { _RPT2(_CRT_WARN, msg, arg1, arg2); }\r
+#endif\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Global Variables\r
+\r
+\r
+DllExport HookData *g_hookData;                        ///\r
+\r
+///\r
+class HookDataArch\r
+{\r
+public:\r
+  HHOOK m_hHookGetMessage;                     ///\r
+  HHOOK m_hHookCallWndProc;                    ///\r
+};\r
+\r
+static HookDataArch *s_hookDataArch;\r
+\r
+struct Globals\r
+{\r
+  HANDLE m_hHookData;                          ///\r
+  HANDLE m_hHookDataArch;                      ///\r
+  HWND m_hwndFocus;                            /// \r
+  HINSTANCE m_hInstDLL;                                ///\r
+  bool m_isInMenu;                             ///\r
+  UINT m_WM_MAYU_MESSAGE;                      ///\r
+  bool m_isImeLock;                            ///\r
+  bool m_isImeCompositioning;                  ///\r
+  HHOOK m_hHookMouseProc;                      ///\r
+#ifdef NO_DRIVER\r
+  HHOOK m_hHookKeyboardProc;                   ///\r
+  KEYBOARD_DETOUR m_keyboardDetour;\r
+  Engine *m_engine;\r
+#endif // NO_DRIVER\r
+  DWORD m_hwndTaskTray;                                ///\r
+  HANDLE m_hMailslot;\r
+  bool m_isInitialized;\r
+#ifndef NDEBUG\r
+  bool m_isLogging;\r
+  _TCHAR m_moduleName[GANA_MAX_PATH];\r
+#endif // !NDEBUG\r
+};\r
+\r
+static Globals g;\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Prototypes\r
+\r
+\r
+static void notifyThreadDetach();\r
+static void notifyShow(NotifyShow::Show i_show, bool i_isMDI);\r
+static void notifyLog(_TCHAR *i_msg);\r
+static bool mapHookData();\r
+static void unmapHookData();\r
+static bool initialize();\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Functions\r
+\r
+bool initialize()\r
+{\r
+#ifndef NDEBUG\r
+  _TCHAR path[GANA_MAX_PATH];\r
+  GetModuleFileName(NULL, path, GANA_MAX_PATH);\r
+  _tsplitpath_s(path, NULL, 0, NULL, 0, g.m_moduleName, GANA_MAX_PATH, NULL, 0);\r
+  if (_tcsncmp(g.m_moduleName, _T("Dbgview"), sizeof(_T("Dbgview"))/sizeof(_TCHAR)) != 0 &&\r
+      _tcsncmp(g.m_moduleName, _T("windbg"), sizeof(_T("windbg"))/sizeof(_TCHAR)) != 0)\r
+  {\r
+       g.m_isLogging = true;\r
+  }\r
+#endif // !NDEBUG\r
+#ifdef USE_MAILSLOT\r
+  g.m_hMailslot =\r
+         CreateFile(NOTIFY_MAILSLOT_NAME, GENERIC_WRITE,\r
+                    FILE_SHARE_READ | FILE_SHARE_WRITE,\r
+                    (SECURITY_ATTRIBUTES *)NULL, OPEN_EXISTING,\r
+                    FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL);\r
+  if (g.m_hMailslot == INVALID_HANDLE_VALUE)\r
+  {\r
+    HOOK_RPT2("MAYU: %S create mailslot failed(0x%08x)\r\n", g.m_moduleName, GetLastError());\r
+  }\r
+  else\r
+  {\r
+    HOOK_RPT1("MAYU: %S create mailslot successed\r\n", g.m_moduleName);\r
+  }\r
+#endif //USE_MAILSLOT\r
+  if (!mapHookData())\r
+    return false;\r
+  _tsetlocale(LC_ALL, _T(""));\r
+  g.m_WM_MAYU_MESSAGE =\r
+    RegisterWindowMessage(addSessionId(WM_MAYU_MESSAGE_NAME).c_str());\r
+  g.m_hwndTaskTray = g_hookData->m_hwndTaskTray;\r
+  g.m_isInitialized = true;\r
+  return true;\r
+}\r
+\r
+/// EntryPoint\r
+BOOL WINAPI DllMain(HINSTANCE i_hInstDLL, DWORD i_fdwReason,\r
+                   LPVOID /* i_lpvReserved */)\r
+{\r
+  switch (i_fdwReason)\r
+  {\r
+    case DLL_PROCESS_ATTACH:\r
+    {\r
+#ifndef NDEBUG\r
+      g.m_isLogging = false;\r
+#endif // !NDEBUG\r
+      g.m_isInitialized = false;\r
+      g.m_hInstDLL = i_hInstDLL;\r
+      break;\r
+    }\r
+    case DLL_THREAD_ATTACH:\r
+      break;\r
+    case DLL_PROCESS_DETACH:\r
+      notifyThreadDetach();\r
+      unmapHookData();\r
+#ifdef USE_MAILSLOT\r
+      if (g.m_hMailslot != INVALID_HANDLE_VALUE)\r
+      {\r
+       CloseHandle(g.m_hMailslot);\r
+       g.m_hMailslot = INVALID_HANDLE_VALUE;\r
+      }\r
+#endif //USE_MAILSLOT\r
+      break;\r
+    case DLL_THREAD_DETACH:\r
+      notifyThreadDetach();\r
+      break;\r
+    default:\r
+      break;\r
+  }\r
+  return TRUE;\r
+}\r
+\r
+\r
+/// map hook data\r
+static bool mapHookData()\r
+{\r
+  g.m_hHookData = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,\r
+                                   0, sizeof(HookData),\r
+                                   addSessionId(HOOK_DATA_NAME).c_str());\r
+  if (!g.m_hHookData)\r
+  {\r
+    unmapHookData();\r
+    return false;\r
+  }\r
+  \r
+  g_hookData =\r
+    (HookData *)MapViewOfFile(g.m_hHookData, FILE_MAP_READ | FILE_MAP_WRITE,\r
+                             0, 0, sizeof(HookData));\r
+  if (!g_hookData)\r
+  {\r
+    unmapHookData();\r
+    return false;\r
+  }\r
+\r
+  g.m_hHookDataArch = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,\r
+                                   0, sizeof(HookDataArch),\r
+                                   addSessionId(HOOK_DATA_NAME_ARCH).c_str());\r
+  if (!g.m_hHookDataArch)\r
+  {\r
+    unmapHookData();\r
+    return false;\r
+  }\r
+  \r
+  s_hookDataArch =\r
+    (HookDataArch *)MapViewOfFile(g.m_hHookDataArch, FILE_MAP_READ | FILE_MAP_WRITE,\r
+                             0, 0, sizeof(HookDataArch));\r
+  if (!s_hookDataArch)\r
+  {\r
+    unmapHookData();\r
+    return false;\r
+  }\r
+\r
+  return true;\r
+}\r
+\r
+\r
+/// unmap hook data\r
+static void unmapHookData()\r
+{\r
+  if (g_hookData)\r
+    UnmapViewOfFile(g_hookData);\r
+  g_hookData = NULL;\r
+  if (g.m_hHookData)\r
+    CloseHandle(g.m_hHookData);\r
+  g.m_hHookData = NULL;\r
+  if (s_hookDataArch)\r
+    UnmapViewOfFile(s_hookDataArch);\r
+  s_hookDataArch = NULL;\r
+  if (g.m_hHookDataArch)\r
+    CloseHandle(g.m_hHookDataArch);\r
+  g.m_hHookDataArch = NULL;\r
+}\r
+\r
+\r
+/// notify\r
+DllExport bool notify(void *i_data, size_t i_dataSize)\r
+{\r
+  COPYDATASTRUCT cd;\r
+#ifdef MAYU64\r
+  DWORD_PTR result;\r
+#else  // MAYU64\r
+  DWORD result;\r
+#endif // MAYU64\r
+\r
+#ifdef USE_MAILSLOT\r
+  DWORD len;\r
+  if (g.m_hMailslot != INVALID_HANDLE_VALUE)\r
+  {\r
+    BOOL ret;\r
+    ret = WriteFile(g.m_hMailslot, i_data, i_dataSize, &len, NULL);\r
+#ifndef NDEBUG\r
+    if (ret == 0)\r
+    {\r
+      HOOK_RPT2("MAYU: %S WriteFile to mailslot failed(0x%08x)\r\n", g.m_moduleName, GetLastError());\r
+    }\r
+    else\r
+    {\r
+      HOOK_RPT1("MAYU: %S WriteFile to mailslot successed\r\n", g.m_moduleName);\r
+    }\r
+#endif // !NDEBUG\r
+  }\r
+#else // !USE_MAILSLOT\r
+  cd.dwData = reinterpret_cast<Notify *>(i_data)->m_type;\r
+  cd.cbData = i_dataSize;\r
+  cd.lpData = i_data;\r
+  if (g.m_hwndTaskTray == 0)\r
+    return false;\r
+  if (!SendMessageTimeout(reinterpret_cast<HWND>(g.m_hwndTaskTray),\r
+                         WM_COPYDATA, NULL, reinterpret_cast<LPARAM>(&cd),\r
+                         SMTO_ABORTIFHUNG | SMTO_NORMAL, 5000, &result))\r
+  {\r
+    _RPT0(_CRT_WARN, "MAYU: SendMessageTimeout() timeouted\r\n");\r
+    return false;\r
+  }\r
+#endif // !USE_MAILSLOT\r
+  return true;\r
+}\r
+\r
+\r
+/// get class name and title name\r
+static void getClassNameTitleName(HWND i_hwnd, bool i_isInMenu, \r
+                                 tstringi *o_className,\r
+                                 tstring *o_titleName)\r
+{\r
+  tstringi &className = *o_className;\r
+  tstring &titleName = *o_titleName;\r
+  \r
+  bool isTheFirstTime = true;\r
+  \r
+  if (i_isInMenu)\r
+  {\r
+    className = titleName = _T("MENU");\r
+    isTheFirstTime = false;\r
+  }\r
+\r
+  while (true)\r
+  {\r
+    _TCHAR buf[MAX(GANA_MAX_PATH, GANA_MAX_ATOM_LENGTH)];\r
+\r
+    // get class name\r
+    if (i_hwnd)\r
+      GetClassName(i_hwnd, buf, NUMBER_OF(buf));\r
+    else\r
+      GetModuleFileName(GetModuleHandle(NULL), buf, NUMBER_OF(buf));\r
+    buf[NUMBER_OF(buf) - 1] = _T('\0');\r
+    if (isTheFirstTime)\r
+      className = buf;\r
+    else\r
+      className = tstringi(buf) + _T(":") + className;\r
+    \r
+    // get title name\r
+    if (i_hwnd)\r
+    {\r
+      GetWindowText(i_hwnd, buf, NUMBER_OF(buf));\r
+      buf[NUMBER_OF(buf) - 1] = _T('\0');\r
+      for (_TCHAR *b = buf; *b; ++ b)\r
+       if (_istlead(*b) && b[1])\r
+         b ++;\r
+       else if (_istcntrl(*b))\r
+         *b = _T('?');\r
+    }\r
+    if (isTheFirstTime)\r
+      titleName = buf;\r
+    else\r
+      titleName = tstring(buf) + _T(":") + titleName;\r
+\r
+    // next loop or exit\r
+    if (!i_hwnd)\r
+      break;\r
+    i_hwnd = GetParent(i_hwnd);\r
+    isTheFirstTime = false;\r
+  }\r
+}\r
+\r
+\r
+/// update show\r
+static void updateShow(HWND i_hwnd, NotifyShow::Show i_show)\r
+{\r
+  bool isMDI = false;\r
+\r
+  if (!i_hwnd)\r
+    return;\r
+\r
+#ifdef MAYU64\r
+  LONG_PTR style = GetWindowLongPtr(i_hwnd, GWL_STYLE);\r
+#else\r
+  LONG style = GetWindowLong(i_hwnd, GWL_STYLE);\r
+#endif\r
+  if (!(style & WS_MAXIMIZEBOX) && !(style & WS_MAXIMIZEBOX))\r
+    return; // ignore window that has neither maximize or minimize button\r
+\r
+  if (style & WS_CHILD)\r
+  {\r
+#ifdef MAYU64\r
+    LONG_PTR exStyle = GetWindowLongPtr(i_hwnd, GWL_EXSTYLE);\r
+#else\r
+    LONG exStyle = GetWindowLong(i_hwnd, GWL_EXSTYLE);\r
+#endif\r
+    if (exStyle & WS_EX_MDICHILD)\r
+    {\r
+      isMDI = true;\r
+    }\r
+    else\r
+      return; // ignore non-MDI child window case\r
+  }\r
+\r
+  notifyShow(i_show, isMDI);\r
+}\r
+\r
+\r
+/// notify WM_Targetted\r
+static void notifyName(HWND i_hwnd, Notify::Type i_type = Notify::Type_name)\r
+{\r
+  tstringi className;\r
+  tstring titleName;\r
+  getClassNameTitleName(i_hwnd, g.m_isInMenu, &className, &titleName);\r
+  \r
+  NotifySetFocus *nfc = new NotifySetFocus;\r
+  nfc->m_type = i_type;\r
+  nfc->m_threadId = GetCurrentThreadId();\r
+  nfc->m_hwnd = reinterpret_cast<DWORD>(i_hwnd);\r
+  tcslcpy(nfc->m_className, className.c_str(), NUMBER_OF(nfc->m_className));\r
+  tcslcpy(nfc->m_titleName, titleName.c_str(), NUMBER_OF(nfc->m_titleName));\r
+\r
+  notify(nfc, sizeof(*nfc));\r
+  delete nfc;\r
+}\r
+\r
+\r
+/// notify WM_SETFOCUS\r
+static void notifySetFocus(bool i_doesForce = false)\r
+{\r
+  HWND hwnd = GetFocus();\r
+  if (i_doesForce || hwnd != g.m_hwndFocus)\r
+  {\r
+    g.m_hwndFocus = hwnd;\r
+    notifyName(hwnd, Notify::Type_setFocus);\r
+  }\r
+}\r
+\r
+\r
+/// notify sync\r
+static void notifySync()\r
+{\r
+  Notify n;\r
+  n.m_type = Notify::Type_sync;\r
+  notify(&n, sizeof(n));\r
+}\r
+\r
+\r
+/// notify DLL_THREAD_DETACH\r
+static void notifyThreadDetach()\r
+{\r
+  NotifyThreadDetach ntd;\r
+  ntd.m_type = Notify::Type_threadDetach;\r
+  ntd.m_threadId = GetCurrentThreadId();\r
+  notify(&ntd, sizeof(ntd));\r
+}\r
+\r
+\r
+/// notify WM_COMMAND, WM_SYSCOMMAND\r
+static void notifyCommand(\r
+  HWND i_hwnd, UINT i_message, WPARAM i_wParam, LPARAM i_lParam)\r
+{\r
+#ifndef _WIN64\r
+  if (g_hookData->m_doesNotifyCommand)\r
+  {\r
+    NotifyCommand ntc;\r
+    ntc.m_type = Notify::Type_command;\r
+    ntc.m_hwnd = i_hwnd;\r
+    ntc.m_message = i_message;\r
+    ntc.m_wParam = i_wParam;\r
+    ntc.m_lParam = i_lParam;\r
+    notify(&ntc, sizeof(ntc));\r
+  }\r
+#endif\r
+}\r
+\r
+\r
+/// notify show of current window\r
+static void notifyShow(NotifyShow::Show i_show, bool i_isMDI)\r
+{\r
+  NotifyShow ns;\r
+  ns.m_type = Notify::Type_show;\r
+  ns.m_show = i_show;\r
+  ns.m_isMDI = i_isMDI;\r
+  notify(&ns, sizeof(ns));\r
+}\r
+\r
+\r
+/// notify log\r
+static void notifyLog(_TCHAR *i_msg)\r
+{\r
+  NotifyLog nl;\r
+  nl.m_type = Notify::Type_log;\r
+  tcslcpy(nl.m_msg, i_msg, NUMBER_OF(nl.m_msg));\r
+  notify(&nl, sizeof(nl));\r
+}\r
+\r
+\r
+/// &Recenter\r
+static void funcRecenter(HWND i_hwnd)\r
+{\r
+  _TCHAR buf[MAX(GANA_MAX_PATH, GANA_MAX_ATOM_LENGTH)];\r
+  GetClassName(i_hwnd, buf, NUMBER_OF(buf));\r
+  bool isEdit;\r
+  if (_tcsicmp(buf, _T("Edit")) == 0)\r
+    isEdit = true;\r
+  else if (_tcsnicmp(buf, _T("RichEdit"), 8) == 0)\r
+    isEdit = false;\r
+  else\r
+    return;    // this function only works for Edit control\r
+\r
+#ifdef MAYU64\r
+  LONG_PTR style = GetWindowLongPtr(i_hwnd, GWL_STYLE);\r
+#else\r
+  LONG style = GetWindowLong(i_hwnd, GWL_STYLE);\r
+#endif\r
+  if (!(style & ES_MULTILINE))\r
+    return;    // this function only works for multi line Edit control\r
+\r
+  RECT rc;\r
+  GetClientRect(i_hwnd, &rc);\r
+  POINTL p = { (rc.right + rc.left) / 2, (rc.top + rc.bottom) / 2 };\r
+  int line;\r
+  if (isEdit)\r
+  {\r
+    line = SendMessage(i_hwnd, EM_CHARFROMPOS, 0, MAKELPARAM(p.x, p.y));\r
+    line = HIWORD(line);\r
+  }\r
+  else\r
+  {\r
+    int ci = SendMessage(i_hwnd, EM_CHARFROMPOS, 0, (LPARAM)&p);\r
+    line = SendMessage(i_hwnd, EM_EXLINEFROMCHAR, 0, ci);\r
+  }\r
+  int caretLine = SendMessage(i_hwnd, EM_LINEFROMCHAR, -1, 0);\r
+  SendMessage(i_hwnd, EM_LINESCROLL, 0, caretLine - line);\r
+}\r
+\r
+\r
+// &SetImeStatus\r
+static void funcSetImeStatus(HWND i_hwnd, int i_status)\r
+{\r
+  HIMC hIMC;\r
+\r
+  hIMC = ImmGetContext(i_hwnd);\r
+  if (hIMC == INVALID_HANDLE_VALUE)\r
+    return;\r
+\r
+  if (i_status < 0)\r
+    i_status = !ImmGetOpenStatus(hIMC);\r
+\r
+  ImmSetOpenStatus(hIMC, i_status);\r
+  ImmReleaseContext(i_hwnd, hIMC);\r
+}\r
+\r
+\r
+// &SetImeString\r
+static void funcSetImeString(HWND i_hwnd, int i_size)\r
+{\r
+  _TCHAR *buf = new _TCHAR(i_size);\r
+  DWORD len = 0;\r
+  _TCHAR ImeDesc[GANA_MAX_ATOM_LENGTH];\r
+  UINT ImeDescLen;\r
+  DWORD error;\r
+  DWORD denom = 1;\r
+  HANDLE hPipe\r
+    = CreateFile(addSessionId(HOOK_PIPE_NAME).c_str(), GENERIC_READ,\r
+                FILE_SHARE_READ, (SECURITY_ATTRIBUTES *)NULL,\r
+                OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL);\r
+  error = ReadFile(hPipe, buf, i_size, &len, NULL);\r
+  CloseHandle(hPipe);\r
+\r
+  ImeDescLen = ImmGetDescription(GetKeyboardLayout(0),\r
+                                ImeDesc, sizeof(ImeDesc));\r
+  if (_tcsncmp(ImeDesc, _T("SKKIME"), ImeDescLen) > 0)\r
+    denom = sizeof(_TCHAR);\r
+\r
+  HIMC hIMC = ImmGetContext(i_hwnd);\r
+  if (hIMC == INVALID_HANDLE_VALUE)\r
+    return;\r
+\r
+  int status = ImmGetOpenStatus(hIMC);\r
+  ImmSetCompositionString(hIMC, SCS_SETSTR, buf, len / denom, NULL, 0);\r
+  delete buf;\r
+  ImmNotifyIME(hIMC, NI_COMPOSITIONSTR, CPS_COMPLETE, 0);\r
+  if (!status)\r
+    ImmSetOpenStatus(hIMC, status);\r
+  ImmReleaseContext(i_hwnd, hIMC);\r
+}\r
+\r
+/// notify lock state\r
+/*DllExport*/ void notifyLockState(int i_cause)\r
+{\r
+  NotifyLockState n;\r
+  n.m_type = Notify::Type_lockState;\r
+  n.m_isNumLockToggled = !!(GetKeyState(VK_NUMLOCK) & 1);\r
+  n.m_isCapsLockToggled = !!(GetKeyState(VK_CAPITAL) & 1);\r
+  n.m_isScrollLockToggled = !!(GetKeyState(VK_SCROLL) & 1);\r
+  n.m_isKanaLockToggled = !!(GetKeyState(VK_KANA) & 1);\r
+  n.m_isImeLockToggled = g.m_isImeLock;\r
+  n.m_isImeCompToggled = g.m_isImeCompositioning;\r
+  n.m_debugParam = i_cause;\r
+  notify(&n, sizeof(n));\r
+}\r
+\r
+DllExport void notifyLockState()\r
+{\r
+  notifyLockState(9);\r
+}\r
+\r
+\r
+/// hook of GetMessage\r
+LRESULT CALLBACK getMessageProc(int i_nCode, WPARAM i_wParam, LPARAM i_lParam)\r
+{\r
+  if (!g.m_isInitialized)\r
+    initialize();\r
+\r
+  if (!g_hookData)\r
+    return 0;\r
+  \r
+  MSG &msg = (*(MSG *)i_lParam);\r
+\r
+  if (i_wParam != PM_REMOVE)\r
+    goto finally;\r
+\r
+  switch (msg.message)\r
+  {\r
+    case WM_COMMAND:\r
+    case WM_SYSCOMMAND:\r
+      notifyCommand(msg.hwnd, msg.message, msg.wParam, msg.lParam);\r
+      break;\r
+    case WM_KEYDOWN:\r
+    case WM_KEYUP:\r
+    case WM_SYSKEYDOWN:\r
+    case WM_SYSKEYUP:\r
+    {\r
+      if (HIMC hIMC = ImmGetContext(msg.hwnd))\r
+      {\r
+       bool prev = g.m_isImeLock;\r
+       g.m_isImeLock = !!ImmGetOpenStatus(hIMC);\r
+       ImmReleaseContext(msg.hwnd, hIMC);\r
+       if (prev != g.m_isImeLock) {\r
+         notifyLockState(1);\r
+       }\r
+      }\r
+      int nVirtKey = (int)msg.wParam;\r
+      // int repeatCount = (msg.lParam & 0xffff);\r
+      BYTE scanCode   = (BYTE)((msg.lParam >> 16) & 0xff);\r
+      bool isExtended = !!(msg.lParam & (1 << 24));\r
+      // bool isAltDown  = !!(msg.lParam & (1 << 29));\r
+      // bool isKeyup    = !!(msg.lParam & (1 << 31));\r
+      \r
+      if (nVirtKey == VK_CAPITAL ||\r
+         nVirtKey == VK_NUMLOCK ||\r
+         nVirtKey == VK_KANA ||\r
+         nVirtKey == VK_SCROLL)\r
+       notifyLockState(2);\r
+      else if (scanCode == g_hookData->m_syncKey &&\r
+              isExtended == g_hookData->m_syncKeyIsExtended)\r
+       notifySync();\r
+      break;\r
+    }\r
+    case WM_IME_STARTCOMPOSITION:\r
+      g.m_isImeCompositioning = true;\r
+      notifyLockState(3);\r
+      break;\r
+    case WM_IME_ENDCOMPOSITION:\r
+      g.m_isImeCompositioning = false;\r
+      notifyLockState(4);\r
+      break;\r
+    default:\r
+      if (i_wParam == PM_REMOVE && msg.message == g.m_WM_MAYU_MESSAGE)\r
+      {\r
+       switch (msg.wParam)\r
+       {\r
+         case MayuMessage_notifyName:\r
+           notifyName(msg.hwnd);\r
+           break;\r
+         case MayuMessage_funcRecenter:\r
+           funcRecenter(msg.hwnd);\r
+           break;\r
+         case MayuMessage_funcSetImeStatus:\r
+           funcSetImeStatus(msg.hwnd, msg.lParam);\r
+           break;\r
+         case MayuMessage_funcSetImeString:\r
+           funcSetImeString(msg.hwnd, msg.lParam);\r
+           break;\r
+       }\r
+      }\r
+      break;\r
+  }\r
+ finally:\r
+  return CallNextHookEx(s_hookDataArch->m_hHookGetMessage,\r
+                       i_nCode, i_wParam, i_lParam);\r
+}\r
+\r
+\r
+/// hook of SendMessage\r
+LRESULT CALLBACK callWndProc(int i_nCode, WPARAM i_wParam, LPARAM i_lParam)\r
+{\r
+  if (!g.m_isInitialized)\r
+    initialize();\r
+\r
+  if (!g_hookData)\r
+    return 0;\r
+  \r
+  CWPSTRUCT &cwps = *(CWPSTRUCT *)i_lParam;\r
+  \r
+  if (0 <= i_nCode)\r
+  {\r
+    switch (cwps.message)\r
+    {\r
+      case WM_ACTIVATEAPP:\r
+      case WM_NCACTIVATE:\r
+       if (i_wParam)\r
+         notifySetFocus();\r
+       break;\r
+      case WM_SYSCOMMAND:\r
+       switch (cwps.wParam)\r
+       {\r
+         case SC_MAXIMIZE:\r
+         case SC_MAXIMIZE2:\r
+           updateShow(cwps.hwnd, NotifyShow::Show_Maximized);\r
+           break;\r
+         case SC_MINIMIZE:\r
+         case SC_MINIMIZE2:\r
+           updateShow(cwps.hwnd, NotifyShow::Show_Minimized);\r
+           break;\r
+         case SC_RESTORE:\r
+         case SC_RESTORE2:\r
+           updateShow(cwps.hwnd, NotifyShow::Show_Normal);\r
+           break;\r
+         default:\r
+           break;\r
+       }\r
+       /* through below */\r
+      case WM_COMMAND:\r
+       notifyCommand(cwps.hwnd, cwps.message, cwps.wParam, cwps.lParam);\r
+       break;\r
+      case WM_SIZE:\r
+       switch (cwps.wParam)\r
+       {\r
+         case SIZE_MAXIMIZED:\r
+           updateShow(cwps.hwnd, NotifyShow::Show_Maximized);\r
+           break;\r
+         case SIZE_MINIMIZED:\r
+           updateShow(cwps.hwnd, NotifyShow::Show_Minimized);\r
+           break;\r
+         case SIZE_RESTORED:\r
+           updateShow(cwps.hwnd, NotifyShow::Show_Normal);\r
+           break;\r
+         default:\r
+           break;\r
+       }\r
+       break;\r
+      case WM_MOUSEACTIVATE:\r
+       notifySetFocus();\r
+       break;\r
+      case WM_ACTIVATE:\r
+       if (LOWORD(cwps.wParam) != WA_INACTIVE)\r
+       {\r
+         notifySetFocus();\r
+         if (HIWORD(cwps.wParam)) // check minimized flag\r
+         {\r
+           // minimized flag on\r
+           notifyShow(NotifyShow::Show_Minimized, false);\r
+           //notifyShow(NotifyShow::Show_Normal, true);\r
+         }\r
+       }\r
+       break;\r
+      case WM_ENTERMENULOOP:\r
+       g.m_isInMenu = true;\r
+       notifySetFocus(true);\r
+       break;\r
+      case WM_EXITMENULOOP:\r
+       g.m_isInMenu = false;\r
+       notifySetFocus(true);\r
+       break;\r
+      case WM_SETFOCUS:\r
+       g.m_isInMenu = false;\r
+       // for kana\r
+       if (g_hookData->m_correctKanaLockHandling) {\r
+         if (HIMC hIMC = ImmGetContext(cwps.hwnd)) {\r
+           bool status = !!ImmGetOpenStatus(hIMC);\r
+           // this code set the VK_KANA state correctly.\r
+           ImmSetOpenStatus(hIMC, !status);\r
+           ImmSetOpenStatus(hIMC, status);\r
+           ImmReleaseContext(cwps.hwnd, hIMC);\r
+         }\r
+       }\r
+       notifySetFocus();\r
+       notifyLockState(5);\r
+       break;\r
+      case WM_IME_STARTCOMPOSITION:\r
+       g.m_isImeCompositioning = true;\r
+       notifyLockState(6);\r
+       break;\r
+      case WM_IME_ENDCOMPOSITION:\r
+       g.m_isImeCompositioning = false;\r
+       notifyLockState(7);\r
+       break;\r
+      case WM_IME_NOTIFY:\r
+       if (cwps.wParam == IMN_SETOPENSTATUS)\r
+         if (HIMC hIMC = ImmGetContext(cwps.hwnd))\r
+         {\r
+           g.m_isImeLock = !!ImmGetOpenStatus(hIMC);\r
+           ImmReleaseContext(cwps.hwnd, hIMC);\r
+           notifyLockState(8);\r
+         }\r
+       break;\r
+    }\r
+  }\r
+  return CallNextHookEx(s_hookDataArch->m_hHookCallWndProc, i_nCode,\r
+                       i_wParam, i_lParam);\r
+}\r
+\r
+\r
+static LRESULT CALLBACK lowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)\r
+{\r
+  MSLLHOOKSTRUCT *pMsll = (MSLLHOOKSTRUCT*)lParam;\r
+  LONG dx = pMsll->pt.x - g_hookData->m_mousePos.x;\r
+  LONG dy = pMsll->pt.y - g_hookData->m_mousePos.y;\r
+  HWND target = reinterpret_cast<HWND>(g_hookData->m_hwndMouseHookTarget);\r
+\r
+  if (!g.m_isInitialized)\r
+    initialize();\r
+\r
+  if (!g_hookData || nCode < 0 || wParam != WM_MOUSEMOVE)\r
+    goto through;\r
+\r
+  switch (g_hookData->m_mouseHookType)\r
+  {\r
+    case MouseHookType_Wheel:\r
+      // For this type, g_hookData->m_mouseHookParam means\r
+      // translate rate mouse move to wheel.\r
+      mouse_event(MOUSEEVENTF_WHEEL, 0, 0,\r
+                 g_hookData->m_mouseHookParam * dy, 0);\r
+      return 1;\r
+      break;\r
+    case MouseHookType_WindowMove:\r
+    {\r
+      RECT curRect;\r
+\r
+      if (!GetWindowRect(target, &curRect))\r
+       goto through;\r
+\r
+      // g_hookData->m_mouseHookParam < 0 means\r
+      // target window to move is MDI.\r
+      if (g_hookData->m_mouseHookParam < 0)\r
+      {\r
+       HWND parent = GetParent(target);\r
+       POINT p = {curRect.left, curRect.top};\r
+\r
+       if (parent == NULL || !ScreenToClient(parent, &p))\r
+         goto through;\r
+\r
+       curRect.left = p.x;\r
+       curRect.top = p.y;\r
+      }\r
+       \r
+      SetWindowPos(target, NULL,\r
+                  curRect.left + dx,\r
+                  curRect.top + dy,\r
+                  0, 0,\r
+                  SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE |\r
+                  SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);\r
+      g_hookData->m_mousePos = pMsll->pt;\r
+      goto through;\r
+      break;\r
+    }\r
+    case MouseHookType_None:\r
+    default:\r
+      goto through;\r
+      break;\r
+  }\r
+    \r
+ through:\r
+  return CallNextHookEx(g.m_hHookMouseProc,\r
+                       nCode, wParam, lParam);\r
+}\r
+\r
+\r
+#ifdef NO_DRIVER\r
+static LRESULT CALLBACK lowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)\r
+{\r
+  KBDLLHOOKSTRUCT *pKbll = (KBDLLHOOKSTRUCT*)lParam;\r
+\r
+  if (!g.m_isInitialized)\r
+    initialize();\r
+\r
+  if (!g_hookData || nCode < 0)\r
+    goto through;\r
+\r
+  if (g.m_keyboardDetour && g.m_engine)\r
+  {\r
+    unsigned int result;\r
+    result = g.m_keyboardDetour(g.m_engine, pKbll);\r
+    if (result)\r
+    {\r
+      return 1;\r
+    }\r
+  }\r
+ through:\r
+  return CallNextHookEx(g.m_hHookKeyboardProc,\r
+                       nCode, wParam, lParam);\r
+}\r
+#endif // NO_DRIVER\r
+\r
+\r
+/// install hooks\r
+DllExport int installHooks(KEYBOARD_DETOUR i_keyboardDetour, Engine *i_engine)\r
+{\r
+  if (!g.m_isInitialized)\r
+    initialize();\r
+\r
+  g.m_hwndTaskTray = g_hookData->m_hwndTaskTray;\r
+  s_hookDataArch->m_hHookGetMessage =\r
+    SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)getMessageProc,\r
+                    g.m_hInstDLL, 0);\r
+  s_hookDataArch->m_hHookCallWndProc =\r
+    SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)callWndProc, g.m_hInstDLL, 0);\r
+  g_hookData->m_mouseHookType = MouseHookType_None;\r
+  if (i_engine != NULL)\r
+  {\r
+#ifdef NO_DRIVER\r
+    g.m_keyboardDetour = i_keyboardDetour;\r
+    g.m_engine = i_engine;\r
+    g.m_hHookKeyboardProc =\r
+      SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)lowLevelKeyboardProc,\r
+                      g.m_hInstDLL, 0);\r
+#endif // NO_DRIVER\r
+    g.m_hHookMouseProc =\r
+      SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)lowLevelMouseProc,\r
+                      g.m_hInstDLL, 0);\r
+  }\r
+  return 0;\r
+}\r
+\r
+\r
+/// uninstall hooks\r
+DllExport int uninstallHooks()\r
+{\r
+  if (s_hookDataArch->m_hHookGetMessage)\r
+    UnhookWindowsHookEx(s_hookDataArch->m_hHookGetMessage);\r
+  s_hookDataArch->m_hHookGetMessage = NULL;\r
+  if (s_hookDataArch->m_hHookCallWndProc)\r
+    UnhookWindowsHookEx(s_hookDataArch->m_hHookCallWndProc);\r
+  s_hookDataArch->m_hHookCallWndProc = NULL;\r
+  if (g.m_hHookMouseProc)\r
+    UnhookWindowsHookEx(g.m_hHookMouseProc);\r
+  g.m_hHookMouseProc = NULL;\r
+#ifdef NO_DRIVER\r
+  if (g.m_hHookKeyboardProc)\r
+    UnhookWindowsHookEx(g.m_hHookKeyboardProc);\r
+  g.m_hHookKeyboardProc = NULL;\r
+#endif // NO_DRIVER\r
+  g.m_hwndTaskTray = 0;\r
+  return 0;\r
+}\r
diff --git a/hook.h b/hook.h
index fcddd01..a3e1401 100644 (file)
--- a/hook.h
+++ b/hook.h
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// hook.h
-
-
-#ifndef _HOOK_H
-#  define _HOOK_H
-
-#  include "misc.h"
-#  include <tchar.h>
-#ifdef NO_DRIVER
-#  include <windows.h>
-#endif // NO_DRIVER
-
-///
-#  define HOOK_PIPE_NAME \
- _T("\\\\.\\pipe\\GANAware\\mayu\\{4B22D464-7A4E-494b-982A-C2B2BBAAF9F3}") _T(VERSION)
-///
-#ifdef USE_MAILSLOT
-#  define NOTIFY_MAILSLOT_NAME \
-_T("\\\\.\\mailslot\\GANAware\\mayu\\{330F7914-EB5B-49be-ACCE-D2B8DF585B32}") _T(VERSION)
-///
-#endif // USE_MAILSLOT
-#  define WM_MAYU_MESSAGE_NAME _T("GANAware\\mayu\\WM_MAYU_MESSAGE")
-
-///
-enum MayuMessage
-{
-  MayuMessage_notifyName,
-  MayuMessage_funcRecenter,
-  MayuMessage_funcSetImeStatus,
-  MayuMessage_funcSetImeString,
-};
-
-
-///
-struct Notify
-{
-  ///
-  enum Type
-  {
-    Type_setFocus,                             /// NotifySetFocus
-    Type_name,                                 /// NotifySetFocus
-    Type_lockState,                            /// NotifyLockState
-    Type_sync,                                 /// Notify
-    Type_threadDetach,                         /// NotifyThreadDetach
-    Type_command,                              /// NotifyThreadDetach
-    Type_show,                                 /// NotifyShow
-    Type_log,                                  /// NotifyLog
-  };
-  Type m_type;                                 ///
-  DWORD m_debugParam;                          /// (for debug)
-};
-
-
-///
-struct NotifySetFocus : public Notify
-{
-  DWORD m_threadId;                            ///
-  DWORD m_hwnd;                                ///
-  _TCHAR m_className[GANA_MAX_PATH];           ///
-  _TCHAR m_titleName[GANA_MAX_PATH];           ///
-};
-
-
-///
-struct NotifyLockState : public Notify
-{
-  bool m_isNumLockToggled;                     ///
-  bool m_isCapsLockToggled;                    ///
-  bool m_isScrollLockToggled;                  ///
-  bool m_isKanaLockToggled;                    ///
-  bool m_isImeLockToggled;                     ///
-  bool m_isImeCompToggled;                     ///
-};
-
-
-///
-struct NotifyThreadDetach : public Notify
-{
-  DWORD m_threadId;                            ///
-};
-
-
-///
-struct NotifyCommand : public Notify
-{
-  HWND m_hwnd;                                 ///
-  UINT m_message;                              ///
-  WPARAM m_wParam;                             ///
-  LPARAM m_lParam;                             ///
-};
-
-
-enum
-{
-  NOTIFY_MESSAGE_SIZE = sizeof(NotifySetFocus),        ///
-};
-
-
-///
-struct NotifyShow : public Notify
-{
-  ///
-  enum Show
-  {
-    Show_Normal,
-    Show_Maximized,
-    Show_Minimized,
-  };
-  Show m_show;                                 ///
-  bool m_isMDI;                                        ///
-};
-
-
-///
-struct NotifyLog : public Notify
-{
-  _TCHAR m_msg[GANA_MAX_PATH];                 ///
-};
-
-
-///
-enum MouseHookType
-{
-  MouseHookType_None = 0,                              /// none
-  MouseHookType_Wheel = 1 << 0,                        /// wheel
-  MouseHookType_WindowMove = 1 << 1,           /// window move
-};
-
-#ifdef NO_DRIVER
-class Engine;
-typedef unsigned int (WINAPI *KEYBOARD_DETOUR)(Engine *i_engine, KBDLLHOOKSTRUCT *i_kid);
-#endif // NO_DRIVER
-
-///
-class HookData
-{
-public:
-  USHORT m_syncKey;                            ///
-  bool m_syncKeyIsExtended;                    ///
-  bool m_doesNotifyCommand;                    ///
-  DWORD m_hwndTaskTray;                                ///
-  bool m_correctKanaLockHandling;              /// does use KL- ?
-  MouseHookType m_mouseHookType;               ///
-  int m_mouseHookParam;                        ///
-  DWORD m_hwndMouseHookTarget;         ///
-  POINT m_mousePos;                            ///
-};
-
-
-///
-#  define DllExport __declspec(dllexport)
-///
-#  define DllImport __declspec(dllimport)
-
-
-#  ifndef _HOOK_CPP
-extern DllImport HookData *g_hookData;
-extern DllImport int installHooks(KEYBOARD_DETOUR i_keyboardDetour, Engine *i_engine);
-extern DllImport int uninstallHooks();
-extern DllImport bool notify(void *data, size_t sizeof_data);
-extern DllImport void notifyLockState();
-#  endif // !_HOOK_CPP
-
-
-#endif // !_HOOK_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// hook.h\r
+\r
+\r
+#ifndef _HOOK_H\r
+#  define _HOOK_H\r
+\r
+#  include "misc.h"\r
+#  include <tchar.h>\r
+#ifdef NO_DRIVER\r
+#  include <windows.h>\r
+#endif // NO_DRIVER\r
+\r
+///\r
+#  define HOOK_PIPE_NAME \\r
+ _T("\\\\.\\pipe\\GANAware\\mayu\\{4B22D464-7A4E-494b-982A-C2B2BBAAF9F3}") _T(VERSION)\r
+///\r
+#ifdef USE_MAILSLOT\r
+#  define NOTIFY_MAILSLOT_NAME \\r
+_T("\\\\.\\mailslot\\GANAware\\mayu\\{330F7914-EB5B-49be-ACCE-D2B8DF585B32}") _T(VERSION)\r
+///\r
+#endif // USE_MAILSLOT\r
+#  define WM_MAYU_MESSAGE_NAME _T("GANAware\\mayu\\WM_MAYU_MESSAGE")\r
+\r
+///\r
+enum MayuMessage\r
+{\r
+  MayuMessage_notifyName,\r
+  MayuMessage_funcRecenter,\r
+  MayuMessage_funcSetImeStatus,\r
+  MayuMessage_funcSetImeString,\r
+};\r
+\r
+\r
+///\r
+struct Notify\r
+{\r
+  ///\r
+  enum Type\r
+  {\r
+    Type_setFocus,                             /// NotifySetFocus\r
+    Type_name,                                 /// NotifySetFocus\r
+    Type_lockState,                            /// NotifyLockState\r
+    Type_sync,                                 /// Notify\r
+    Type_threadDetach,                         /// NotifyThreadDetach\r
+    Type_command,                              /// NotifyThreadDetach\r
+    Type_show,                                 /// NotifyShow\r
+    Type_log,                                  /// NotifyLog\r
+  };\r
+  Type m_type;                                 ///\r
+  DWORD m_debugParam;                          /// (for debug)\r
+};\r
+\r
+\r
+///\r
+struct NotifySetFocus : public Notify\r
+{\r
+  DWORD m_threadId;                            ///\r
+  DWORD m_hwnd;                                ///\r
+  _TCHAR m_className[GANA_MAX_PATH];           ///\r
+  _TCHAR m_titleName[GANA_MAX_PATH];           ///\r
+};\r
+\r
+\r
+///\r
+struct NotifyLockState : public Notify\r
+{\r
+  bool m_isNumLockToggled;                     ///\r
+  bool m_isCapsLockToggled;                    ///\r
+  bool m_isScrollLockToggled;                  ///\r
+  bool m_isKanaLockToggled;                    ///\r
+  bool m_isImeLockToggled;                     ///\r
+  bool m_isImeCompToggled;                     ///\r
+};\r
+\r
+\r
+///\r
+struct NotifyThreadDetach : public Notify\r
+{\r
+  DWORD m_threadId;                            ///\r
+};\r
+\r
+\r
+///\r
+struct NotifyCommand : public Notify\r
+{\r
+  HWND m_hwnd;                                 ///\r
+  UINT m_message;                              ///\r
+  WPARAM m_wParam;                             ///\r
+  LPARAM m_lParam;                             ///\r
+};\r
+\r
+\r
+enum\r
+{\r
+  NOTIFY_MESSAGE_SIZE = sizeof(NotifySetFocus),        ///\r
+};\r
+\r
+\r
+///\r
+struct NotifyShow : public Notify\r
+{\r
+  ///\r
+  enum Show\r
+  {\r
+    Show_Normal,\r
+    Show_Maximized,\r
+    Show_Minimized,\r
+  };\r
+  Show m_show;                                 ///\r
+  bool m_isMDI;                                        ///\r
+};\r
+\r
+\r
+///\r
+struct NotifyLog : public Notify\r
+{\r
+  _TCHAR m_msg[GANA_MAX_PATH];                 ///\r
+};\r
+\r
+\r
+///\r
+enum MouseHookType\r
+{\r
+  MouseHookType_None = 0,                              /// none\r
+  MouseHookType_Wheel = 1 << 0,                        /// wheel\r
+  MouseHookType_WindowMove = 1 << 1,           /// window move\r
+};\r
+\r
+#ifdef NO_DRIVER\r
+class Engine;\r
+typedef unsigned int (WINAPI *KEYBOARD_DETOUR)(Engine *i_engine, KBDLLHOOKSTRUCT *i_kid);\r
+#endif // NO_DRIVER\r
+\r
+///\r
+class HookData\r
+{\r
+public:\r
+  USHORT m_syncKey;                            ///\r
+  bool m_syncKeyIsExtended;                    ///\r
+  bool m_doesNotifyCommand;                    ///\r
+  DWORD m_hwndTaskTray;                                ///\r
+  bool m_correctKanaLockHandling;              /// does use KL- ?\r
+  MouseHookType m_mouseHookType;               ///\r
+  int m_mouseHookParam;                        ///\r
+  DWORD m_hwndMouseHookTarget;         ///\r
+  POINT m_mousePos;                            ///\r
+};\r
+\r
+\r
+///\r
+#  define DllExport __declspec(dllexport)\r
+///\r
+#  define DllImport __declspec(dllimport)\r
+\r
+\r
+#  ifndef _HOOK_CPP\r
+extern DllImport HookData *g_hookData;\r
+extern DllImport int installHooks(KEYBOARD_DETOUR i_keyboardDetour, Engine *i_engine);\r
+extern DllImport int uninstallHooks();\r
+extern DllImport bool notify(void *data, size_t sizeof_data);\r
+extern DllImport void notifyLockState();\r
+#  endif // !_HOOK_CPP\r
+\r
+\r
+#endif // !_HOOK_H\r
index 98eb6d6..d4089a1 100644 (file)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// setting.cpp
-
-
-#include "keyboard.h"
-
-#include <algorithm>
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Key
-
-
-// add a name or an alias of key
-void Key::addName(const tstringi &i_name)
-{
-  m_names.push_back(i_name);
-}
-
-
-// add a scan code
-void Key::addScanCode(const ScanCode &i_sc)
-{
-  ASSERT(m_scanCodesSize < MAX_SCAN_CODES_SIZE);
-  m_scanCodes[m_scanCodesSize ++] = i_sc;
-}
-
-
-// initializer
-Key &Key::initialize()
-{
-  m_names.clear();
-  m_isPressed = false;
-  m_isPressedOnWin32 = false;
-  m_isPressedByAssign = false;
-  m_scanCodesSize = 0;
-  return *this;
-}
-
-
-// equation by name
-bool Key::operator==(const tstringi &i_name) const
-{
-  return std::find(m_names.begin(), m_names.end(), i_name) != m_names.end();
-}
-
-  
-// is the scan code of this key ?
-bool Key::isSameScanCode(const Key &i_key) const
-{
-  if (m_scanCodesSize != i_key.m_scanCodesSize)
-    return false;
-  return isPrefixScanCode(i_key);
-}
-
-
-// is the key's scan code the prefix of this key's scan code ?
-bool Key::isPrefixScanCode(const Key &i_key) const
-{
-  for (size_t i = 0; i < i_key.m_scanCodesSize; ++ i)
-    if (m_scanCodes[i] != i_key.m_scanCodes[i])
-      return false;
-  return true;
-}
-
-
-// stream output
-tostream &operator<<(tostream &i_ost, const Key &i_mk)
-{
-  return i_ost << i_mk.getName();
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Modifier
-
-
-Modifier::Modifier()
-  : m_modifiers(0),
-    m_dontcares(0)
-{
-  ASSERT(Type_end <= (sizeof(MODIFIERS) * 8));
-  static const Type defaultDontCare[] =
-  {
-    Type_Up, Type_Down, Type_Repeat,
-    Type_ImeLock, Type_ImeComp, Type_NumLock, Type_CapsLock, Type_ScrollLock,
-       Type_KanaLock,
-    Type_Maximized, Type_Minimized, Type_MdiMaximized, Type_MdiMinimized,
-    Type_Touchpad, Type_TouchpadSticky,
-    Type_Lock0, Type_Lock1, Type_Lock2, Type_Lock3, Type_Lock4,
-    Type_Lock5, Type_Lock6, Type_Lock7, Type_Lock8, Type_Lock9,
-  };
-  for (size_t i = 0; i < NUMBER_OF(defaultDontCare); ++ i)
-    dontcare(defaultDontCare[i]);
-}
-
-
-// add m's modifiers where this dontcare
-void Modifier::add(const Modifier &i_m)
-{
-  for (int i = 0; i < Type_end; ++ i)
-  {
-    if (isDontcare(static_cast<Modifier::Type>(i)))
-      if (!i_m.isDontcare(static_cast<Modifier::Type>(i)))
-       if (i_m.isPressed(static_cast<Modifier::Type>(i)))
-         press(static_cast<Modifier::Type>(i));
-       else
-         release(static_cast<Modifier::Type>(i));
-  }
-}
-
-// stream output
-tostream &operator<<(tostream &i_ost, const Modifier &i_m)
-{
-  struct Mods
-  {
-    Modifier::Type m_mt;
-    const _TCHAR *m_symbol;
-  };
-  
-  const static Mods mods[] =
-  {
-    { Modifier::Type_Up, _T("U-") }, { Modifier::Type_Down, _T("D-") },
-    { Modifier::Type_Shift, _T("S-") }, { Modifier::Type_Alt, _T("A-") },
-    { Modifier::Type_Control, _T("C-") }, { Modifier::Type_Windows, _T("W-") },
-    { Modifier::Type_Repeat, _T("R-") },
-    { Modifier::Type_ImeLock, _T("IL-") },
-    { Modifier::Type_ImeComp, _T("IC-") },
-    { Modifier::Type_ImeComp, _T("I-") },
-    { Modifier::Type_NumLock, _T("NL-") },
-    { Modifier::Type_CapsLock, _T("CL-") },
-    { Modifier::Type_ScrollLock, _T("SL-") },
-    { Modifier::Type_KanaLock, _T("KL-") },
-    { Modifier::Type_Maximized, _T("MAX-") },
-    { Modifier::Type_Minimized, _T("MIN-") },
-    { Modifier::Type_MdiMaximized, _T("MMAX-") },
-    { Modifier::Type_MdiMinimized, _T("MMIN-") },
-    { Modifier::Type_Touchpad, _T("T-") },
-    { Modifier::Type_TouchpadSticky, _T("TS-") },
-    { Modifier::Type_Mod0, _T("M0-") }, { Modifier::Type_Mod1, _T("M1-") },
-    { Modifier::Type_Mod2, _T("M2-") }, { Modifier::Type_Mod3, _T("M3-") },
-    { Modifier::Type_Mod4, _T("M4-") }, { Modifier::Type_Mod5, _T("M5-") },
-    { Modifier::Type_Mod6, _T("M6-") }, { Modifier::Type_Mod7, _T("M7-") },
-    { Modifier::Type_Mod8, _T("M8-") }, { Modifier::Type_Mod9, _T("M9-") },
-    { Modifier::Type_Lock0, _T("L0-") }, { Modifier::Type_Lock1, _T("L1-") },
-    { Modifier::Type_Lock2, _T("L2-") }, { Modifier::Type_Lock3, _T("L3-") },
-    { Modifier::Type_Lock4, _T("L4-") }, { Modifier::Type_Lock5, _T("L5-") },
-    { Modifier::Type_Lock6, _T("L6-") }, { Modifier::Type_Lock7, _T("L7-") },
-    { Modifier::Type_Lock8, _T("L8-") }, { Modifier::Type_Lock9, _T("L9-") },
-  };
-
-  for (size_t i = 0; i < NUMBER_OF(mods); ++ i)
-    if (!i_m.isDontcare(mods[i].m_mt) && i_m.isPressed(mods[i].m_mt))
-      i_ost << mods[i].m_symbol;
-#if 0
-    else if (!i_m.isDontcare(mods[i].m_mt) && i_m.isPressed(mods[i].m_mt))
-      i_ost << _T("~") << mods[i].m_symbol;
-    else
-      i_ost << _T("*") << mods[i].m_symbol;
-#endif
-
-  return i_ost;
-}
-
-
-/// stream output
-tostream &operator<<(tostream &i_ost, Modifier::Type i_type)
-{
-  const _TCHAR *modNames[] =
-  {
-    _T("Shift"), 
-    _T("Alt"), 
-    _T("Control"), 
-    _T("Windows"), 
-    _T("Up"), 
-    _T("Down"), 
-    _T("Repeat"), 
-    _T("ImeLock"), 
-    _T("ImeComp"), 
-    _T("NumLock"), 
-    _T("CapsLock"), 
-    _T("ScrollLock"), 
-    _T("KanaLock"), 
-    _T("Maximized"), 
-    _T("Minimized"), 
-    _T("MdiMaximized"), 
-    _T("MdiMinimized"), 
-    _T("Touchpad"), 
-    _T("TouchpadSticky"), 
-    _T("Mod0"), 
-    _T("Mod1"), 
-    _T("Mod2"), 
-    _T("Mod3"), 
-    _T("Mod4"), 
-    _T("Mod5"), 
-    _T("Mod6"), 
-    _T("Mod7"), 
-    _T("Mod8"), 
-    _T("Mod9"), 
-    _T("Lock0"), 
-    _T("Lock1"), 
-    _T("Lock2"), 
-    _T("Lock3"), 
-    _T("Lock4"), 
-    _T("Lock5"), 
-    _T("Lock6"), 
-    _T("Lock7"), 
-    _T("Lock8"), 
-    _T("Lock9"), 
-  };
-
-  int i = static_cast<int>(i_type);
-  if (0 <= i && i < NUMBER_OF(modNames))
-    i_ost << modNames[i];
-  
-  return i_ost;
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// ModifiedKey
-
-
-// stream output
-tostream &operator<<(tostream &i_ost, const ModifiedKey &i_mk)
-{
-  if (i_mk.m_key)
-    i_ost << i_mk.m_modifier << *i_mk.m_key;
-  return i_ost;
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Keyboard::KeyIterator
-
-
-Keyboard::KeyIterator::KeyIterator(Keys *i_hashedKeys, size_t i_hashedKeysSize)
-  : m_hashedKeys(i_hashedKeys),
-    m_hashedKeysSize(i_hashedKeysSize),
-    m_i((*m_hashedKeys).begin())
-{
-  if ((*m_hashedKeys).empty())
-  {
-    do
-    {
-      -- m_hashedKeysSize;
-      ++ m_hashedKeys;
-    } while (0 < m_hashedKeysSize && (*m_hashedKeys).empty());
-    if (0 < m_hashedKeysSize)
-      m_i = (*m_hashedKeys).begin();
-  }
-}
-
-
-void Keyboard::KeyIterator::next()
-{
-  if (m_hashedKeysSize == 0)
-    return;
-  ++ m_i;
-  if (m_i == (*m_hashedKeys).end())
-  {
-    do
-    {
-      -- m_hashedKeysSize;
-      ++ m_hashedKeys;
-    } while (0 < m_hashedKeysSize && (*m_hashedKeys).empty());
-    if (0 < m_hashedKeysSize)
-      m_i = (*m_hashedKeys).begin();
-  }
-}
-
-
-Key *Keyboard::KeyIterator::operator *()
-{
-  if (m_hashedKeysSize == 0)
-    return NULL;
-  return &*m_i;
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Keyboard
-
-
-Keyboard::Keys &Keyboard::getKeys(const Key &i_key)
-{
-  ASSERT(1 <= i_key.getScanCodesSize());
-  return m_hashedKeys[i_key.getScanCodes()->m_scan % HASHED_KEYS_SIZE];
-}
-
-
-// add a key
-void Keyboard::addKey(const Key &i_key)
-{
-  getKeys(i_key).push_front(i_key);
-}
-
-
-// add a key name alias
-void Keyboard::addAlias(const tstringi &i_aliasName, Key *i_key)
-{
-  m_aliases.insert(Aliases::value_type(i_aliasName, i_key));
-}
-
-// add substitute
-void Keyboard::addSubstitute(const ModifiedKey &i_mkeyFrom,
-                            const ModifiedKey &i_mkeyTo)
-{
-  m_substitutes.push_front(Substitute(i_mkeyFrom, i_mkeyTo));
-}
-
-
-// add a modifier key
-void Keyboard::addModifier(Modifier::Type i_mt, Key *i_key)
-{
-  ASSERT((int)i_mt < (int)Modifier::Type_BASIC);
-  if (std::find(m_mods[i_mt].begin(), m_mods[i_mt].end(), i_key)
-      != m_mods[i_mt].end())
-    return; // already added
-  m_mods[i_mt].push_back(i_key);
-}
-
-
-// search a key
-Key *Keyboard::searchKey(const Key &i_key)
-{
-  Keys &keys = getKeys(i_key);
-  for (Keys::iterator i = keys.begin(); i != keys.end(); ++ i)
-    if ((*i).isSameScanCode(i_key))
-      return &*i;
-  return NULL;
-}
-
-
-// search a key (of which the key's scan code is the prefix)
-Key *Keyboard::searchPrefixKey(const Key &i_key)
-{
-  Keys &keys = getKeys(i_key);
-  for (Keys::iterator i = keys.begin(); i != keys.end(); ++ i)
-    if ((*i).isPrefixScanCode(i_key))
-      return &*i;
-  return NULL;
-}
-
-  
-// search a key by name
-Key *Keyboard::searchKey(const tstringi &i_name)
-{
-  Aliases::iterator i = m_aliases.find(i_name);
-  if (i != m_aliases.end())
-    return (*i).second;
-  return searchKeyByNonAliasName(i_name);
-}
-
-
-// search a key by non-alias name
-Key *Keyboard::searchKeyByNonAliasName(const tstringi &i_name)
-{
-  for (int j = 0; j < HASHED_KEYS_SIZE; ++ j)
-  {
-    Keys &keys = m_hashedKeys[j];
-    Keys::iterator i = std::find(keys.begin(), keys.end(), i_name);
-    if (i != keys.end())
-      return &*i;
-  }
-  return NULL;
-}
-
-/// search a substitute
-ModifiedKey Keyboard::searchSubstitute(const ModifiedKey &i_mkey)
-{
-  for (Substitutes::const_iterator
-        i = m_substitutes.begin(); i != m_substitutes.end(); ++ i)
-    if (i->m_mkeyFrom.m_key == i_mkey.m_key &&
-       i->m_mkeyFrom.m_modifier.doesMatch(i_mkey.m_modifier))
-      return i->m_mkeyTo;
-  return ModifiedKey();                                // not found (.m_mkey is NULL)
-}
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// setting.cpp\r
+\r
+\r
+#include "keyboard.h"\r
+\r
+#include <algorithm>\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Key\r
+\r
+\r
+// add a name or an alias of key\r
+void Key::addName(const tstringi &i_name)\r
+{\r
+  m_names.push_back(i_name);\r
+}\r
+\r
+\r
+// add a scan code\r
+void Key::addScanCode(const ScanCode &i_sc)\r
+{\r
+  ASSERT(m_scanCodesSize < MAX_SCAN_CODES_SIZE);\r
+  m_scanCodes[m_scanCodesSize ++] = i_sc;\r
+}\r
+\r
+\r
+// initializer\r
+Key &Key::initialize()\r
+{\r
+  m_names.clear();\r
+  m_isPressed = false;\r
+  m_isPressedOnWin32 = false;\r
+  m_isPressedByAssign = false;\r
+  m_scanCodesSize = 0;\r
+  return *this;\r
+}\r
+\r
+\r
+// equation by name\r
+bool Key::operator==(const tstringi &i_name) const\r
+{\r
+  return std::find(m_names.begin(), m_names.end(), i_name) != m_names.end();\r
+}\r
+\r
+  \r
+// is the scan code of this key ?\r
+bool Key::isSameScanCode(const Key &i_key) const\r
+{\r
+  if (m_scanCodesSize != i_key.m_scanCodesSize)\r
+    return false;\r
+  return isPrefixScanCode(i_key);\r
+}\r
+\r
+\r
+// is the key's scan code the prefix of this key's scan code ?\r
+bool Key::isPrefixScanCode(const Key &i_key) const\r
+{\r
+  for (size_t i = 0; i < i_key.m_scanCodesSize; ++ i)\r
+    if (m_scanCodes[i] != i_key.m_scanCodes[i])\r
+      return false;\r
+  return true;\r
+}\r
+\r
+\r
+// stream output\r
+tostream &operator<<(tostream &i_ost, const Key &i_mk)\r
+{\r
+  return i_ost << i_mk.getName();\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Modifier\r
+\r
+\r
+Modifier::Modifier()\r
+  : m_modifiers(0),\r
+    m_dontcares(0)\r
+{\r
+  ASSERT(Type_end <= (sizeof(MODIFIERS) * 8));\r
+  static const Type defaultDontCare[] =\r
+  {\r
+    Type_Up, Type_Down, Type_Repeat,\r
+    Type_ImeLock, Type_ImeComp, Type_NumLock, Type_CapsLock, Type_ScrollLock,\r
+       Type_KanaLock,\r
+    Type_Maximized, Type_Minimized, Type_MdiMaximized, Type_MdiMinimized,\r
+    Type_Touchpad, Type_TouchpadSticky,\r
+    Type_Lock0, Type_Lock1, Type_Lock2, Type_Lock3, Type_Lock4,\r
+    Type_Lock5, Type_Lock6, Type_Lock7, Type_Lock8, Type_Lock9,\r
+  };\r
+  for (size_t i = 0; i < NUMBER_OF(defaultDontCare); ++ i)\r
+    dontcare(defaultDontCare[i]);\r
+}\r
+\r
+\r
+// add m's modifiers where this dontcare\r
+void Modifier::add(const Modifier &i_m)\r
+{\r
+  for (int i = 0; i < Type_end; ++ i)\r
+  {\r
+    if (isDontcare(static_cast<Modifier::Type>(i)))\r
+      if (!i_m.isDontcare(static_cast<Modifier::Type>(i)))\r
+       if (i_m.isPressed(static_cast<Modifier::Type>(i)))\r
+         press(static_cast<Modifier::Type>(i));\r
+       else\r
+         release(static_cast<Modifier::Type>(i));\r
+  }\r
+}\r
+\r
+// stream output\r
+tostream &operator<<(tostream &i_ost, const Modifier &i_m)\r
+{\r
+  struct Mods\r
+  {\r
+    Modifier::Type m_mt;\r
+    const _TCHAR *m_symbol;\r
+  };\r
+  \r
+  const static Mods mods[] =\r
+  {\r
+    { Modifier::Type_Up, _T("U-") }, { Modifier::Type_Down, _T("D-") },\r
+    { Modifier::Type_Shift, _T("S-") }, { Modifier::Type_Alt, _T("A-") },\r
+    { Modifier::Type_Control, _T("C-") }, { Modifier::Type_Windows, _T("W-") },\r
+    { Modifier::Type_Repeat, _T("R-") },\r
+    { Modifier::Type_ImeLock, _T("IL-") },\r
+    { Modifier::Type_ImeComp, _T("IC-") },\r
+    { Modifier::Type_ImeComp, _T("I-") },\r
+    { Modifier::Type_NumLock, _T("NL-") },\r
+    { Modifier::Type_CapsLock, _T("CL-") },\r
+    { Modifier::Type_ScrollLock, _T("SL-") },\r
+    { Modifier::Type_KanaLock, _T("KL-") },\r
+    { Modifier::Type_Maximized, _T("MAX-") },\r
+    { Modifier::Type_Minimized, _T("MIN-") },\r
+    { Modifier::Type_MdiMaximized, _T("MMAX-") },\r
+    { Modifier::Type_MdiMinimized, _T("MMIN-") },\r
+    { Modifier::Type_Touchpad, _T("T-") },\r
+    { Modifier::Type_TouchpadSticky, _T("TS-") },\r
+    { Modifier::Type_Mod0, _T("M0-") }, { Modifier::Type_Mod1, _T("M1-") },\r
+    { Modifier::Type_Mod2, _T("M2-") }, { Modifier::Type_Mod3, _T("M3-") },\r
+    { Modifier::Type_Mod4, _T("M4-") }, { Modifier::Type_Mod5, _T("M5-") },\r
+    { Modifier::Type_Mod6, _T("M6-") }, { Modifier::Type_Mod7, _T("M7-") },\r
+    { Modifier::Type_Mod8, _T("M8-") }, { Modifier::Type_Mod9, _T("M9-") },\r
+    { Modifier::Type_Lock0, _T("L0-") }, { Modifier::Type_Lock1, _T("L1-") },\r
+    { Modifier::Type_Lock2, _T("L2-") }, { Modifier::Type_Lock3, _T("L3-") },\r
+    { Modifier::Type_Lock4, _T("L4-") }, { Modifier::Type_Lock5, _T("L5-") },\r
+    { Modifier::Type_Lock6, _T("L6-") }, { Modifier::Type_Lock7, _T("L7-") },\r
+    { Modifier::Type_Lock8, _T("L8-") }, { Modifier::Type_Lock9, _T("L9-") },\r
+  };\r
+\r
+  for (size_t i = 0; i < NUMBER_OF(mods); ++ i)\r
+    if (!i_m.isDontcare(mods[i].m_mt) && i_m.isPressed(mods[i].m_mt))\r
+      i_ost << mods[i].m_symbol;\r
+#if 0\r
+    else if (!i_m.isDontcare(mods[i].m_mt) && i_m.isPressed(mods[i].m_mt))\r
+      i_ost << _T("~") << mods[i].m_symbol;\r
+    else\r
+      i_ost << _T("*") << mods[i].m_symbol;\r
+#endif\r
+\r
+  return i_ost;\r
+}\r
+\r
+\r
+/// stream output\r
+tostream &operator<<(tostream &i_ost, Modifier::Type i_type)\r
+{\r
+  const _TCHAR *modNames[] =\r
+  {\r
+    _T("Shift"), \r
+    _T("Alt"), \r
+    _T("Control"), \r
+    _T("Windows"), \r
+    _T("Up"), \r
+    _T("Down"), \r
+    _T("Repeat"), \r
+    _T("ImeLock"), \r
+    _T("ImeComp"), \r
+    _T("NumLock"), \r
+    _T("CapsLock"), \r
+    _T("ScrollLock"), \r
+    _T("KanaLock"), \r
+    _T("Maximized"), \r
+    _T("Minimized"), \r
+    _T("MdiMaximized"), \r
+    _T("MdiMinimized"), \r
+    _T("Touchpad"), \r
+    _T("TouchpadSticky"), \r
+    _T("Mod0"), \r
+    _T("Mod1"), \r
+    _T("Mod2"), \r
+    _T("Mod3"), \r
+    _T("Mod4"), \r
+    _T("Mod5"), \r
+    _T("Mod6"), \r
+    _T("Mod7"), \r
+    _T("Mod8"), \r
+    _T("Mod9"), \r
+    _T("Lock0"), \r
+    _T("Lock1"), \r
+    _T("Lock2"), \r
+    _T("Lock3"), \r
+    _T("Lock4"), \r
+    _T("Lock5"), \r
+    _T("Lock6"), \r
+    _T("Lock7"), \r
+    _T("Lock8"), \r
+    _T("Lock9"), \r
+  };\r
+\r
+  int i = static_cast<int>(i_type);\r
+  if (0 <= i && i < NUMBER_OF(modNames))\r
+    i_ost << modNames[i];\r
+  \r
+  return i_ost;\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// ModifiedKey\r
+\r
+\r
+// stream output\r
+tostream &operator<<(tostream &i_ost, const ModifiedKey &i_mk)\r
+{\r
+  if (i_mk.m_key)\r
+    i_ost << i_mk.m_modifier << *i_mk.m_key;\r
+  return i_ost;\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Keyboard::KeyIterator\r
+\r
+\r
+Keyboard::KeyIterator::KeyIterator(Keys *i_hashedKeys, size_t i_hashedKeysSize)\r
+  : m_hashedKeys(i_hashedKeys),\r
+    m_hashedKeysSize(i_hashedKeysSize),\r
+    m_i((*m_hashedKeys).begin())\r
+{\r
+  if ((*m_hashedKeys).empty())\r
+  {\r
+    do\r
+    {\r
+      -- m_hashedKeysSize;\r
+      ++ m_hashedKeys;\r
+    } while (0 < m_hashedKeysSize && (*m_hashedKeys).empty());\r
+    if (0 < m_hashedKeysSize)\r
+      m_i = (*m_hashedKeys).begin();\r
+  }\r
+}\r
+\r
+\r
+void Keyboard::KeyIterator::next()\r
+{\r
+  if (m_hashedKeysSize == 0)\r
+    return;\r
+  ++ m_i;\r
+  if (m_i == (*m_hashedKeys).end())\r
+  {\r
+    do\r
+    {\r
+      -- m_hashedKeysSize;\r
+      ++ m_hashedKeys;\r
+    } while (0 < m_hashedKeysSize && (*m_hashedKeys).empty());\r
+    if (0 < m_hashedKeysSize)\r
+      m_i = (*m_hashedKeys).begin();\r
+  }\r
+}\r
+\r
+\r
+Key *Keyboard::KeyIterator::operator *()\r
+{\r
+  if (m_hashedKeysSize == 0)\r
+    return NULL;\r
+  return &*m_i;\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Keyboard\r
+\r
+\r
+Keyboard::Keys &Keyboard::getKeys(const Key &i_key)\r
+{\r
+  ASSERT(1 <= i_key.getScanCodesSize());\r
+  return m_hashedKeys[i_key.getScanCodes()->m_scan % HASHED_KEYS_SIZE];\r
+}\r
+\r
+\r
+// add a key\r
+void Keyboard::addKey(const Key &i_key)\r
+{\r
+  getKeys(i_key).push_front(i_key);\r
+}\r
+\r
+\r
+// add a key name alias\r
+void Keyboard::addAlias(const tstringi &i_aliasName, Key *i_key)\r
+{\r
+  m_aliases.insert(Aliases::value_type(i_aliasName, i_key));\r
+}\r
+\r
+// add substitute\r
+void Keyboard::addSubstitute(const ModifiedKey &i_mkeyFrom,\r
+                            const ModifiedKey &i_mkeyTo)\r
+{\r
+  m_substitutes.push_front(Substitute(i_mkeyFrom, i_mkeyTo));\r
+}\r
+\r
+\r
+// add a modifier key\r
+void Keyboard::addModifier(Modifier::Type i_mt, Key *i_key)\r
+{\r
+  ASSERT((int)i_mt < (int)Modifier::Type_BASIC);\r
+  if (std::find(m_mods[i_mt].begin(), m_mods[i_mt].end(), i_key)\r
+      != m_mods[i_mt].end())\r
+    return; // already added\r
+  m_mods[i_mt].push_back(i_key);\r
+}\r
+\r
+\r
+// search a key\r
+Key *Keyboard::searchKey(const Key &i_key)\r
+{\r
+  Keys &keys = getKeys(i_key);\r
+  for (Keys::iterator i = keys.begin(); i != keys.end(); ++ i)\r
+    if ((*i).isSameScanCode(i_key))\r
+      return &*i;\r
+  return NULL;\r
+}\r
+\r
+\r
+// search a key (of which the key's scan code is the prefix)\r
+Key *Keyboard::searchPrefixKey(const Key &i_key)\r
+{\r
+  Keys &keys = getKeys(i_key);\r
+  for (Keys::iterator i = keys.begin(); i != keys.end(); ++ i)\r
+    if ((*i).isPrefixScanCode(i_key))\r
+      return &*i;\r
+  return NULL;\r
+}\r
+\r
+  \r
+// search a key by name\r
+Key *Keyboard::searchKey(const tstringi &i_name)\r
+{\r
+  Aliases::iterator i = m_aliases.find(i_name);\r
+  if (i != m_aliases.end())\r
+    return (*i).second;\r
+  return searchKeyByNonAliasName(i_name);\r
+}\r
+\r
+\r
+// search a key by non-alias name\r
+Key *Keyboard::searchKeyByNonAliasName(const tstringi &i_name)\r
+{\r
+  for (int j = 0; j < HASHED_KEYS_SIZE; ++ j)\r
+  {\r
+    Keys &keys = m_hashedKeys[j];\r
+    Keys::iterator i = std::find(keys.begin(), keys.end(), i_name);\r
+    if (i != keys.end())\r
+      return &*i;\r
+  }\r
+  return NULL;\r
+}\r
+\r
+/// search a substitute\r
+ModifiedKey Keyboard::searchSubstitute(const ModifiedKey &i_mkey)\r
+{\r
+  for (Substitutes::const_iterator\r
+        i = m_substitutes.begin(); i != m_substitutes.end(); ++ i)\r
+    if (i->m_mkeyFrom.m_key == i_mkey.m_key &&\r
+       i->m_mkeyFrom.m_modifier.doesMatch(i_mkey.m_modifier))\r
+      return i->m_mkeyTo;\r
+  return ModifiedKey();                                // not found (.m_mkey is NULL)\r
+}\r
index 1d9111f..9965ba0 100644 (file)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// keyboard.h
-
-
-#ifndef _KEYBOARD_H
-#  define _KEYBOARD_H
-
-#  include "misc.h"
-#  include "driver.h"
-#  include "stringtool.h"
-#  include <vector>
-#  include <list>
-#  include <map>
-
-
-/// a scan code with flags
-class ScanCode
-{
-public:
-  ///
-  enum
-  {
-    BREAK = KEYBOARD_INPUT_DATA::BREAK,                /// key release flag
-    E0    = KEYBOARD_INPUT_DATA::E0,           /// extended key flag
-    E1    = KEYBOARD_INPUT_DATA::E1,           /// extended key flag
-    E0E1  = KEYBOARD_INPUT_DATA::E0E1,         /// extended key flag
-  };
-
-public:
-  USHORT m_scan;                               ///
-  USHORT m_flags;                              ///
-
-public:
-  ///
-  ScanCode() : m_scan(0), m_flags(0) { }
-  ///
-  ScanCode(USHORT i_scan, USHORT i_flags)
-    : m_scan(i_scan), m_flags(i_flags) { }
-  ///
-  bool operator==(const ScanCode &i_sc) const
-  {
-    return (m_scan == i_sc.m_scan &&
-           (E0E1 & m_flags) == (E0E1 & i_sc.m_flags));
-  }
-  ///
-  bool operator!=(const ScanCode &i_sc) const { return !(*this == i_sc); }
-};
-
-
-/// a key
-class Key
-{
-public:
-  enum
-  {
-    ///
-    MAX_SCAN_CODES_SIZE = 4,
-  };
-
-private:
-  ///
-  typedef std::vector<tstringi> Names;
-
-public:
-  /// if this key pressed physically
-  bool m_isPressed;
-  /// if this key pressed on Win32
-  bool m_isPressedOnWin32;
-  /// if this key pressed by assign
-  bool m_isPressedByAssign;
-
-private:
-  /// key name
-  Names m_names;
-  /// key scan code length
-  size_t m_scanCodesSize;
-  /// key scan code
-  ScanCode m_scanCodes[MAX_SCAN_CODES_SIZE];
-
-public:
-  ///
-  Key()
-    : m_isPressed(false),
-      m_isPressedOnWin32(false),
-      m_isPressedByAssign(false),
-      m_scanCodesSize(0)
-  { }
-
-  /// for Event::* only
-  Key(const tstringi &i_name)
-    : m_isPressed(false),
-      m_isPressedOnWin32(false),
-      m_isPressedByAssign(false),
-      m_scanCodesSize(0)
-  {
-    addName(i_name);
-    addScanCode(ScanCode());
-  }
-
-  /// get key name (first name)
-  const tstringi &getName() const { return m_names.front(); }
-
-  /// get scan codes
-  const ScanCode *getScanCodes() const { return m_scanCodes; }
-  ///
-  size_t getScanCodesSize() const { return m_scanCodesSize; }
-  
-  /// add a name of key
-  void addName(const tstringi &i_name);
-  
-  /// add a scan code
-  void addScanCode(const ScanCode &i_sc);
-  
-  /// initializer
-  Key &initialize();
-  
-  /// equation by name
-  bool operator==(const tstringi &i_name) const;
-  ///
-  bool operator!=(const tstringi &i_name) const
-  { return !(*this == i_name); }
-  
-  /// is the scan code of this key ?
-  bool isSameScanCode(const Key &i_key) const;
-  
-  /// is the i_key's scan code the prefix of this key's scan code ?
-  bool isPrefixScanCode(const Key &i_key) const;
-  
-  /// stream output
-  friend tostream &operator<<(tostream &i_ost, const Key &i_key);
-  
-  /// < 
-  bool operator<(const Key &i_key) const
-  { return getName() < i_key.getName(); }
-};
-
-
-///
-class Modifier
-{
-  ///
-  typedef u_int64 MODIFIERS;
-  ///
-  MODIFIERS m_modifiers;
-  ///
-  MODIFIERS m_dontcares;
-  
-public:
-  ///
-  enum Type
-  {
-    Type_begin = 0,                            ///
-
-    Type_Shift = Type_begin,                   /// &lt;BASIC_MODIFIER&gt;
-    Type_Alt,                                  /// &lt;BASIC_MODIFIER&gt;
-    Type_Control,                              /// &lt;BASIC_MODIFIER&gt;
-    Type_Windows,                              /// &lt;BASIC_MODIFIER&gt;
-    Type_BASIC,                                        ///
-    
-    Type_Up = Type_BASIC,                      /// &lt;KEYSEQ_MODIFIER&gt;
-    Type_Down,                                 /// &lt;KEYSEQ_MODIFIER&gt;
-    Type_KEYSEQ,                               ///
-
-    Type_Repeat = Type_KEYSEQ,                 /// &lt;ASSIGN_MODIFIER&gt;
-    Type_ImeLock,                              /// &lt;ASSIGN_MODIFIER&gt;
-    Type_ImeComp,                              /// &lt;ASSIGN_MODIFIER&gt;
-    Type_NumLock,                              /// &lt;ASSIGN_MODIFIER&gt;
-    Type_CapsLock,                             /// &lt;ASSIGN_MODIFIER&gt;
-    Type_ScrollLock,                           /// &lt;ASSIGN_MODIFIER&gt;
-    Type_KanaLock,                             /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Maximized,                            /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Minimized,                            /// &lt;ASSIGN_MODIFIER&gt;
-    Type_MdiMaximized,                         /// &lt;ASSIGN_MODIFIER&gt;
-    Type_MdiMinimized,                         /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Touchpad,                             /// &lt;ASSIGN_MODIFIER&gt;
-    Type_TouchpadSticky,                       /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Mod0,                                 /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Mod1,                                 /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Mod2,                                 /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Mod3,                                 /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Mod4,                                 /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Mod5,                                 /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Mod6,                                 /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Mod7,                                 /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Mod8,                                 /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Mod9,                                 /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Lock0,                                        /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Lock1,                                        /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Lock2,                                        /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Lock3,                                        /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Lock4,                                        /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Lock5,                                        /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Lock6,                                        /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Lock7,                                        /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Lock8,                                        /// &lt;ASSIGN_MODIFIER&gt;
-    Type_Lock9,                                        /// &lt;ASSIGN_MODIFIER&gt;
-    Type_ASSIGN,                               ///
-
-    Type_end = Type_ASSIGN                     ///
-  };
-  
-public:
-  ///
-  Modifier();
-  ///
-  Modifier &on(Type i_type) { return press(i_type); }
-  ///
-  Modifier &off(Type i_type) { return release(i_type); }
-  ///
-  Modifier &press(Type i_type)
-  { m_modifiers |= ((MODIFIERS(1)) << i_type); return care(i_type); }
-  ///
-  Modifier &release(Type i_type)
-  { m_modifiers &= ~((MODIFIERS(1)) << i_type); return care(i_type); }
-  ///
-  Modifier &care(Type i_type)
-  { m_dontcares &= ~((MODIFIERS(1)) << i_type); return *this; }
-  ///
-  Modifier &dontcare(Type i_type)
-  { m_dontcares |= ((MODIFIERS(1)) << i_type); return *this; }
-  /// set all modifiers to dontcare
-  Modifier &dontcare() { m_dontcares = ~MODIFIERS(0); return *this; }
-
-  ///
-  Modifier &on(Type i_type, bool i_isOn) { return press(i_type, i_isOn); }
-  ///
-  Modifier &press(Type i_type, bool i_isPressed)
-  { return i_isPressed ? press(i_type) : release(i_type); }
-  ///
-  Modifier &care(Type i_type, bool i_doCare)
-  { return i_doCare ? care(i_type) : dontcare(i_type); }
-  
-  ///
-  bool operator==(const Modifier &i_m) const
-  { return m_modifiers == i_m.m_modifiers && m_dontcares == i_m.m_dontcares; }
-
-  /// add m's modifiers where this dontcare
-  void add(const Modifier &i_m);
-  //Modifier &operator+=(const Modifier &i_m);
-
-  /** does match. (except dontcare modifiers) (is the m included in the *this
-      set ?) */
-  bool doesMatch(const Modifier &i_m) const
-  { return ((m_modifiers | m_dontcares) == (i_m.m_modifiers | m_dontcares)); }
-  
-  ///
-  bool isOn(Type i_type) const { return isPressed(i_type); }
-  ///
-  bool isPressed(Type i_type) const
-  { return !!(m_modifiers & ((MODIFIERS(1)) << i_type)); }
-  ///
-  bool isDontcare(Type i_type) const
-  { return !!(m_dontcares & ((MODIFIERS(1)) << i_type)); }
-
-  /// stream output
-  friend tostream &operator<<(tostream &i_ost, const Modifier &i_m);
-  
-  /// < 
-  bool operator<(const Modifier &i_m) const
-  {
-    return m_modifiers < i_m.m_modifiers ||
-      (m_modifiers == i_m.m_modifiers && m_dontcares < i_m.m_dontcares);
-  }
-};
-
-
-/// stream output
-tostream &operator<<(tostream &i_ost, Modifier::Type i_type);
-
-
-///
-class ModifiedKey
-{
-public:
-  Modifier m_modifier; ///
-  Key *m_key;          ///
-  
-public:
-  ///
-  ModifiedKey() : m_key(NULL) { }
-  ///
-  ModifiedKey(Key *i_key) : m_key(i_key) { }
-  ///
-  ModifiedKey(const Modifier &i_modifier, Key *i_key)
-    : m_modifier(i_modifier), m_key(i_key) { }
-  ///
-  bool operator==(const ModifiedKey &i_mk) const
-  { return m_modifier == i_mk.m_modifier && m_key == i_mk.m_key; }
-  ///
-  bool operator!=(const ModifiedKey &i_mk) const
-  { return !operator==(i_mk); }
-  
-  /// stream output
-  friend tostream &operator<<(tostream &i_ost, const ModifiedKey &i_mk);
-
-  /// < 
-  bool operator<(const ModifiedKey &i_mk) const
-  {
-    return *m_key < *i_mk.m_key ||
-      (!(*i_mk.m_key < *m_key) && m_modifier < i_mk.m_modifier);
-  }
-};
-
-
-///
-class Keyboard
-{
-public:
-  /// keyboard modifiers (pointer into Keys)
-  typedef std::list<Key *> Mods;
-
-private:
-  /** keyboard keys (hashed by first scan code).
-      Keys must be *list* of Key.
-      Because *pointers* into Keys exist anywhere in this program, the address
-      of Key's elements must be fixed.  */
-  enum {
-    HASHED_KEYS_SIZE = 128,                    ///
-  };
-  typedef std::list<Key> Keys;                 ///
-  typedef std::map<tstringi, Key *> Aliases;   /// key name aliases
-  ///
-  class Substitute
-  {
-  public:
-    ModifiedKey m_mkeyFrom;
-    ModifiedKey m_mkeyTo;
-  public:
-    Substitute(const ModifiedKey &i_mkeyFrom,
-              const ModifiedKey &i_mkeyTo)
-      : m_mkeyFrom(i_mkeyFrom), m_mkeyTo(i_mkeyTo)
-    {
-    }
-  };
-  typedef std::list<Substitute> Substitutes;   /// substitutes
-
-private:
-  Keys m_hashedKeys[HASHED_KEYS_SIZE];         ///
-  Aliases m_aliases;                           ///
-  Substitutes m_substitutes;                   /// 
-  Key m_syncKey;                               /// key used to synchronize
-  
-private:
-  ///
-  Mods m_mods[Modifier::Type_BASIC];
-
-public:
-  ///
-  class KeyIterator
-  {
-    ///
-    Keys *m_hashedKeys;
-    ///
-    size_t m_hashedKeysSize;
-    ///
-    Keys::iterator m_i;
-    
-    ///
-    void next();
-    
-  public:
-    ///
-    KeyIterator(Keys *i_hashedKeys, size_t i_hashedKeysSize);
-    ///
-    Key *operator *();
-    ///
-    void operator++() { next(); }
-  };
-  
-private:
-  ///
-  Keys &getKeys(const Key &i_key);
-
-public:
-  /// add a key
-  void addKey(const Key &i_key);
-
-  /// add a key name alias
-  void addAlias(const tstringi &i_aliasName, Key *i_key);
-  
-  /// add substitute
-  void addSubstitute(const ModifiedKey &i_mkeyFrom,
-                    const ModifiedKey &i_mkeyTo);
-  
-  /// get a sync key
-  Key *getSyncKey() { return &m_syncKey; }
-  
-  /// add a modifier key
-  void addModifier(Modifier::Type i_mt, Key * i_key);
-  
-  /// search a key
-  Key *searchKey(const Key &i_key);
-  
-  /// search a key (of which the key's scan code is the prefix)
-  Key *searchPrefixKey(const Key &i_key);
-  
-  /// search a key by name
-  Key *searchKey(const tstringi &i_name);
-
-  /// search a key by non-alias name
-  Key *searchKeyByNonAliasName(const tstringi &i_name);
-
-  /// search a substitute
-  ModifiedKey searchSubstitute(const ModifiedKey &i_mkey);
-
-  /// get modifiers
-  Mods &getModifiers(Modifier::Type i_mt) { return m_mods[i_mt]; }
-
-  /// get key iterator
-  KeyIterator getKeyIterator()
-  { return KeyIterator(&m_hashedKeys[0], HASHED_KEYS_SIZE); }
-};
-
-
-#endif // !_KEYBOARD_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// keyboard.h\r
+\r
+\r
+#ifndef _KEYBOARD_H\r
+#  define _KEYBOARD_H\r
+\r
+#  include "misc.h"\r
+#  include "driver.h"\r
+#  include "stringtool.h"\r
+#  include <vector>\r
+#  include <list>\r
+#  include <map>\r
+\r
+\r
+/// a scan code with flags\r
+class ScanCode\r
+{\r
+public:\r
+  ///\r
+  enum\r
+  {\r
+    BREAK = KEYBOARD_INPUT_DATA::BREAK,                /// key release flag\r
+    E0    = KEYBOARD_INPUT_DATA::E0,           /// extended key flag\r
+    E1    = KEYBOARD_INPUT_DATA::E1,           /// extended key flag\r
+    E0E1  = KEYBOARD_INPUT_DATA::E0E1,         /// extended key flag\r
+  };\r
+\r
+public:\r
+  USHORT m_scan;                               ///\r
+  USHORT m_flags;                              ///\r
+\r
+public:\r
+  ///\r
+  ScanCode() : m_scan(0), m_flags(0) { }\r
+  ///\r
+  ScanCode(USHORT i_scan, USHORT i_flags)\r
+    : m_scan(i_scan), m_flags(i_flags) { }\r
+  ///\r
+  bool operator==(const ScanCode &i_sc) const\r
+  {\r
+    return (m_scan == i_sc.m_scan &&\r
+           (E0E1 & m_flags) == (E0E1 & i_sc.m_flags));\r
+  }\r
+  ///\r
+  bool operator!=(const ScanCode &i_sc) const { return !(*this == i_sc); }\r
+};\r
+\r
+\r
+/// a key\r
+class Key\r
+{\r
+public:\r
+  enum\r
+  {\r
+    ///\r
+    MAX_SCAN_CODES_SIZE = 4,\r
+  };\r
+\r
+private:\r
+  ///\r
+  typedef std::vector<tstringi> Names;\r
+\r
+public:\r
+  /// if this key pressed physically\r
+  bool m_isPressed;\r
+  /// if this key pressed on Win32\r
+  bool m_isPressedOnWin32;\r
+  /// if this key pressed by assign\r
+  bool m_isPressedByAssign;\r
+\r
+private:\r
+  /// key name\r
+  Names m_names;\r
+  /// key scan code length\r
+  size_t m_scanCodesSize;\r
+  /// key scan code\r
+  ScanCode m_scanCodes[MAX_SCAN_CODES_SIZE];\r
+\r
+public:\r
+  ///\r
+  Key()\r
+    : m_isPressed(false),\r
+      m_isPressedOnWin32(false),\r
+      m_isPressedByAssign(false),\r
+      m_scanCodesSize(0)\r
+  { }\r
+\r
+  /// for Event::* only\r
+  Key(const tstringi &i_name)\r
+    : m_isPressed(false),\r
+      m_isPressedOnWin32(false),\r
+      m_isPressedByAssign(false),\r
+      m_scanCodesSize(0)\r
+  {\r
+    addName(i_name);\r
+    addScanCode(ScanCode());\r
+  }\r
+\r
+  /// get key name (first name)\r
+  const tstringi &getName() const { return m_names.front(); }\r
+\r
+  /// get scan codes\r
+  const ScanCode *getScanCodes() const { return m_scanCodes; }\r
+  ///\r
+  size_t getScanCodesSize() const { return m_scanCodesSize; }\r
+  \r
+  /// add a name of key\r
+  void addName(const tstringi &i_name);\r
+  \r
+  /// add a scan code\r
+  void addScanCode(const ScanCode &i_sc);\r
+  \r
+  /// initializer\r
+  Key &initialize();\r
+  \r
+  /// equation by name\r
+  bool operator==(const tstringi &i_name) const;\r
+  ///\r
+  bool operator!=(const tstringi &i_name) const\r
+  { return !(*this == i_name); }\r
+  \r
+  /// is the scan code of this key ?\r
+  bool isSameScanCode(const Key &i_key) const;\r
+  \r
+  /// is the i_key's scan code the prefix of this key's scan code ?\r
+  bool isPrefixScanCode(const Key &i_key) const;\r
+  \r
+  /// stream output\r
+  friend tostream &operator<<(tostream &i_ost, const Key &i_key);\r
+  \r
+  /// < \r
+  bool operator<(const Key &i_key) const\r
+  { return getName() < i_key.getName(); }\r
+};\r
+\r
+\r
+///\r
+class Modifier\r
+{\r
+  ///\r
+  typedef u_int64 MODIFIERS;\r
+  ///\r
+  MODIFIERS m_modifiers;\r
+  ///\r
+  MODIFIERS m_dontcares;\r
+  \r
+public:\r
+  ///\r
+  enum Type\r
+  {\r
+    Type_begin = 0,                            ///\r
+\r
+    Type_Shift = Type_begin,                   /// &lt;BASIC_MODIFIER&gt;\r
+    Type_Alt,                                  /// &lt;BASIC_MODIFIER&gt;\r
+    Type_Control,                              /// &lt;BASIC_MODIFIER&gt;\r
+    Type_Windows,                              /// &lt;BASIC_MODIFIER&gt;\r
+    Type_BASIC,                                        ///\r
+    \r
+    Type_Up = Type_BASIC,                      /// &lt;KEYSEQ_MODIFIER&gt;\r
+    Type_Down,                                 /// &lt;KEYSEQ_MODIFIER&gt;\r
+    Type_KEYSEQ,                               ///\r
+\r
+    Type_Repeat = Type_KEYSEQ,                 /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_ImeLock,                              /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_ImeComp,                              /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_NumLock,                              /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_CapsLock,                             /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_ScrollLock,                           /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_KanaLock,                             /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Maximized,                            /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Minimized,                            /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_MdiMaximized,                         /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_MdiMinimized,                         /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Touchpad,                             /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_TouchpadSticky,                       /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Mod0,                                 /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Mod1,                                 /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Mod2,                                 /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Mod3,                                 /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Mod4,                                 /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Mod5,                                 /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Mod6,                                 /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Mod7,                                 /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Mod8,                                 /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Mod9,                                 /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Lock0,                                        /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Lock1,                                        /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Lock2,                                        /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Lock3,                                        /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Lock4,                                        /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Lock5,                                        /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Lock6,                                        /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Lock7,                                        /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Lock8,                                        /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_Lock9,                                        /// &lt;ASSIGN_MODIFIER&gt;\r
+    Type_ASSIGN,                               ///\r
+\r
+    Type_end = Type_ASSIGN                     ///\r
+  };\r
+  \r
+public:\r
+  ///\r
+  Modifier();\r
+  ///\r
+  Modifier &on(Type i_type) { return press(i_type); }\r
+  ///\r
+  Modifier &off(Type i_type) { return release(i_type); }\r
+  ///\r
+  Modifier &press(Type i_type)\r
+  { m_modifiers |= ((MODIFIERS(1)) << i_type); return care(i_type); }\r
+  ///\r
+  Modifier &release(Type i_type)\r
+  { m_modifiers &= ~((MODIFIERS(1)) << i_type); return care(i_type); }\r
+  ///\r
+  Modifier &care(Type i_type)\r
+  { m_dontcares &= ~((MODIFIERS(1)) << i_type); return *this; }\r
+  ///\r
+  Modifier &dontcare(Type i_type)\r
+  { m_dontcares |= ((MODIFIERS(1)) << i_type); return *this; }\r
+  /// set all modifiers to dontcare\r
+  Modifier &dontcare() { m_dontcares = ~MODIFIERS(0); return *this; }\r
+\r
+  ///\r
+  Modifier &on(Type i_type, bool i_isOn) { return press(i_type, i_isOn); }\r
+  ///\r
+  Modifier &press(Type i_type, bool i_isPressed)\r
+  { return i_isPressed ? press(i_type) : release(i_type); }\r
+  ///\r
+  Modifier &care(Type i_type, bool i_doCare)\r
+  { return i_doCare ? care(i_type) : dontcare(i_type); }\r
+  \r
+  ///\r
+  bool operator==(const Modifier &i_m) const\r
+  { return m_modifiers == i_m.m_modifiers && m_dontcares == i_m.m_dontcares; }\r
+\r
+  /// add m's modifiers where this dontcare\r
+  void add(const Modifier &i_m);\r
+  //Modifier &operator+=(const Modifier &i_m);\r
+\r
+  /** does match. (except dontcare modifiers) (is the m included in the *this\r
+      set ?) */\r
+  bool doesMatch(const Modifier &i_m) const\r
+  { return ((m_modifiers | m_dontcares) == (i_m.m_modifiers | m_dontcares)); }\r
+  \r
+  ///\r
+  bool isOn(Type i_type) const { return isPressed(i_type); }\r
+  ///\r
+  bool isPressed(Type i_type) const\r
+  { return !!(m_modifiers & ((MODIFIERS(1)) << i_type)); }\r
+  ///\r
+  bool isDontcare(Type i_type) const\r
+  { return !!(m_dontcares & ((MODIFIERS(1)) << i_type)); }\r
+\r
+  /// stream output\r
+  friend tostream &operator<<(tostream &i_ost, const Modifier &i_m);\r
+  \r
+  /// < \r
+  bool operator<(const Modifier &i_m) const\r
+  {\r
+    return m_modifiers < i_m.m_modifiers ||\r
+      (m_modifiers == i_m.m_modifiers && m_dontcares < i_m.m_dontcares);\r
+  }\r
+};\r
+\r
+\r
+/// stream output\r
+tostream &operator<<(tostream &i_ost, Modifier::Type i_type);\r
+\r
+\r
+///\r
+class ModifiedKey\r
+{\r
+public:\r
+  Modifier m_modifier; ///\r
+  Key *m_key;          ///\r
+  \r
+public:\r
+  ///\r
+  ModifiedKey() : m_key(NULL) { }\r
+  ///\r
+  ModifiedKey(Key *i_key) : m_key(i_key) { }\r
+  ///\r
+  ModifiedKey(const Modifier &i_modifier, Key *i_key)\r
+    : m_modifier(i_modifier), m_key(i_key) { }\r
+  ///\r
+  bool operator==(const ModifiedKey &i_mk) const\r
+  { return m_modifier == i_mk.m_modifier && m_key == i_mk.m_key; }\r
+  ///\r
+  bool operator!=(const ModifiedKey &i_mk) const\r
+  { return !operator==(i_mk); }\r
+  \r
+  /// stream output\r
+  friend tostream &operator<<(tostream &i_ost, const ModifiedKey &i_mk);\r
+\r
+  /// < \r
+  bool operator<(const ModifiedKey &i_mk) const\r
+  {\r
+    return *m_key < *i_mk.m_key ||\r
+      (!(*i_mk.m_key < *m_key) && m_modifier < i_mk.m_modifier);\r
+  }\r
+};\r
+\r
+\r
+///\r
+class Keyboard\r
+{\r
+public:\r
+  /// keyboard modifiers (pointer into Keys)\r
+  typedef std::list<Key *> Mods;\r
+\r
+private:\r
+  /** keyboard keys (hashed by first scan code).\r
+      Keys must be *list* of Key.\r
+      Because *pointers* into Keys exist anywhere in this program, the address\r
+      of Key's elements must be fixed.  */\r
+  enum {\r
+    HASHED_KEYS_SIZE = 128,                    ///\r
+  };\r
+  typedef std::list<Key> Keys;                 ///\r
+  typedef std::map<tstringi, Key *> Aliases;   /// key name aliases\r
+  ///\r
+  class Substitute\r
+  {\r
+  public:\r
+    ModifiedKey m_mkeyFrom;\r
+    ModifiedKey m_mkeyTo;\r
+  public:\r
+    Substitute(const ModifiedKey &i_mkeyFrom,\r
+              const ModifiedKey &i_mkeyTo)\r
+      : m_mkeyFrom(i_mkeyFrom), m_mkeyTo(i_mkeyTo)\r
+    {\r
+    }\r
+  };\r
+  typedef std::list<Substitute> Substitutes;   /// substitutes\r
+\r
+private:\r
+  Keys m_hashedKeys[HASHED_KEYS_SIZE];         ///\r
+  Aliases m_aliases;                           ///\r
+  Substitutes m_substitutes;                   /// \r
+  Key m_syncKey;                               /// key used to synchronize\r
+  \r
+private:\r
+  ///\r
+  Mods m_mods[Modifier::Type_BASIC];\r
+\r
+public:\r
+  ///\r
+  class KeyIterator\r
+  {\r
+    ///\r
+    Keys *m_hashedKeys;\r
+    ///\r
+    size_t m_hashedKeysSize;\r
+    ///\r
+    Keys::iterator m_i;\r
+    \r
+    ///\r
+    void next();\r
+    \r
+  public:\r
+    ///\r
+    KeyIterator(Keys *i_hashedKeys, size_t i_hashedKeysSize);\r
+    ///\r
+    Key *operator *();\r
+    ///\r
+    void operator++() { next(); }\r
+  };\r
+  \r
+private:\r
+  ///\r
+  Keys &getKeys(const Key &i_key);\r
+\r
+public:\r
+  /// add a key\r
+  void addKey(const Key &i_key);\r
+\r
+  /// add a key name alias\r
+  void addAlias(const tstringi &i_aliasName, Key *i_key);\r
+  \r
+  /// add substitute\r
+  void addSubstitute(const ModifiedKey &i_mkeyFrom,\r
+                    const ModifiedKey &i_mkeyTo);\r
+  \r
+  /// get a sync key\r
+  Key *getSyncKey() { return &m_syncKey; }\r
+  \r
+  /// add a modifier key\r
+  void addModifier(Modifier::Type i_mt, Key * i_key);\r
+  \r
+  /// search a key\r
+  Key *searchKey(const Key &i_key);\r
+  \r
+  /// search a key (of which the key's scan code is the prefix)\r
+  Key *searchPrefixKey(const Key &i_key);\r
+  \r
+  /// search a key by name\r
+  Key *searchKey(const tstringi &i_name);\r
+\r
+  /// search a key by non-alias name\r
+  Key *searchKeyByNonAliasName(const tstringi &i_name);\r
+\r
+  /// search a substitute\r
+  ModifiedKey searchSubstitute(const ModifiedKey &i_mkey);\r
+\r
+  /// get modifiers\r
+  Mods &getModifiers(Modifier::Type i_mt) { return m_mods[i_mt]; }\r
+\r
+  /// get key iterator\r
+  KeyIterator getKeyIterator()\r
+  { return KeyIterator(&m_hashedKeys[0], HASHED_KEYS_SIZE); }\r
+};\r
+\r
+\r
+#endif // !_KEYBOARD_H\r
index 47d7a29..38b1346 100644 (file)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// setting.cpp
-
-
-#include "keymap.h"
-#include "errormessage.h"
-#include "stringtool.h"
-#include "setting.h"
-#include <algorithm>
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Action
-
-//
-tostream &operator<<(tostream &i_ost, const Action &i_action)
-{
-  return i_action.output(i_ost);
-}
-
-
-//
-ActionKey::ActionKey(const ModifiedKey &i_mk)
-  : m_modifiedKey(i_mk)
-{
-}
-
-//
-Action::Type ActionKey::getType() const
-{
-  return Type_key;
-}
-
-// create clone
-Action *ActionKey::clone() const
-{
-  return new ActionKey(m_modifiedKey);
-}
-
-// stream output
-tostream &ActionKey::output(tostream &i_ost) const
-{
-  return i_ost << m_modifiedKey;
-}
-
-//
-ActionKeySeq::ActionKeySeq(KeySeq *i_keySeq)
-  : m_keySeq(i_keySeq)
-{
-}
-
-//
-Action::Type ActionKeySeq::getType() const
-{
-  return Type_keySeq;
-}
-
-// create clone
-Action *ActionKeySeq::clone() const
-{
-  return new ActionKeySeq(m_keySeq);
-}
-
-// stream output
-tostream &ActionKeySeq::output(tostream &i_ost) const
-{
-  return i_ost << _T("$") << m_keySeq->getName();
-}
-
-//
-ActionFunction::ActionFunction(FunctionData *i_functionData,
-                              Modifier i_modifier)
-  : m_functionData(i_functionData),
-    m_modifier(i_modifier)
-{
-}
-
-//
-ActionFunction::~ActionFunction()
-{
-  delete m_functionData;
-}
-
-//
-Action::Type ActionFunction::getType() const
-{
-  return Type_function;
-}
-
-// create clone
-Action *ActionFunction::clone() const
-{
-  return new ActionFunction(m_functionData->clone(), m_modifier);
-}
-
-// stream output
-tostream &ActionFunction::output(tostream &i_ost) const
-{
-  return i_ost << m_modifier << m_functionData;
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// KeySeq
-
-
-void KeySeq::copy()
-{
-  for (Actions::iterator i = m_actions.begin(); i != m_actions.end(); ++ i)
-    (*i) = (*i)->clone();
-}
-
-
-void KeySeq::clear()
-{
-  for (Actions::iterator i = m_actions.begin(); i != m_actions.end(); ++ i)
-    delete (*i);
-}
-
-
-KeySeq::KeySeq(const tstringi &i_name)
-  : m_name(i_name),
-    m_mode(Modifier::Type_KEYSEQ)
-{
-}
-
-
-KeySeq::KeySeq(const KeySeq &i_ks)
-  : m_actions(i_ks.m_actions),
-    m_name(i_ks.m_name),
-    m_mode(i_ks.m_mode)
-{
-  copy();
-}
-
-
-KeySeq::~KeySeq()
-{
-  clear();
-}
-
-
-KeySeq &KeySeq::operator=(const KeySeq &i_ks)
-{
-  if (this != &i_ks)
-  {
-    clear();
-    m_actions = i_ks.m_actions;
-    m_mode = i_ks.m_mode;
-    copy();
-  }
-  return *this;
-}
-
-
-KeySeq &KeySeq::add(const Action &i_action)
-{
-  m_actions.push_back(i_action.clone());
-  return *this;
-}
-
-
-/// get the first modified key of this key sequence
-ModifiedKey KeySeq::getFirstModifiedKey() const
-{
-  if (0 < m_actions.size())
-  {
-    const Action *a = m_actions.front();
-    switch (a->getType())
-    {
-      case Action::Type_key:
-       return reinterpret_cast<const ActionKey *>(a)->m_modifiedKey;
-      case Action::Type_keySeq:
-       return reinterpret_cast<const ActionKeySeq *>(a)->
-         m_keySeq->getFirstModifiedKey();
-      default:
-       break;
-    }
-  }
-  return ModifiedKey();                                // failed
-}
-
-
-// stream output
-tostream &operator<<(tostream &i_ost, const KeySeq &i_ks)
-{
-  for (KeySeq::Actions::const_iterator
-        i = i_ks.m_actions.begin(); i != i_ks.m_actions.end(); ++ i)
-    i_ost << **i << _T(" ");
-  return i_ost;
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Keymap
-
-
-Keymap::KeyAssignments &Keymap::getKeyAssignments(const ModifiedKey &i_mk)
-{
-  ASSERT(1 <= i_mk.m_key->getScanCodesSize());
-  return m_hashedKeyAssignments[i_mk.m_key->getScanCodes()->m_scan %
-                              HASHED_KEY_ASSIGNMENT_SIZE];
-}
-
-const Keymap::KeyAssignments &
-Keymap::getKeyAssignments(const ModifiedKey &i_mk) const
-{
-  ASSERT(1 <= i_mk.m_key->getScanCodesSize());
-  return m_hashedKeyAssignments[i_mk.m_key->getScanCodes()->m_scan %
-                              HASHED_KEY_ASSIGNMENT_SIZE];
-}
-
-
-Keymap::Keymap(Type i_type,
-              const tstringi &i_name,
-              const tstringi &i_windowClass,
-              const tstringi &i_windowTitle,
-              KeySeq *i_defaultKeySeq,
-              Keymap *i_parentKeymap)
-  : m_type(i_type),
-    m_name(i_name),
-    m_defaultKeySeq(i_defaultKeySeq),
-    m_parentKeymap(i_parentKeymap),
-    m_windowClass(_T(".*")),
-    m_windowTitle(_T(".*"))
-{
-  if (i_type == Type_windowAnd || i_type == Type_windowOr)
-    try
-    {
-      tregex::flag_type f = (tregex::normal | 
-                            tregex::icase);
-      if (!i_windowClass.empty())
-       m_windowClass.assign(i_windowClass, f);
-      if (!i_windowTitle.empty())
-       m_windowTitle.assign(i_windowTitle, f);
-    }
-    catch (boost::bad_expression &i_e)
-    {
-      throw ErrorMessage() << i_e.what();
-    }
-}
-
-
-// add a key assignment;
-void Keymap::addAssignment(const ModifiedKey &i_mk, KeySeq *i_keySeq)
-{
-  KeyAssignments &ka = getKeyAssignments(i_mk);
-  for (KeyAssignments::iterator i = ka.begin(); i != ka.end(); ++ i)
-    if ((*i).m_modifiedKey == i_mk)
-    {
-      (*i).m_keySeq = i_keySeq;
-      return;
-    }
-  ka.push_front(KeyAssignment(i_mk, i_keySeq));
-}
-
-
-// add modifier
-void Keymap::addModifier(Modifier::Type i_mt, AssignOperator i_ao,
-                        AssignMode i_am, Key *i_key)
-{
-  if (i_ao == AO_new)
-    m_modAssignments[i_mt].clear();
-  else
-  {
-    for (ModAssignments::iterator i = m_modAssignments[i_mt].begin();
-        i != m_modAssignments[i_mt].end(); ++ i)
-      if ((*i).m_key == i_key)
-      {
-       (*i).m_assignOperator = i_ao;
-       (*i).m_assignMode = i_am;
-       return;
-      }
-  }
-  ModAssignment ma;
-  ma.m_assignOperator = i_ao;
-  ma.m_assignMode = i_am;
-  ma.m_key = i_key;
-  m_modAssignments[i_mt].push_back(ma);
-}
-
-  
-// search
-const Keymap::KeyAssignment *
-Keymap::searchAssignment(const ModifiedKey &i_mk) const
-{
-  const KeyAssignments &ka = getKeyAssignments(i_mk);
-  for (KeyAssignments::const_iterator i = ka.begin(); i != ka.end(); ++ i)
-    if ((*i).m_modifiedKey.m_key == i_mk.m_key &&
-       (*i).m_modifiedKey.m_modifier.doesMatch(i_mk.m_modifier))
-      return &(*i);
-  return NULL;
-}
-
-
-// does same window
-bool Keymap::doesSameWindow(const tstringi i_className,
-                           const tstringi &i_titleName)
-{
-  if (m_type == Type_keymap)
-    return false;
-
-  tsmatch what;
-  if (boost::regex_search(i_className, what, m_windowClass))
-  {
-    if (m_type == Type_windowAnd)
-      return boost::regex_search(i_titleName, what, m_windowTitle);
-    else // type == Type_windowOr
-      return true;
-  }
-  else
-  {
-    if (m_type == Type_windowAnd)
-      return false;
-    else // type == Type_windowOr
-      return boost::regex_search(i_titleName, what, m_windowTitle);
-  }
-}
-
-
-// adjust modifier
-void Keymap::adjustModifier(Keyboard &i_keyboard)
-{
-  for (size_t i = 0; i < NUMBER_OF(m_modAssignments); ++ i)
-  {
-    ModAssignments mos;
-    if (m_parentKeymap)
-      mos = m_parentKeymap->m_modAssignments[i];
-    else
-    {
-      // set default modifiers
-      if (i < Modifier::Type_BASIC)
-      {
-       Keyboard::Mods mods =
-         i_keyboard.getModifiers(static_cast<Modifier::Type>(i));
-       for (Keyboard::Mods::iterator j = mods.begin(); j != mods.end(); ++ j)
-       {
-         ModAssignment ma;
-         ma.m_assignOperator = AO_add;
-         ma.m_assignMode = AM_normal;
-         ma.m_key = *j;
-         mos.push_back(ma);
-       }
-      }
-    }
-    
-    // mod adjust
-    for (ModAssignments::iterator mai = m_modAssignments[i].begin();
-        mai != m_modAssignments[i].end(); ++ mai)
-    {
-      ModAssignment ma = *mai;
-      ma.m_assignOperator = AO_new;
-      switch ((*mai).m_assignOperator)
-      {
-       case AO_new:
-       {
-         mos.clear();
-         mos.push_back(ma);
-         break;
-       }
-       case AO_add:
-       {
-         mos.push_back(ma);
-         break;
-       }
-       case AO_sub:
-       {
-         for (ModAssignments::iterator j = mos.begin();
-              j != mos.end(); ++ j)
-           if ((*j).m_key == ma.m_key)
-           {
-             mos.erase(j);
-             break;
-           }
-         break;
-       }
-       case AO_overwrite:
-       {
-         for (ModAssignments::iterator j = mos.begin();
-              j != mos.end(); ++ j)
-           (*j).m_assignMode = (*mai).m_assignMode;
-         break;
-       }
-      }
-    }
-
-    // erase redundant modifiers
-    for (ModAssignments::iterator j = mos.begin(); j != mos.end(); ++ j)
-    {
-      ModAssignments::iterator k;
-      for (k = j, ++ k; k != mos.end(); ++ k)
-       if ((*k).m_key == (*j).m_key)
-         break;
-      if (k != mos.end())
-      {
-       k = j;
-       ++ j;
-       mos.erase(k);
-       break;
-      }
-    }
-    
-    m_modAssignments[i] = mos;
-  }
-}
-
-
-// describe
-void Keymap::describe(tostream &i_ost, DescribeParam *i_dp) const
-{
-  // Is this keymap already described ?
-  {
-    DescribeParam::DescribedKeymap::iterator
-      i = std::find(i_dp->m_dkeymap.begin(), i_dp->m_dkeymap.end(), this);
-    if (i != i_dp->m_dkeymap.end())
-      return;                                  // yes!
-    i_dp->m_dkeymap.push_back(this);
-  }
-
-  switch (m_type)
-  {
-    case Type_keymap:
-      i_ost << _T("keymap ") << m_name;
-      break;
-    case Type_windowAnd:
-      i_ost << _T("window ") << m_name << _T(" ");
-      if (m_windowTitle.str() == _T(".*"))
-       i_ost << _T("/") << m_windowClass.str() << _T("/");
-      else
-       i_ost << _T("( /") << m_windowClass.str() << _T("/ && /")
-             << m_windowTitle.str() << _T("/ )");
-      break;
-    case Type_windowOr:
-      i_ost << _T("window ") << m_name << _T(" ( /")
-           << m_windowClass.str() << _T("/ || /") << m_windowTitle.str()
-           << _T("/ )");
-      break;
-  }
-  if (m_parentKeymap)
-    i_ost << _T(" : ") << m_parentKeymap->m_name;
-  i_ost << _T(" = ") << *m_defaultKeySeq << std::endl;
-
-  // describe modifiers
-  if (i_dp->m_doesDescribeModifiers)
-  {
-    for (int t = Modifier::Type_begin; t != Modifier::Type_end; ++ t)
-    {
-      Modifier::Type type = static_cast<Modifier::Type>(t);
-      const Keymap::ModAssignments &ma = getModAssignments(type);
-      if (ma.size())
-      {
-       i_ost << _T(" mod ") << type << _T("\t= ");
-       for (Keymap::ModAssignments::const_iterator
-              j = ma.begin(); j != ma.end(); ++ j)
-       {
-         switch (j->m_assignMode)
-         {
-           case Keymap::AM_true: i_ost << _T("!"); break;
-           case Keymap::AM_oneShot: i_ost << _T("!!"); break;
-           case Keymap::AM_oneShotRepeatable: i_ost << _T("!!!"); break;
-           default:
-             break;
-         }
-         i_ost << *j->m_key << _T(" ");
-       }
-       i_ost << std::endl;
-      }
-    }
-    i_dp->m_doesDescribeModifiers = false;
-  }
-  
-  typedef std::vector<KeyAssignment> SortedKeyAssignments;
-  SortedKeyAssignments ska;
-  for (size_t i = 0; i < HASHED_KEY_ASSIGNMENT_SIZE; ++ i)
-  {
-    const KeyAssignments &ka = m_hashedKeyAssignments[i];
-    for (KeyAssignments::const_iterator j = ka.begin(); j != ka.end(); ++ j)
-      ska.push_back(*j);
-  }
-  std::sort(ska.begin(), ska.end());
-  for (SortedKeyAssignments::iterator i = ska.begin(); i != ska.end(); ++ i)
-  {
-    // Is this key assignment already described ?
-    DescribeParam::DescribedKeys::iterator
-      j = std::find(i_dp->m_dk.begin(), i_dp->m_dk.end(), i->m_modifiedKey);
-    if (j != i_dp->m_dk.end())
-      continue;                                        // yes!
-
-    // check if the key is an event
-    Key **e;
-    for (e = Event::events; *e; ++ e)
-      if (i->m_modifiedKey.m_key == *e)
-       break;
-    if (*e)
-      i_ost << _T(" event ") << *i->m_modifiedKey.m_key;
-    else
-      i_ost << _T(" key ") << i->m_modifiedKey;
-    i_ost << _T("\t= ") << *i->m_keySeq << std::endl;
-    i_dp->m_dk.push_back(i->m_modifiedKey);
-  }
-
-  i_ost << std::endl;
-  
-  if (m_parentKeymap)
-    m_parentKeymap->describe(i_ost, i_dp);
-}
-
-// set default keySeq and parent keymap if default keySeq has not been set
-bool Keymap::setIfNotYet(KeySeq *i_keySeq, Keymap *i_parentKeymap)
-{
-  if (m_defaultKeySeq)
-    return false;
-  m_defaultKeySeq = i_keySeq;
-  m_parentKeymap = i_parentKeymap;
-  return true;
-}
-
-// stream output
-extern tostream &operator<<(tostream &i_ost, const Keymap *i_keymap)
-{
-  return i_ost << i_keymap->getName();
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Keymaps
-
-
-Keymaps::Keymaps()
-{
-}
-
-
-// search by name
-Keymap *Keymaps::searchByName(const tstringi &i_name)
-{
-  for (KeymapList::iterator
-        i = m_keymapList.begin(); i != m_keymapList.end(); ++ i)
-    if ((*i).getName() == i_name)
-      return &*i;
-  return NULL;
-}
-
-
-// search window
-void Keymaps::searchWindow(KeymapPtrList *o_keymapPtrList,
-                          const tstringi &i_className,
-                          const tstringi &i_titleName)
-{
-  o_keymapPtrList->clear();
-  for (KeymapList::iterator
-        i = m_keymapList.begin(); i != m_keymapList.end(); ++ i)
-    if ((*i).doesSameWindow(i_className, i_titleName))
-      o_keymapPtrList->push_back(&(*i));
-}
-
-
-// add keymap
-Keymap *Keymaps::add(const Keymap &i_keymap)
-{
-  if (Keymap *k = searchByName(i_keymap.getName()))
-    return k;
-  m_keymapList.push_front(i_keymap);
-  return &m_keymapList.front();
-}
-
-
-// adjust modifier
-void Keymaps::adjustModifier(Keyboard &i_keyboard)
-{
-  for (KeymapList::reverse_iterator i = m_keymapList.rbegin();
-       i != m_keymapList.rend(); ++ i)
-    (*i).adjustModifier(i_keyboard);
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// KeySeqs
-
-
-// add a named keyseq (name can be empty)
-KeySeq *KeySeqs::add(const KeySeq &i_keySeq)
-{
-  if (!i_keySeq.getName().empty())
-  {
-    KeySeq *ks = searchByName(i_keySeq.getName());
-    if (ks)
-      return &(*ks = i_keySeq);
-  }
-  m_keySeqList.push_front(i_keySeq);
-  return &m_keySeqList.front();
-}
-
-
-// search by name
-KeySeq *KeySeqs::searchByName(const tstringi &i_name)
-{
-  for (KeySeqList::iterator
-        i = m_keySeqList.begin(); i != m_keySeqList.end(); ++ i)
-    if ((*i).getName() == i_name)
-      return &(*i);
-  return NULL;
-}
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// setting.cpp\r
+\r
+\r
+#include "keymap.h"\r
+#include "errormessage.h"\r
+#include "stringtool.h"\r
+#include "setting.h"\r
+#include <algorithm>\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Action\r
+\r
+//\r
+tostream &operator<<(tostream &i_ost, const Action &i_action)\r
+{\r
+  return i_action.output(i_ost);\r
+}\r
+\r
+\r
+//\r
+ActionKey::ActionKey(const ModifiedKey &i_mk)\r
+  : m_modifiedKey(i_mk)\r
+{\r
+}\r
+\r
+//\r
+Action::Type ActionKey::getType() const\r
+{\r
+  return Type_key;\r
+}\r
+\r
+// create clone\r
+Action *ActionKey::clone() const\r
+{\r
+  return new ActionKey(m_modifiedKey);\r
+}\r
+\r
+// stream output\r
+tostream &ActionKey::output(tostream &i_ost) const\r
+{\r
+  return i_ost << m_modifiedKey;\r
+}\r
+\r
+//\r
+ActionKeySeq::ActionKeySeq(KeySeq *i_keySeq)\r
+  : m_keySeq(i_keySeq)\r
+{\r
+}\r
+\r
+//\r
+Action::Type ActionKeySeq::getType() const\r
+{\r
+  return Type_keySeq;\r
+}\r
+\r
+// create clone\r
+Action *ActionKeySeq::clone() const\r
+{\r
+  return new ActionKeySeq(m_keySeq);\r
+}\r
+\r
+// stream output\r
+tostream &ActionKeySeq::output(tostream &i_ost) const\r
+{\r
+  return i_ost << _T("$") << m_keySeq->getName();\r
+}\r
+\r
+//\r
+ActionFunction::ActionFunction(FunctionData *i_functionData,\r
+                              Modifier i_modifier)\r
+  : m_functionData(i_functionData),\r
+    m_modifier(i_modifier)\r
+{\r
+}\r
+\r
+//\r
+ActionFunction::~ActionFunction()\r
+{\r
+  delete m_functionData;\r
+}\r
+\r
+//\r
+Action::Type ActionFunction::getType() const\r
+{\r
+  return Type_function;\r
+}\r
+\r
+// create clone\r
+Action *ActionFunction::clone() const\r
+{\r
+  return new ActionFunction(m_functionData->clone(), m_modifier);\r
+}\r
+\r
+// stream output\r
+tostream &ActionFunction::output(tostream &i_ost) const\r
+{\r
+  return i_ost << m_modifier << m_functionData;\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// KeySeq\r
+\r
+\r
+void KeySeq::copy()\r
+{\r
+  for (Actions::iterator i = m_actions.begin(); i != m_actions.end(); ++ i)\r
+    (*i) = (*i)->clone();\r
+}\r
+\r
+\r
+void KeySeq::clear()\r
+{\r
+  for (Actions::iterator i = m_actions.begin(); i != m_actions.end(); ++ i)\r
+    delete (*i);\r
+}\r
+\r
+\r
+KeySeq::KeySeq(const tstringi &i_name)\r
+  : m_name(i_name),\r
+    m_mode(Modifier::Type_KEYSEQ)\r
+{\r
+}\r
+\r
+\r
+KeySeq::KeySeq(const KeySeq &i_ks)\r
+  : m_actions(i_ks.m_actions),\r
+    m_name(i_ks.m_name),\r
+    m_mode(i_ks.m_mode)\r
+{\r
+  copy();\r
+}\r
+\r
+\r
+KeySeq::~KeySeq()\r
+{\r
+  clear();\r
+}\r
+\r
+\r
+KeySeq &KeySeq::operator=(const KeySeq &i_ks)\r
+{\r
+  if (this != &i_ks)\r
+  {\r
+    clear();\r
+    m_actions = i_ks.m_actions;\r
+    m_mode = i_ks.m_mode;\r
+    copy();\r
+  }\r
+  return *this;\r
+}\r
+\r
+\r
+KeySeq &KeySeq::add(const Action &i_action)\r
+{\r
+  m_actions.push_back(i_action.clone());\r
+  return *this;\r
+}\r
+\r
+\r
+/// get the first modified key of this key sequence\r
+ModifiedKey KeySeq::getFirstModifiedKey() const\r
+{\r
+  if (0 < m_actions.size())\r
+  {\r
+    const Action *a = m_actions.front();\r
+    switch (a->getType())\r
+    {\r
+      case Action::Type_key:\r
+       return reinterpret_cast<const ActionKey *>(a)->m_modifiedKey;\r
+      case Action::Type_keySeq:\r
+       return reinterpret_cast<const ActionKeySeq *>(a)->\r
+         m_keySeq->getFirstModifiedKey();\r
+      default:\r
+       break;\r
+    }\r
+  }\r
+  return ModifiedKey();                                // failed\r
+}\r
+\r
+\r
+// stream output\r
+tostream &operator<<(tostream &i_ost, const KeySeq &i_ks)\r
+{\r
+  for (KeySeq::Actions::const_iterator\r
+        i = i_ks.m_actions.begin(); i != i_ks.m_actions.end(); ++ i)\r
+    i_ost << **i << _T(" ");\r
+  return i_ost;\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Keymap\r
+\r
+\r
+Keymap::KeyAssignments &Keymap::getKeyAssignments(const ModifiedKey &i_mk)\r
+{\r
+  ASSERT(1 <= i_mk.m_key->getScanCodesSize());\r
+  return m_hashedKeyAssignments[i_mk.m_key->getScanCodes()->m_scan %\r
+                              HASHED_KEY_ASSIGNMENT_SIZE];\r
+}\r
+\r
+const Keymap::KeyAssignments &\r
+Keymap::getKeyAssignments(const ModifiedKey &i_mk) const\r
+{\r
+  ASSERT(1 <= i_mk.m_key->getScanCodesSize());\r
+  return m_hashedKeyAssignments[i_mk.m_key->getScanCodes()->m_scan %\r
+                              HASHED_KEY_ASSIGNMENT_SIZE];\r
+}\r
+\r
+\r
+Keymap::Keymap(Type i_type,\r
+              const tstringi &i_name,\r
+              const tstringi &i_windowClass,\r
+              const tstringi &i_windowTitle,\r
+              KeySeq *i_defaultKeySeq,\r
+              Keymap *i_parentKeymap)\r
+  : m_type(i_type),\r
+    m_name(i_name),\r
+    m_defaultKeySeq(i_defaultKeySeq),\r
+    m_parentKeymap(i_parentKeymap),\r
+    m_windowClass(_T(".*")),\r
+    m_windowTitle(_T(".*"))\r
+{\r
+  if (i_type == Type_windowAnd || i_type == Type_windowOr)\r
+    try\r
+    {\r
+      tregex::flag_type f = (tregex::normal | \r
+                            tregex::icase);\r
+      if (!i_windowClass.empty())\r
+       m_windowClass.assign(i_windowClass, f);\r
+      if (!i_windowTitle.empty())\r
+       m_windowTitle.assign(i_windowTitle, f);\r
+    }\r
+    catch (boost::bad_expression &i_e)\r
+    {\r
+      throw ErrorMessage() << i_e.what();\r
+    }\r
+}\r
+\r
+\r
+// add a key assignment;\r
+void Keymap::addAssignment(const ModifiedKey &i_mk, KeySeq *i_keySeq)\r
+{\r
+  KeyAssignments &ka = getKeyAssignments(i_mk);\r
+  for (KeyAssignments::iterator i = ka.begin(); i != ka.end(); ++ i)\r
+    if ((*i).m_modifiedKey == i_mk)\r
+    {\r
+      (*i).m_keySeq = i_keySeq;\r
+      return;\r
+    }\r
+  ka.push_front(KeyAssignment(i_mk, i_keySeq));\r
+}\r
+\r
+\r
+// add modifier\r
+void Keymap::addModifier(Modifier::Type i_mt, AssignOperator i_ao,\r
+                        AssignMode i_am, Key *i_key)\r
+{\r
+  if (i_ao == AO_new)\r
+    m_modAssignments[i_mt].clear();\r
+  else\r
+  {\r
+    for (ModAssignments::iterator i = m_modAssignments[i_mt].begin();\r
+        i != m_modAssignments[i_mt].end(); ++ i)\r
+      if ((*i).m_key == i_key)\r
+      {\r
+       (*i).m_assignOperator = i_ao;\r
+       (*i).m_assignMode = i_am;\r
+       return;\r
+      }\r
+  }\r
+  ModAssignment ma;\r
+  ma.m_assignOperator = i_ao;\r
+  ma.m_assignMode = i_am;\r
+  ma.m_key = i_key;\r
+  m_modAssignments[i_mt].push_back(ma);\r
+}\r
+\r
+  \r
+// search\r
+const Keymap::KeyAssignment *\r
+Keymap::searchAssignment(const ModifiedKey &i_mk) const\r
+{\r
+  const KeyAssignments &ka = getKeyAssignments(i_mk);\r
+  for (KeyAssignments::const_iterator i = ka.begin(); i != ka.end(); ++ i)\r
+    if ((*i).m_modifiedKey.m_key == i_mk.m_key &&\r
+       (*i).m_modifiedKey.m_modifier.doesMatch(i_mk.m_modifier))\r
+      return &(*i);\r
+  return NULL;\r
+}\r
+\r
+\r
+// does same window\r
+bool Keymap::doesSameWindow(const tstringi i_className,\r
+                           const tstringi &i_titleName)\r
+{\r
+  if (m_type == Type_keymap)\r
+    return false;\r
+\r
+  tsmatch what;\r
+  if (boost::regex_search(i_className, what, m_windowClass))\r
+  {\r
+    if (m_type == Type_windowAnd)\r
+      return boost::regex_search(i_titleName, what, m_windowTitle);\r
+    else // type == Type_windowOr\r
+      return true;\r
+  }\r
+  else\r
+  {\r
+    if (m_type == Type_windowAnd)\r
+      return false;\r
+    else // type == Type_windowOr\r
+      return boost::regex_search(i_titleName, what, m_windowTitle);\r
+  }\r
+}\r
+\r
+\r
+// adjust modifier\r
+void Keymap::adjustModifier(Keyboard &i_keyboard)\r
+{\r
+  for (size_t i = 0; i < NUMBER_OF(m_modAssignments); ++ i)\r
+  {\r
+    ModAssignments mos;\r
+    if (m_parentKeymap)\r
+      mos = m_parentKeymap->m_modAssignments[i];\r
+    else\r
+    {\r
+      // set default modifiers\r
+      if (i < Modifier::Type_BASIC)\r
+      {\r
+       Keyboard::Mods mods =\r
+         i_keyboard.getModifiers(static_cast<Modifier::Type>(i));\r
+       for (Keyboard::Mods::iterator j = mods.begin(); j != mods.end(); ++ j)\r
+       {\r
+         ModAssignment ma;\r
+         ma.m_assignOperator = AO_add;\r
+         ma.m_assignMode = AM_normal;\r
+         ma.m_key = *j;\r
+         mos.push_back(ma);\r
+       }\r
+      }\r
+    }\r
+    \r
+    // mod adjust\r
+    for (ModAssignments::iterator mai = m_modAssignments[i].begin();\r
+        mai != m_modAssignments[i].end(); ++ mai)\r
+    {\r
+      ModAssignment ma = *mai;\r
+      ma.m_assignOperator = AO_new;\r
+      switch ((*mai).m_assignOperator)\r
+      {\r
+       case AO_new:\r
+       {\r
+         mos.clear();\r
+         mos.push_back(ma);\r
+         break;\r
+       }\r
+       case AO_add:\r
+       {\r
+         mos.push_back(ma);\r
+         break;\r
+       }\r
+       case AO_sub:\r
+       {\r
+         for (ModAssignments::iterator j = mos.begin();\r
+              j != mos.end(); ++ j)\r
+           if ((*j).m_key == ma.m_key)\r
+           {\r
+             mos.erase(j);\r
+             break;\r
+           }\r
+         break;\r
+       }\r
+       case AO_overwrite:\r
+       {\r
+         for (ModAssignments::iterator j = mos.begin();\r
+              j != mos.end(); ++ j)\r
+           (*j).m_assignMode = (*mai).m_assignMode;\r
+         break;\r
+       }\r
+      }\r
+    }\r
+\r
+    // erase redundant modifiers\r
+    for (ModAssignments::iterator j = mos.begin(); j != mos.end(); ++ j)\r
+    {\r
+      ModAssignments::iterator k;\r
+      for (k = j, ++ k; k != mos.end(); ++ k)\r
+       if ((*k).m_key == (*j).m_key)\r
+         break;\r
+      if (k != mos.end())\r
+      {\r
+       k = j;\r
+       ++ j;\r
+       mos.erase(k);\r
+       break;\r
+      }\r
+    }\r
+    \r
+    m_modAssignments[i] = mos;\r
+  }\r
+}\r
+\r
+\r
+// describe\r
+void Keymap::describe(tostream &i_ost, DescribeParam *i_dp) const\r
+{\r
+  // Is this keymap already described ?\r
+  {\r
+    DescribeParam::DescribedKeymap::iterator\r
+      i = std::find(i_dp->m_dkeymap.begin(), i_dp->m_dkeymap.end(), this);\r
+    if (i != i_dp->m_dkeymap.end())\r
+      return;                                  // yes!\r
+    i_dp->m_dkeymap.push_back(this);\r
+  }\r
+\r
+  switch (m_type)\r
+  {\r
+    case Type_keymap:\r
+      i_ost << _T("keymap ") << m_name;\r
+      break;\r
+    case Type_windowAnd:\r
+      i_ost << _T("window ") << m_name << _T(" ");\r
+      if (m_windowTitle.str() == _T(".*"))\r
+       i_ost << _T("/") << m_windowClass.str() << _T("/");\r
+      else\r
+       i_ost << _T("( /") << m_windowClass.str() << _T("/ && /")\r
+             << m_windowTitle.str() << _T("/ )");\r
+      break;\r
+    case Type_windowOr:\r
+      i_ost << _T("window ") << m_name << _T(" ( /")\r
+           << m_windowClass.str() << _T("/ || /") << m_windowTitle.str()\r
+           << _T("/ )");\r
+      break;\r
+  }\r
+  if (m_parentKeymap)\r
+    i_ost << _T(" : ") << m_parentKeymap->m_name;\r
+  i_ost << _T(" = ") << *m_defaultKeySeq << std::endl;\r
+\r
+  // describe modifiers\r
+  if (i_dp->m_doesDescribeModifiers)\r
+  {\r
+    for (int t = Modifier::Type_begin; t != Modifier::Type_end; ++ t)\r
+    {\r
+      Modifier::Type type = static_cast<Modifier::Type>(t);\r
+      const Keymap::ModAssignments &ma = getModAssignments(type);\r
+      if (ma.size())\r
+      {\r
+       i_ost << _T(" mod ") << type << _T("\t= ");\r
+       for (Keymap::ModAssignments::const_iterator\r
+              j = ma.begin(); j != ma.end(); ++ j)\r
+       {\r
+         switch (j->m_assignMode)\r
+         {\r
+           case Keymap::AM_true: i_ost << _T("!"); break;\r
+           case Keymap::AM_oneShot: i_ost << _T("!!"); break;\r
+           case Keymap::AM_oneShotRepeatable: i_ost << _T("!!!"); break;\r
+           default:\r
+             break;\r
+         }\r
+         i_ost << *j->m_key << _T(" ");\r
+       }\r
+       i_ost << std::endl;\r
+      }\r
+    }\r
+    i_dp->m_doesDescribeModifiers = false;\r
+  }\r
+  \r
+  typedef std::vector<KeyAssignment> SortedKeyAssignments;\r
+  SortedKeyAssignments ska;\r
+  for (size_t i = 0; i < HASHED_KEY_ASSIGNMENT_SIZE; ++ i)\r
+  {\r
+    const KeyAssignments &ka = m_hashedKeyAssignments[i];\r
+    for (KeyAssignments::const_iterator j = ka.begin(); j != ka.end(); ++ j)\r
+      ska.push_back(*j);\r
+  }\r
+  std::sort(ska.begin(), ska.end());\r
+  for (SortedKeyAssignments::iterator i = ska.begin(); i != ska.end(); ++ i)\r
+  {\r
+    // Is this key assignment already described ?\r
+    DescribeParam::DescribedKeys::iterator\r
+      j = std::find(i_dp->m_dk.begin(), i_dp->m_dk.end(), i->m_modifiedKey);\r
+    if (j != i_dp->m_dk.end())\r
+      continue;                                        // yes!\r
+\r
+    // check if the key is an event\r
+    Key **e;\r
+    for (e = Event::events; *e; ++ e)\r
+      if (i->m_modifiedKey.m_key == *e)\r
+       break;\r
+    if (*e)\r
+      i_ost << _T(" event ") << *i->m_modifiedKey.m_key;\r
+    else\r
+      i_ost << _T(" key ") << i->m_modifiedKey;\r
+    i_ost << _T("\t= ") << *i->m_keySeq << std::endl;\r
+    i_dp->m_dk.push_back(i->m_modifiedKey);\r
+  }\r
+\r
+  i_ost << std::endl;\r
+  \r
+  if (m_parentKeymap)\r
+    m_parentKeymap->describe(i_ost, i_dp);\r
+}\r
+\r
+// set default keySeq and parent keymap if default keySeq has not been set\r
+bool Keymap::setIfNotYet(KeySeq *i_keySeq, Keymap *i_parentKeymap)\r
+{\r
+  if (m_defaultKeySeq)\r
+    return false;\r
+  m_defaultKeySeq = i_keySeq;\r
+  m_parentKeymap = i_parentKeymap;\r
+  return true;\r
+}\r
+\r
+// stream output\r
+extern tostream &operator<<(tostream &i_ost, const Keymap *i_keymap)\r
+{\r
+  return i_ost << i_keymap->getName();\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Keymaps\r
+\r
+\r
+Keymaps::Keymaps()\r
+{\r
+}\r
+\r
+\r
+// search by name\r
+Keymap *Keymaps::searchByName(const tstringi &i_name)\r
+{\r
+  for (KeymapList::iterator\r
+        i = m_keymapList.begin(); i != m_keymapList.end(); ++ i)\r
+    if ((*i).getName() == i_name)\r
+      return &*i;\r
+  return NULL;\r
+}\r
+\r
+\r
+// search window\r
+void Keymaps::searchWindow(KeymapPtrList *o_keymapPtrList,\r
+                          const tstringi &i_className,\r
+                          const tstringi &i_titleName)\r
+{\r
+  o_keymapPtrList->clear();\r
+  for (KeymapList::iterator\r
+        i = m_keymapList.begin(); i != m_keymapList.end(); ++ i)\r
+    if ((*i).doesSameWindow(i_className, i_titleName))\r
+      o_keymapPtrList->push_back(&(*i));\r
+}\r
+\r
+\r
+// add keymap\r
+Keymap *Keymaps::add(const Keymap &i_keymap)\r
+{\r
+  if (Keymap *k = searchByName(i_keymap.getName()))\r
+    return k;\r
+  m_keymapList.push_front(i_keymap);\r
+  return &m_keymapList.front();\r
+}\r
+\r
+\r
+// adjust modifier\r
+void Keymaps::adjustModifier(Keyboard &i_keyboard)\r
+{\r
+  for (KeymapList::reverse_iterator i = m_keymapList.rbegin();\r
+       i != m_keymapList.rend(); ++ i)\r
+    (*i).adjustModifier(i_keyboard);\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// KeySeqs\r
+\r
+\r
+// add a named keyseq (name can be empty)\r
+KeySeq *KeySeqs::add(const KeySeq &i_keySeq)\r
+{\r
+  if (!i_keySeq.getName().empty())\r
+  {\r
+    KeySeq *ks = searchByName(i_keySeq.getName());\r
+    if (ks)\r
+      return &(*ks = i_keySeq);\r
+  }\r
+  m_keySeqList.push_front(i_keySeq);\r
+  return &m_keySeqList.front();\r
+}\r
+\r
+\r
+// search by name\r
+KeySeq *KeySeqs::searchByName(const tstringi &i_name)\r
+{\r
+  for (KeySeqList::iterator\r
+        i = m_keySeqList.begin(); i != m_keySeqList.end(); ++ i)\r
+    if ((*i).getName() == i_name)\r
+      return &(*i);\r
+  return NULL;\r
+}\r
index e5c5cd0..74eb1ca 100644 (file)
--- a/keymap.h
+++ b/keymap.h
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// keymap.h
-
-
-#ifndef _KEYMAP_H
-#  define _KEYMAP_H
-
-#  include "keyboard.h"
-#  include "function.h"
-#  include <vector>
-
-
-///
-class Action
-{
-public:
-  ///
-  enum Type
-  {
-    Type_key,                                  ///
-    Type_keySeq,                               ///
-    Type_function,                             ///
-  };
-
-private:
-  Action(const Action &i_action);
-  
-public:
-  Action() { }
-  ///
-  virtual ~Action() { }
-  ///
-  virtual Type getType() const = 0;
-  /// create clone
-  virtual Action *clone() const = 0;
-  /// stream output
-  virtual tostream &output(tostream &i_ost) const = 0;
-};
-
-///
-tostream &operator<<(tostream &i_ost, const Action &i_action);
-
-///
-class ActionKey : public Action
-{
-public:
-  ///
-  const ModifiedKey m_modifiedKey;
-
-private:
-  ActionKey(const ActionKey &i_actionKey);
-  
-public:
-  ///
-  ActionKey(const ModifiedKey &i_mk);
-  ///
-  virtual Type getType() const;
-  /// create clone
-  virtual Action *clone() const;
-  /// stream output
-  virtual tostream &output(tostream &i_ost) const;
-};
-
-
-class KeySeq;
-///
-class ActionKeySeq : public Action
-{
-public:
-  KeySeq * const m_keySeq;                     ///
-
-private:
-  ActionKeySeq(const ActionKeySeq &i_actionKeySeq);
-  
-public:
-  ///
-  ActionKeySeq(KeySeq *i_keySeq);
-  ///
-  virtual Type getType() const;
-  /// create clone
-  virtual Action *clone() const;
-  /// stream output
-  virtual tostream &output(tostream &i_ost) const;
-};
-
-
-///
-class ActionFunction : public Action
-{
-public:
-  FunctionData * const m_functionData;         /// function data
-  const Modifier m_modifier;                   /// modifier for &Sync
-
-private:
-  ActionFunction(const ActionFunction &i_actionFunction);
-  
-public:
-  ///
-  ActionFunction(FunctionData *i_functionData,
-                Modifier i_modifier = Modifier());
-  ///
-  virtual ~ActionFunction();
-  ///
-  virtual Type getType() const;
-  /// create clone
-  virtual Action *clone() const;
-  /// stream output
-  virtual tostream &output(tostream &i_ost) const;
-};
-
-
-///
-class KeySeq
-{
-public:
-  typedef std::vector<Action *> Actions;       /// 
-
-private:
-  Actions m_actions;                           ///
-  tstringi m_name;                             ///
-  Modifier::Type m_mode;                       /** Either Modifier::Type_KEYSEQ
-                                                    or Modifier::Type_ASSIGN */
-
-private:
-  ///
-  void copy();
-  ///
-  void clear();
-  
-public:
-  ///
-  KeySeq(const tstringi &i_name);
-  ///
-  KeySeq(const KeySeq &i_ks);
-  ///
-  ~KeySeq();
-  
-  ///
-  const Actions &getActions() const { return m_actions; }
-  
-  ///
-  KeySeq &operator=(const KeySeq &i_ks);
-  
-  /// add
-  KeySeq &add(const Action &i_action);
-
-  /// get the first modified key of this key sequence
-  ModifiedKey getFirstModifiedKey() const;
-  
-  ///
-  const tstringi &getName() const { return m_name; }
-  
-  /// stream output
-  friend tostream &operator<<(tostream &i_ost, const KeySeq &i_ks);
-
-  ///
-  bool isCorrectMode(Modifier::Type i_mode) { return m_mode <= i_mode; }
-
-  ///
-  void setMode(Modifier::Type i_mode)
-  {
-    if (m_mode < i_mode)
-      m_mode = i_mode;
-    ASSERT( m_mode == Modifier::Type_KEYSEQ ||
-           m_mode == Modifier::Type_ASSIGN);
-  }
-
-  ///
-  Modifier::Type getMode() const { return m_mode; }
-};
-
-
-///
-class Keymap
-{
-public:
-  ///
-  enum Type
-  {
-    Type_keymap,                               /// this is keymap
-    Type_windowAnd,                            /// this is window &amp;&amp;
-    Type_windowOr,                             /// this is window ||
-  };
-  ///
-  enum AssignOperator
-  {
-    AO_new,                                    /// =
-    AO_add,                                    /// +=
-    AO_sub,                                    /// -=
-    AO_overwrite,                              /// !, !!
-  };
-  ///
-  enum AssignMode
-  {
-    AM_notModifier,                            ///    not modifier
-    AM_normal,                                 ///    normal modifier
-    AM_true,                                   /** !  true modifier(doesn't
-                                                    generate scan code) */
-    AM_oneShot,                                        /// !! one shot modifier
-    AM_oneShotRepeatable,                      /// !!! one shot modifier
-  };
-  
-  /// key assignment
-  class KeyAssignment
-  {
-  public:
-    ModifiedKey m_modifiedKey; ///
-    KeySeq *m_keySeq;          ///
-
-  public:
-    ///
-    KeyAssignment(const ModifiedKey &i_modifiedKey, KeySeq *i_keySeq)
-      : m_modifiedKey(i_modifiedKey), m_keySeq(i_keySeq) { }
-    ///
-    KeyAssignment(const KeyAssignment &i_o)
-      : m_modifiedKey(i_o.m_modifiedKey), m_keySeq(i_o.m_keySeq) { }
-    ///
-    bool operator<(const KeyAssignment &i_o) const
-    { return m_modifiedKey < i_o.m_modifiedKey; }
-  };
-
-  /// modifier assignments
-  class ModAssignment
-  {
-  public:
-    AssignOperator m_assignOperator;   ///
-    AssignMode m_assignMode;           ///
-    Key *m_key;                                ///
-  };
-  typedef std::list<ModAssignment> ModAssignments; ///
-
-  /// parameter for describe();
-  class DescribeParam
-  {
-  private:
-    typedef std::list<ModifiedKey> DescribedKeys;
-    typedef std::list<const Keymap *> DescribedKeymap;
-    friend class Keymap;
-
-  private:
-    DescribedKeys m_dk;
-    DescribedKeymap m_dkeymap;
-    bool m_doesDescribeModifiers;
-
-  public:
-    DescribeParam() : m_doesDescribeModifiers(true) { }
-  };
-  
-private:
-  /// key assignments (hashed by first scan code)
-  typedef std::list<KeyAssignment> KeyAssignments;
-  enum {
-    HASHED_KEY_ASSIGNMENT_SIZE = 32,   ///
-  };
-
-private:
-  KeyAssignments m_hashedKeyAssignments[HASHED_KEY_ASSIGNMENT_SIZE];   ///
-  
-  /// modifier assignments
-  ModAssignments m_modAssignments[Modifier::Type_ASSIGN];
-
-  Type m_type;                                 /// type
-  tstringi m_name;                             /// keymap name
-  tregex m_windowClass;                                /// window class name regexp
-  tregex m_windowTitle;                                /// window title name regexp
-
-  KeySeq *m_defaultKeySeq;                     /// default keySeq
-  Keymap *m_parentKeymap;                      /// parent keymap
-  
-private:
-  ///
-  KeyAssignments &getKeyAssignments(const ModifiedKey &i_mk);
-  ///
-  const KeyAssignments &getKeyAssignments(const ModifiedKey &i_mk) const;
-
-public:
-  ///
-  Keymap(Type i_type,
-        const tstringi &i_name,
-        const tstringi &i_windowClass,
-        const tstringi &i_windowTitle,
-        KeySeq *i_defaultKeySeq,
-        Keymap *i_parentKeymap);
-  
-  /// add a key assignment;
-  void addAssignment(const ModifiedKey &i_mk, KeySeq *i_keySeq);
-
-  /// add modifier
-  void addModifier(Modifier::Type i_mt, AssignOperator i_ao,
-                  AssignMode i_am, Key *i_key);
-  
-  /// search
-  const KeyAssignment *searchAssignment(const ModifiedKey &i_mk) const;
-
-  /// get
-  const KeySeq *getDefaultKeySeq() const { return m_defaultKeySeq; }
-  ///
-  Keymap *getParentKeymap() const { return m_parentKeymap; }
-  ///
-  const tstringi &getName() const { return m_name; }
-
-  /// does same window
-  bool doesSameWindow(const tstringi i_className,
-                     const tstringi &i_titleName);
-  
-  /// adjust modifier
-  void adjustModifier(Keyboard &i_keyboard);
-
-  /// get modAssignments
-  const ModAssignments &getModAssignments(Modifier::Type i_mt) const
-  { return m_modAssignments[i_mt]; }
-
-  /// describe
-  void describe(tostream &i_ost, DescribeParam *i_dp) const;
-  
-  /// set default keySeq and parent keymap if default keySeq has not been set
-  bool setIfNotYet(KeySeq *i_keySeq, Keymap *i_parentKeymap);
-};
-
-
-/// stream output
-extern tostream &operator<<(tostream &i_ost, const Keymap *i_keymap);
-
-
-///
-class Keymaps
-{
-public:
-  typedef std::list<Keymap *> KeymapPtrList;   /// 
-  
-private:
-  typedef std::list<Keymap> KeymapList;                /// 
-
-private:
-  KeymapList m_keymapList;                     /** pointer into keymaps may
-                                                    exist */
-  
-public:
-  ///
-  Keymaps();
-  
-  /// search by name
-  Keymap *searchByName(const tstringi &i_name);
-
-  /// search window
-  void searchWindow(KeymapPtrList *o_keymapPtrList,
-                   const tstringi &i_className,
-                   const tstringi &i_titleName);
-  
-  /// add keymap
-  Keymap *add(const Keymap &i_keymap);
-  
-  /// adjust modifier
-  void adjustModifier(Keyboard &i_keyboard);
-};
-
-
-///
-class KeySeqs
-{
-private:
-  typedef std::list<KeySeq> KeySeqList;                ///
-
-private:
-  KeySeqList m_keySeqList;                     ///
-  
-public:
-  /// add a named keyseq (name can be empty)
-  KeySeq *add(const KeySeq &i_keySeq);
-  
-  /// search by name
-  KeySeq *searchByName(const tstringi &i_name);
-};
-
-
-#endif // !_KEYMAP_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// keymap.h\r
+\r
+\r
+#ifndef _KEYMAP_H\r
+#  define _KEYMAP_H\r
+\r
+#  include "keyboard.h"\r
+#  include "function.h"\r
+#  include <vector>\r
+\r
+\r
+///\r
+class Action\r
+{\r
+public:\r
+  ///\r
+  enum Type\r
+  {\r
+    Type_key,                                  ///\r
+    Type_keySeq,                               ///\r
+    Type_function,                             ///\r
+  };\r
+\r
+private:\r
+  Action(const Action &i_action);\r
+  \r
+public:\r
+  Action() { }\r
+  ///\r
+  virtual ~Action() { }\r
+  ///\r
+  virtual Type getType() const = 0;\r
+  /// create clone\r
+  virtual Action *clone() const = 0;\r
+  /// stream output\r
+  virtual tostream &output(tostream &i_ost) const = 0;\r
+};\r
+\r
+///\r
+tostream &operator<<(tostream &i_ost, const Action &i_action);\r
+\r
+///\r
+class ActionKey : public Action\r
+{\r
+public:\r
+  ///\r
+  const ModifiedKey m_modifiedKey;\r
+\r
+private:\r
+  ActionKey(const ActionKey &i_actionKey);\r
+  \r
+public:\r
+  ///\r
+  ActionKey(const ModifiedKey &i_mk);\r
+  ///\r
+  virtual Type getType() const;\r
+  /// create clone\r
+  virtual Action *clone() const;\r
+  /// stream output\r
+  virtual tostream &output(tostream &i_ost) const;\r
+};\r
+\r
+\r
+class KeySeq;\r
+///\r
+class ActionKeySeq : public Action\r
+{\r
+public:\r
+  KeySeq * const m_keySeq;                     ///\r
+\r
+private:\r
+  ActionKeySeq(const ActionKeySeq &i_actionKeySeq);\r
+  \r
+public:\r
+  ///\r
+  ActionKeySeq(KeySeq *i_keySeq);\r
+  ///\r
+  virtual Type getType() const;\r
+  /// create clone\r
+  virtual Action *clone() const;\r
+  /// stream output\r
+  virtual tostream &output(tostream &i_ost) const;\r
+};\r
+\r
+\r
+///\r
+class ActionFunction : public Action\r
+{\r
+public:\r
+  FunctionData * const m_functionData;         /// function data\r
+  const Modifier m_modifier;                   /// modifier for &Sync\r
+\r
+private:\r
+  ActionFunction(const ActionFunction &i_actionFunction);\r
+  \r
+public:\r
+  ///\r
+  ActionFunction(FunctionData *i_functionData,\r
+                Modifier i_modifier = Modifier());\r
+  ///\r
+  virtual ~ActionFunction();\r
+  ///\r
+  virtual Type getType() const;\r
+  /// create clone\r
+  virtual Action *clone() const;\r
+  /// stream output\r
+  virtual tostream &output(tostream &i_ost) const;\r
+};\r
+\r
+\r
+///\r
+class KeySeq\r
+{\r
+public:\r
+  typedef std::vector<Action *> Actions;       /// \r
+\r
+private:\r
+  Actions m_actions;                           ///\r
+  tstringi m_name;                             ///\r
+  Modifier::Type m_mode;                       /** Either Modifier::Type_KEYSEQ\r
+                                                    or Modifier::Type_ASSIGN */\r
+\r
+private:\r
+  ///\r
+  void copy();\r
+  ///\r
+  void clear();\r
+  \r
+public:\r
+  ///\r
+  KeySeq(const tstringi &i_name);\r
+  ///\r
+  KeySeq(const KeySeq &i_ks);\r
+  ///\r
+  ~KeySeq();\r
+  \r
+  ///\r
+  const Actions &getActions() const { return m_actions; }\r
+  \r
+  ///\r
+  KeySeq &operator=(const KeySeq &i_ks);\r
+  \r
+  /// add\r
+  KeySeq &add(const Action &i_action);\r
+\r
+  /// get the first modified key of this key sequence\r
+  ModifiedKey getFirstModifiedKey() const;\r
+  \r
+  ///\r
+  const tstringi &getName() const { return m_name; }\r
+  \r
+  /// stream output\r
+  friend tostream &operator<<(tostream &i_ost, const KeySeq &i_ks);\r
+\r
+  ///\r
+  bool isCorrectMode(Modifier::Type i_mode) { return m_mode <= i_mode; }\r
+\r
+  ///\r
+  void setMode(Modifier::Type i_mode)\r
+  {\r
+    if (m_mode < i_mode)\r
+      m_mode = i_mode;\r
+    ASSERT( m_mode == Modifier::Type_KEYSEQ ||\r
+           m_mode == Modifier::Type_ASSIGN);\r
+  }\r
+\r
+  ///\r
+  Modifier::Type getMode() const { return m_mode; }\r
+};\r
+\r
+\r
+///\r
+class Keymap\r
+{\r
+public:\r
+  ///\r
+  enum Type\r
+  {\r
+    Type_keymap,                               /// this is keymap\r
+    Type_windowAnd,                            /// this is window &amp;&amp;\r
+    Type_windowOr,                             /// this is window ||\r
+  };\r
+  ///\r
+  enum AssignOperator\r
+  {\r
+    AO_new,                                    /// =\r
+    AO_add,                                    /// +=\r
+    AO_sub,                                    /// -=\r
+    AO_overwrite,                              /// !, !!\r
+  };\r
+  ///\r
+  enum AssignMode\r
+  {\r
+    AM_notModifier,                            ///    not modifier\r
+    AM_normal,                                 ///    normal modifier\r
+    AM_true,                                   /** !  true modifier(doesn't\r
+                                                    generate scan code) */\r
+    AM_oneShot,                                        /// !! one shot modifier\r
+    AM_oneShotRepeatable,                      /// !!! one shot modifier\r
+  };\r
+  \r
+  /// key assignment\r
+  class KeyAssignment\r
+  {\r
+  public:\r
+    ModifiedKey m_modifiedKey; ///\r
+    KeySeq *m_keySeq;          ///\r
+\r
+  public:\r
+    ///\r
+    KeyAssignment(const ModifiedKey &i_modifiedKey, KeySeq *i_keySeq)\r
+      : m_modifiedKey(i_modifiedKey), m_keySeq(i_keySeq) { }\r
+    ///\r
+    KeyAssignment(const KeyAssignment &i_o)\r
+      : m_modifiedKey(i_o.m_modifiedKey), m_keySeq(i_o.m_keySeq) { }\r
+    ///\r
+    bool operator<(const KeyAssignment &i_o) const\r
+    { return m_modifiedKey < i_o.m_modifiedKey; }\r
+  };\r
+\r
+  /// modifier assignments\r
+  class ModAssignment\r
+  {\r
+  public:\r
+    AssignOperator m_assignOperator;   ///\r
+    AssignMode m_assignMode;           ///\r
+    Key *m_key;                                ///\r
+  };\r
+  typedef std::list<ModAssignment> ModAssignments; ///\r
+\r
+  /// parameter for describe();\r
+  class DescribeParam\r
+  {\r
+  private:\r
+    typedef std::list<ModifiedKey> DescribedKeys;\r
+    typedef std::list<const Keymap *> DescribedKeymap;\r
+    friend class Keymap;\r
+\r
+  private:\r
+    DescribedKeys m_dk;\r
+    DescribedKeymap m_dkeymap;\r
+    bool m_doesDescribeModifiers;\r
+\r
+  public:\r
+    DescribeParam() : m_doesDescribeModifiers(true) { }\r
+  };\r
+  \r
+private:\r
+  /// key assignments (hashed by first scan code)\r
+  typedef std::list<KeyAssignment> KeyAssignments;\r
+  enum {\r
+    HASHED_KEY_ASSIGNMENT_SIZE = 32,   ///\r
+  };\r
+\r
+private:\r
+  KeyAssignments m_hashedKeyAssignments[HASHED_KEY_ASSIGNMENT_SIZE];   ///\r
+  \r
+  /// modifier assignments\r
+  ModAssignments m_modAssignments[Modifier::Type_ASSIGN];\r
+\r
+  Type m_type;                                 /// type\r
+  tstringi m_name;                             /// keymap name\r
+  tregex m_windowClass;                                /// window class name regexp\r
+  tregex m_windowTitle;                                /// window title name regexp\r
+\r
+  KeySeq *m_defaultKeySeq;                     /// default keySeq\r
+  Keymap *m_parentKeymap;                      /// parent keymap\r
+  \r
+private:\r
+  ///\r
+  KeyAssignments &getKeyAssignments(const ModifiedKey &i_mk);\r
+  ///\r
+  const KeyAssignments &getKeyAssignments(const ModifiedKey &i_mk) const;\r
+\r
+public:\r
+  ///\r
+  Keymap(Type i_type,\r
+        const tstringi &i_name,\r
+        const tstringi &i_windowClass,\r
+        const tstringi &i_windowTitle,\r
+        KeySeq *i_defaultKeySeq,\r
+        Keymap *i_parentKeymap);\r
+  \r
+  /// add a key assignment;\r
+  void addAssignment(const ModifiedKey &i_mk, KeySeq *i_keySeq);\r
+\r
+  /// add modifier\r
+  void addModifier(Modifier::Type i_mt, AssignOperator i_ao,\r
+                  AssignMode i_am, Key *i_key);\r
+  \r
+  /// search\r
+  const KeyAssignment *searchAssignment(const ModifiedKey &i_mk) const;\r
+\r
+  /// get\r
+  const KeySeq *getDefaultKeySeq() const { return m_defaultKeySeq; }\r
+  ///\r
+  Keymap *getParentKeymap() const { return m_parentKeymap; }\r
+  ///\r
+  const tstringi &getName() const { return m_name; }\r
+\r
+  /// does same window\r
+  bool doesSameWindow(const tstringi i_className,\r
+                     const tstringi &i_titleName);\r
+  \r
+  /// adjust modifier\r
+  void adjustModifier(Keyboard &i_keyboard);\r
+\r
+  /// get modAssignments\r
+  const ModAssignments &getModAssignments(Modifier::Type i_mt) const\r
+  { return m_modAssignments[i_mt]; }\r
+\r
+  /// describe\r
+  void describe(tostream &i_ost, DescribeParam *i_dp) const;\r
+  \r
+  /// set default keySeq and parent keymap if default keySeq has not been set\r
+  bool setIfNotYet(KeySeq *i_keySeq, Keymap *i_parentKeymap);\r
+};\r
+\r
+\r
+/// stream output\r
+extern tostream &operator<<(tostream &i_ost, const Keymap *i_keymap);\r
+\r
+\r
+///\r
+class Keymaps\r
+{\r
+public:\r
+  typedef std::list<Keymap *> KeymapPtrList;   /// \r
+  \r
+private:\r
+  typedef std::list<Keymap> KeymapList;                /// \r
+\r
+private:\r
+  KeymapList m_keymapList;                     /** pointer into keymaps may\r
+                                                    exist */\r
+  \r
+public:\r
+  ///\r
+  Keymaps();\r
+  \r
+  /// search by name\r
+  Keymap *searchByName(const tstringi &i_name);\r
+\r
+  /// search window\r
+  void searchWindow(KeymapPtrList *o_keymapPtrList,\r
+                   const tstringi &i_className,\r
+                   const tstringi &i_titleName);\r
+  \r
+  /// add keymap\r
+  Keymap *add(const Keymap &i_keymap);\r
+  \r
+  /// adjust modifier\r
+  void adjustModifier(Keyboard &i_keyboard);\r
+};\r
+\r
+\r
+///\r
+class KeySeqs\r
+{\r
+private:\r
+  typedef std::list<KeySeq> KeySeqList;                ///\r
+\r
+private:\r
+  KeySeqList m_keySeqList;                     ///\r
+  \r
+public:\r
+  /// add a named keyseq (name can be empty)\r
+  KeySeq *add(const KeySeq &i_keySeq);\r
+  \r
+  /// search by name\r
+  KeySeq *searchByName(const tstringi &i_name);\r
+};\r
+\r
+\r
+#endif // !_KEYMAP_H\r
index 25ace7e..51ccb7d 100644 (file)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// layoutmanager.h
-
-
-#ifndef _LAYOUTMANAGER_H
-#  define _LAYOUTMANAGER_H
-
-#  include "misc.h"
-#  include <list>
-
-
-///
-class LayoutManager
-{
-public:
-  ///
-  enum Origin
-  {
-    ORIGIN_LEFT_EDGE,                          /// 
-    ORIGIN_TOP_EDGE = ORIGIN_LEFT_EDGE,                ///
-    ORIGIN_CENTER,                             /// 
-    ORIGIN_RIGHT_EDGE,                         /// 
-    ORIGIN_BOTTOM_EDGE = ORIGIN_RIGHT_EDGE,    /// 
-  };
-
-  ///
-  enum Restrict
-  {
-    RESTRICT_NONE = 0,                         /// 
-    RESTRICT_HORIZONTALLY = 1,                 /// 
-    RESTRICT_VERTICALLY = 2,                   /// 
-    RESTRICT_BOTH = RESTRICT_HORIZONTALLY | RESTRICT_VERTICALLY, /// 
-  };
-
-private:
-  ///
-  class Item
-  {
-  public:
-    HWND m_hwnd;                               /// 
-    HWND m_hwndParent;                         /// 
-    RECT m_rc;                                 /// 
-    RECT m_rcParent;                           /// 
-    Origin m_origin[4];                                /// 
-  };
-
-  ///
-  class SmallestSize
-  {
-  public:
-    HWND m_hwnd;                               /// 
-    SIZE m_size;                               /// 
-
-  public:
-    ///
-    SmallestSize() : m_hwnd(NULL) { }
-  };
-
-  typedef std::list<Item> Items;               /// 
-  
-protected:
-  HWND m_hwnd;                                 /// 
-
-private:
-  Items m_items;                               /// 
-  Restrict m_smallestRestriction;              /// 
-  SIZE m_smallestSize;                         /// 
-  Restrict m_largestRestriction;               /// 
-  SIZE m_largestSize;                          /// 
-  
-public:
-  ///
-  LayoutManager(HWND i_hwnd);
-  
-  /** restrict the smallest size of the window to the current size of it or
-      specified by i_size */
-  void restrictSmallestSize(Restrict i_restrict = RESTRICT_BOTH,
-                           SIZE *i_size = NULL);
-  
-  /** restrict the largest size of the window to the current size of it or
-      specified by i_size */
-  void restrictLargestSize(Restrict i_restrict = RESTRICT_BOTH,
-                          SIZE *i_size = NULL);
-  
-  ///
-  bool addItem(HWND i_hwnd,
-              Origin i_originLeft = ORIGIN_LEFT_EDGE,
-              Origin i_originTop = ORIGIN_TOP_EDGE,
-              Origin i_originRight = ORIGIN_LEFT_EDGE,
-              Origin i_originBottom = ORIGIN_TOP_EDGE);
-  ///
-  void adjust() const;
-
-  /// draw size box
-  virtual BOOL wmPaint();
-
-  /// size restriction
-  virtual BOOL wmSizing(int i_edge, RECT *io_rc);
-
-  /// hittest for size box
-  virtual BOOL wmNcHitTest(int i_x, int i_y);
-
-  /// WM_SIZE
-  virtual BOOL wmSize(DWORD /* i_fwSizeType */, short /* i_nWidth */,
-                     short /* i_nHeight */);
-  
-  /// forward message
-  virtual BOOL defaultWMHandler(UINT i_message, WPARAM i_wParam,
-                               LPARAM i_lParam);
-};
-
-
-#endif // !_LAYOUTMANAGER_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// layoutmanager.h\r
+\r
+\r
+#ifndef _LAYOUTMANAGER_H\r
+#  define _LAYOUTMANAGER_H\r
+\r
+#  include "misc.h"\r
+#  include <list>\r
+\r
+\r
+///\r
+class LayoutManager\r
+{\r
+public:\r
+  ///\r
+  enum Origin\r
+  {\r
+    ORIGIN_LEFT_EDGE,                          /// \r
+    ORIGIN_TOP_EDGE = ORIGIN_LEFT_EDGE,                ///\r
+    ORIGIN_CENTER,                             /// \r
+    ORIGIN_RIGHT_EDGE,                         /// \r
+    ORIGIN_BOTTOM_EDGE = ORIGIN_RIGHT_EDGE,    /// \r
+  };\r
+\r
+  ///\r
+  enum Restrict\r
+  {\r
+    RESTRICT_NONE = 0,                         /// \r
+    RESTRICT_HORIZONTALLY = 1,                 /// \r
+    RESTRICT_VERTICALLY = 2,                   /// \r
+    RESTRICT_BOTH = RESTRICT_HORIZONTALLY | RESTRICT_VERTICALLY, /// \r
+  };\r
+\r
+private:\r
+  ///\r
+  class Item\r
+  {\r
+  public:\r
+    HWND m_hwnd;                               /// \r
+    HWND m_hwndParent;                         /// \r
+    RECT m_rc;                                 /// \r
+    RECT m_rcParent;                           /// \r
+    Origin m_origin[4];                                /// \r
+  };\r
+\r
+  ///\r
+  class SmallestSize\r
+  {\r
+  public:\r
+    HWND m_hwnd;                               /// \r
+    SIZE m_size;                               /// \r
+\r
+  public:\r
+    ///\r
+    SmallestSize() : m_hwnd(NULL) { }\r
+  };\r
+\r
+  typedef std::list<Item> Items;               /// \r
+  \r
+protected:\r
+  HWND m_hwnd;                                 /// \r
+\r
+private:\r
+  Items m_items;                               /// \r
+  Restrict m_smallestRestriction;              /// \r
+  SIZE m_smallestSize;                         /// \r
+  Restrict m_largestRestriction;               /// \r
+  SIZE m_largestSize;                          /// \r
+  \r
+public:\r
+  ///\r
+  LayoutManager(HWND i_hwnd);\r
+  \r
+  /** restrict the smallest size of the window to the current size of it or\r
+      specified by i_size */\r
+  void restrictSmallestSize(Restrict i_restrict = RESTRICT_BOTH,\r
+                           SIZE *i_size = NULL);\r
+  \r
+  /** restrict the largest size of the window to the current size of it or\r
+      specified by i_size */\r
+  void restrictLargestSize(Restrict i_restrict = RESTRICT_BOTH,\r
+                          SIZE *i_size = NULL);\r
+  \r
+  ///\r
+  bool addItem(HWND i_hwnd,\r
+              Origin i_originLeft = ORIGIN_LEFT_EDGE,\r
+              Origin i_originTop = ORIGIN_TOP_EDGE,\r
+              Origin i_originRight = ORIGIN_LEFT_EDGE,\r
+              Origin i_originBottom = ORIGIN_TOP_EDGE);\r
+  ///\r
+  void adjust() const;\r
+\r
+  /// draw size box\r
+  virtual BOOL wmPaint();\r
+\r
+  /// size restriction\r
+  virtual BOOL wmSizing(int i_edge, RECT *io_rc);\r
+\r
+  /// hittest for size box\r
+  virtual BOOL wmNcHitTest(int i_x, int i_y);\r
+\r
+  /// WM_SIZE\r
+  virtual BOOL wmSize(DWORD /* i_fwSizeType */, short /* i_nWidth */,\r
+                     short /* i_nHeight */);\r
+  \r
+  /// forward message\r
+  virtual BOOL defaultWMHandler(UINT i_message, WPARAM i_wParam,\r
+                               LPARAM i_lParam);\r
+};\r
+\r
+\r
+#endif // !_LAYOUTMANAGER_H\r
index 12e2fb9..b9c044e 100644 (file)
--- a/mayu.cpp
+++ b/mayu.cpp
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// mayu.cpp
-
-
-#define APSTUDIO_INVOKED
-
-#include "misc.h"
-#include "compiler_specific_func.h"
-#include "dlginvestigate.h"
-#include "dlglog.h"
-#include "dlgsetting.h"
-#include "dlgversion.h"
-#include "engine.h"
-#include "errormessage.h"
-#include "focus.h"
-#include "function.h"
-#include "hook.h"
-#include "mayu.h"
-#include "mayuipc.h"
-#include "mayurc.h"
-#include "msgstream.h"
-#include "multithread.h"
-#include "registry.h"
-#include "setting.h"
-#include "target.h"
-#include "windowstool.h"
-#include "vk2tchar.h"
-#include <process.h>
-#include <time.h>
-#include <commctrl.h>
-#include <wtsapi32.h>
-
-
-///
-#define ID_MENUITEM_reloadBegin _APS_NEXT_COMMAND_VALUE
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Mayu
-
-
-///
-class Mayu
-{
-  HWND m_hwndTaskTray;                         /// tasktray window
-  HWND m_hwndLog;                              /// log dialog
-  HWND m_hwndInvestigate;                      /// investigate dialog
-  HWND m_hwndVersion;                          /// version dialog
-  
-  UINT m_WM_TaskbarRestart;                    /** window message sent when
-                                                    taskber restarts */
-  UINT m_WM_MayuIPC;                           /** IPC message sent from
-                                                   other applications */
-  NOTIFYICONDATA m_ni;                         /// taskbar icon data
-  HICON m_tasktrayIcon[2];                     /// taskbar icon
-  bool m_canUseTasktrayBaloon;                 /// 
-
-  tomsgstream m_log;                           /** log stream (output to log
-                                                   dialog's edit) */
-#ifdef LOG_TO_FILE
-  tofstream m_logFile;
-#endif // LOG_TO_FILE
-
-  HMENU m_hMenuTaskTray;                       /// tasktray menu
-  STARTUPINFO m_si;
-  PROCESS_INFORMATION m_pi;
-  HANDLE m_mutex;
-#ifdef USE_MAILSLOT
-  HANDLE m_hNotifyMailslot;                    /// mailslot to receive notify
-  HANDLE m_hNotifyEvent;                       /// event on receive notify
-  OVERLAPPED m_olNotify;                       /// 
-  BYTE m_notifyBuf[NOTIFY_MESSAGE_SIZE];
-#endif // USE_MAILSLOT
-  
-  Setting *m_setting;                          /// current setting
-  bool m_isSettingDialogOpened;                        /// is setting dialog opened ?
-  
-  Engine m_engine;                             /// engine
-
-  bool m_usingSN;                 /// using WTSRegisterSessionNotification() ?
-  time_t m_startTime;                          /// mayu started at ...
-
-  enum
-  { 
-    WM_APP_taskTrayNotify = WM_APP + 101,      ///
-    WM_APP_msgStreamNotify = WM_APP + 102,     ///
-    ID_TaskTrayIcon = 1,                       ///
-  };
-
-private:
-#ifdef USE_MAILSLOT
-  static VOID CALLBACK mailslotProc(DWORD i_code, DWORD i_len, LPOVERLAPPED i_ol)
-  {
-    Mayu *pThis;
-
-    pThis = reinterpret_cast<Mayu*>(CONTAINING_RECORD(i_ol, Mayu, m_olNotify));
-    pThis->mailslotHandler(i_code, i_len);
-    return;
-  }
-
-  BOOL mailslotHandler(DWORD i_code, DWORD i_len)
-  {
-    BOOL result;
-
-    if (i_len)
-    {
-      COPYDATASTRUCT cd;
-
-      cd.dwData = reinterpret_cast<Notify *>(m_notifyBuf)->m_type;
-      cd.cbData = i_len;
-      cd.lpData = m_notifyBuf;
-      notifyHandler(&cd);
-    }
-
-    memset(m_notifyBuf, 0, sizeof(m_notifyBuf));
-    result = ReadFileEx(m_hNotifyMailslot, m_notifyBuf, sizeof(m_notifyBuf),
-                       &m_olNotify, Mayu::mailslotProc);
-    return result;
-  }
-#endif // USE_MAILSLOT
-
-  /// register class for tasktray
-  ATOM Register_tasktray()
-  {
-    WNDCLASS wc;
-    wc.style         = 0;
-    wc.lpfnWndProc   = tasktray_wndProc;
-    wc.cbClsExtra    = 0;
-    wc.cbWndExtra    = sizeof(Mayu *);
-    wc.hInstance     = g_hInst;
-    wc.hIcon         = NULL;
-    wc.hCursor       = NULL;
-    wc.hbrBackground = NULL;
-    wc.lpszMenuName  = NULL;
-    wc.lpszClassName = _T("mayuTasktray");
-    return RegisterClass(&wc);
-  }
-
-  /// notify handler
-  BOOL notifyHandler(COPYDATASTRUCT *cd)
-  {
-      switch (cd->dwData)
-      {
-       case Notify::Type_setFocus:
-       case Notify::Type_name:
-       {
-         NotifySetFocus *n = (NotifySetFocus *)cd->lpData;
-         n->m_className[NUMBER_OF(n->m_className) - 1] = _T('\0');
-         n->m_titleName[NUMBER_OF(n->m_titleName) - 1] = _T('\0');
-         
-         if (n->m_type == Notify::Type_setFocus)
-           m_engine.setFocus(reinterpret_cast<HWND>(n->m_hwnd), n->m_threadId,
-                             n->m_className, n->m_titleName, false);
-
-         {
-           Acquire a(&m_log, 1);
-           m_log << _T("HWND:\t") << std::hex
-                 << n->m_hwnd
-                 << std::dec << std::endl;
-           m_log << _T("THREADID:") << static_cast<int>(n->m_threadId)
-                 << std::endl;
-         }
-         Acquire a(&m_log, (n->m_type == Notify::Type_name) ? 0 : 1);
-         m_log << _T("CLASS:\t") << n->m_className << std::endl;
-         m_log << _T("TITLE:\t") << n->m_titleName << std::endl;
-         
-         bool isMDI = true;
-         HWND hwnd = getToplevelWindow(reinterpret_cast<HWND>(n->m_hwnd), &isMDI);
-         RECT rc;
-         if (isMDI)
-         {
-           getChildWindowRect(hwnd, &rc);
-           m_log << _T("MDI Window Position/Size: (")
-                 << rc.left << _T(", ") << rc.top << _T(") / (")
-                 << rcWidth(&rc) << _T("x") << rcHeight(&rc) << _T(")")
-                 << std::endl;
-           hwnd = getToplevelWindow(reinterpret_cast<HWND>(n->m_hwnd), NULL);
-         }
-         
-         GetWindowRect(hwnd, &rc);
-         m_log << _T("Toplevel Window Position/Size: (")
-               << rc.left << _T(", ") << rc.top << _T(") / (")
-               << rcWidth(&rc) << _T("x") << rcHeight(&rc) << _T(")")
-               << std::endl;
-
-         SystemParametersInfo(SPI_GETWORKAREA, 0, (void *)&rc, FALSE);
-         m_log << _T("Desktop Window Position/Size: (")
-               << rc.left << _T(", ") << rc.top << _T(") / (")
-               << rcWidth(&rc) << _T("x") << rcHeight(&rc) << _T(")")
-               << std::endl;
-         
-         m_log << std::endl;
-         break;
-       }
-       
-       case Notify::Type_lockState:
-       {
-         NotifyLockState *n = (NotifyLockState *)cd->lpData;
-         m_engine.setLockState(n->m_isNumLockToggled,
-                               n->m_isCapsLockToggled,
-                               n->m_isScrollLockToggled,
-                               n->m_isKanaLockToggled,
-                               n->m_isImeLockToggled,
-                               n->m_isImeCompToggled);
-#if 0
-         Acquire a(&m_log, 0);
-         if (n->m_isKanaLockToggled) {
-           m_log << _T("Notify::Type_lockState Kana on  : ");
-         } else {
-           m_log << _T("Notify::Type_lockState Kana off : ");
-         }
-         m_log << n->m_debugParam << ", "
-               << g_hookData->m_correctKanaLockHandling << std::endl;
-#endif
-         break;
-       }
-
-       case Notify::Type_sync:
-       {
-         m_engine.syncNotify();
-         break;
-       }
-
-       case Notify::Type_threadDetach:
-       {
-         NotifyThreadDetach *n = (NotifyThreadDetach *)cd->lpData;
-         m_engine.threadDetachNotify(n->m_threadId);
-         break;
-       }
-
-       case Notify::Type_command:
-       {
-         NotifyCommand *n = (NotifyCommand *)cd->lpData;
-         m_engine.commandNotify(n->m_hwnd, n->m_message,
-                                n->m_wParam, n->m_lParam);
-         break;
-       }
-
-       case Notify::Type_show:
-       {
-         NotifyShow *n = (NotifyShow *)cd->lpData;
-         switch (n->m_show)
-         {
-           case NotifyShow::Show_Maximized:
-             m_engine.setShow(true, false, n->m_isMDI);
-             break;
-           case NotifyShow::Show_Minimized:
-             m_engine.setShow(false, true, n->m_isMDI);
-             break;
-           case NotifyShow::Show_Normal:
-           default:
-             m_engine.setShow(false, false, n->m_isMDI);
-             break;
-         }       
-         break;
-       }
-
-       case Notify::Type_log:
-       {
-         Acquire a(&m_log, 1);
-         NotifyLog *n = (NotifyLog *)cd->lpData;
-         m_log << _T("hook log: ") << n->m_msg << std::endl;
-         break;
-       }
-      }
-      return true;
-  }
-
-  /// window procedure for tasktray
-  static LRESULT CALLBACK
-  tasktray_wndProc(HWND i_hwnd, UINT i_message,
-                  WPARAM i_wParam, LPARAM i_lParam)
-  {
-#ifdef MAYU64
-    Mayu *This = reinterpret_cast<Mayu *>(GetWindowLongPtr(i_hwnd, 0));
-#else
-    Mayu *This = reinterpret_cast<Mayu *>(GetWindowLong(i_hwnd, 0));
-#endif
-
-    if (!This)
-      switch (i_message)
-      {
-       case WM_CREATE:
-         This = reinterpret_cast<Mayu *>(
-           reinterpret_cast<CREATESTRUCT *>(i_lParam)->lpCreateParams);
-#ifdef MAYU64
-         SetWindowLongPtr(i_hwnd, 0, (LONG_PTR)This);
-#else
-         SetWindowLong(i_hwnd, 0, (long)This);
-#endif
-         return 0;
-      }
-    else
-      switch (i_message)
-      {
-        case WM_COPYDATA:
-       {
-         COPYDATASTRUCT *cd;
-         cd = reinterpret_cast<COPYDATASTRUCT *>(i_lParam);
-         return This->notifyHandler(cd);
-       }
-        case WM_QUERYENDSESSION:
-         This->m_engine.prepairQuit();
-         PostQuitMessage(0);
-         return TRUE;
-
-#ifndef WM_WTSSESSION_CHANGE                   // WinUser.h
-#  define WM_WTSSESSION_CHANGE            0x02B1
-#endif
-       case WM_WTSSESSION_CHANGE:
-       {
-         const char *m = "";
-         switch (i_wParam)
-         {
-#ifndef WTS_CONSOLE_CONNECT                    // WinUser.h
-#  define WTS_CONSOLE_CONNECT                0x1
-#  define WTS_CONSOLE_DISCONNECT             0x2
-#  define WTS_REMOTE_CONNECT                 0x3
-#  define WTS_REMOTE_DISCONNECT              0x4
-#  define WTS_SESSION_LOGON                  0x5
-#  define WTS_SESSION_LOGOFF                 0x6
-#  define WTS_SESSION_LOCK                   0x7
-#  define WTS_SESSION_UNLOCK                 0x8
-#endif
-           case WTS_CONSOLE_CONNECT:
-             m = "WTS_CONSOLE_CONNECT";
-             if (!This->m_engine.resume()) {
-               This->m_engine.prepairQuit();
-               PostQuitMessage(0);
-             }
-             break;
-           case WTS_CONSOLE_DISCONNECT:
-             m = "WTS_CONSOLE_DISCONNECT";
-             This->m_engine.pause();
-             break;
-           case WTS_REMOTE_CONNECT: m = "WTS_REMOTE_CONNECT"; break;
-           case WTS_REMOTE_DISCONNECT: m = "WTS_REMOTE_DISCONNECT"; break;
-           case WTS_SESSION_LOGON:  m = "WTS_SESSION_LOGON"; break;
-           case WTS_SESSION_LOGOFF: m = "WTS_SESSION_LOGOFF"; break;
-           case WTS_SESSION_LOCK: m = "WTS_SESSION_LOCK"; break;
-           case WTS_SESSION_UNLOCK: m = "WTS_SESSION_UNLOCK"; break;
-             //case WTS_SESSION_REMOTE_CONTROL: m = "WTS_SESSION_REMOTE_CONTROL"; break;
-         }
-         This->m_log << _T("WM_WTSESSION_CHANGE(")
-                     << i_wParam << ", " << i_lParam << "): "
-                     << m << std::endl;
-         return TRUE;
-       }
-       case WM_APP_msgStreamNotify:
-       {
-         tomsgstream::StreamBuf *log =
-           reinterpret_cast<tomsgstream::StreamBuf *>(i_lParam);
-         const tstring &str = log->acquireString();
-#ifdef LOG_TO_FILE
-         This->m_logFile << str << std::flush;
-#endif // LOG_TO_FILE
-         editInsertTextAtLast(GetDlgItem(This->m_hwndLog, IDC_EDIT_log),
-                              str, 65000);
-         log->releaseString();
-         return 0;
-       }
-       
-       case WM_APP_taskTrayNotify:
-       {
-         if (i_wParam == ID_TaskTrayIcon)
-           switch (i_lParam)
-           {
-             case WM_RBUTTONUP:
-             {
-               POINT p;
-               CHECK_TRUE( GetCursorPos(&p) );
-               SetForegroundWindow(i_hwnd);
-               HMENU hMenuSub = GetSubMenu(This->m_hMenuTaskTray, 0);
-               if (This->m_engine.getIsEnabled())
-                 CheckMenuItem(hMenuSub, ID_MENUITEM_disable,
-                               MF_UNCHECKED | MF_BYCOMMAND);
-               else
-                 CheckMenuItem(hMenuSub, ID_MENUITEM_disable,
-                               MF_CHECKED | MF_BYCOMMAND);
-               CHECK_TRUE( SetMenuDefaultItem(hMenuSub,
-                                         ID_MENUITEM_investigate, FALSE) );
-
-               // create reload menu
-               HMENU hMenuSubSub = GetSubMenu(hMenuSub, 1);
-               Registry reg(MAYU_REGISTRY_ROOT);
-               int mayuIndex;
-               reg.read(_T(".mayuIndex"), &mayuIndex, 0);
-               while (DeleteMenu(hMenuSubSub, 0, MF_BYPOSITION))
-                 ;
-               tregex getName(_T("^([^;]*);"));
-               for (int index = 0; ; index ++)
-               {
-                 _TCHAR buf[100];
-                 _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), index);
-                 tstringi dot_mayu;
-                 if (!reg.read(buf, &dot_mayu))
-                   break;
-                 tsmatch what;
-                 if (boost::regex_search(dot_mayu, what, getName))
-                 {
-                   MENUITEMINFO mii;
-                   std::memset(&mii, 0, sizeof(mii));
-                   mii.cbSize = sizeof(mii);
-                   mii.fMask = MIIM_ID | MIIM_STATE | MIIM_TYPE;
-                   mii.fType = MFT_STRING;
-                   mii.fState =
-                     MFS_ENABLED | ((mayuIndex == index) ? MFS_CHECKED : 0);
-                   mii.wID = ID_MENUITEM_reloadBegin + index;
-                   tstringi name(what.str(1));
-                   mii.dwTypeData = const_cast<_TCHAR *>(name.c_str());
-                   mii.cch = name.size();
-                   
-                   InsertMenuItem(hMenuSubSub, index, TRUE, &mii);
-                 }
-               }
-
-               // show popup menu
-               TrackPopupMenu(hMenuSub, TPM_LEFTALIGN,
-                              p.x, p.y, 0, i_hwnd, NULL);
-               // TrackPopupMenu may fail (ERROR_POPUP_ALREADY_ACTIVE)
-               break;
-             }
-             
-             case WM_LBUTTONDBLCLK:
-               SendMessage(i_hwnd, WM_COMMAND,
-                           MAKELONG(ID_MENUITEM_investigate, 0), 0);
-               break;
-           }
-         return 0;
-       }
-      
-       case WM_COMMAND:
-       {
-         int notify_code = HIWORD(i_wParam);
-         int id = LOWORD(i_wParam);
-         if (notify_code == 0) // menu
-           switch (id)
-           {
-             default:
-               if (ID_MENUITEM_reloadBegin <= id)
-               {
-                 Registry reg(MAYU_REGISTRY_ROOT);
-                 reg.write(_T(".mayuIndex"), id - ID_MENUITEM_reloadBegin);
-                 This->load();
-               }
-               break;
-             case ID_MENUITEM_reload:
-               This->load();
-               break;
-             case ID_MENUITEM_investigate:
-             {
-               ShowWindow(This->m_hwndLog, SW_SHOW);
-               ShowWindow(This->m_hwndInvestigate, SW_SHOW);
-               
-               RECT rc1, rc2;
-               GetWindowRect(This->m_hwndInvestigate, &rc1);
-               GetWindowRect(This->m_hwndLog, &rc2);
-
-               MoveWindow(This->m_hwndLog, rc1.left, rc1.bottom,
-                          rcWidth(&rc1), rcHeight(&rc2), TRUE);
-               
-               SetForegroundWindow(This->m_hwndLog);
-               SetForegroundWindow(This->m_hwndInvestigate);
-               break;
-             }
-             case ID_MENUITEM_setting:
-               if (!This->m_isSettingDialogOpened)
-               {
-                 This->m_isSettingDialogOpened = true;
-                 if (DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_setting),
-                               NULL, dlgSetting_dlgProc))
-                   This->load();
-                 This->m_isSettingDialogOpened = false;
-               }
-               break;
-             case ID_MENUITEM_log:
-               ShowWindow(This->m_hwndLog, SW_SHOW);
-               SetForegroundWindow(This->m_hwndLog);
-               break;
-             case ID_MENUITEM_check:
-             {
-               BOOL ret;
-               BYTE keys[256];
-               ret = GetKeyboardState(keys);
-               if (ret == 0)
-               {
-                 This->m_log << _T("Check Keystate Failed(%d)")
-                             << GetLastError() << std::endl;
-               }
-               else
-               {
-                 This->m_log << _T("Check Keystate: ") << std::endl;
-                 for (int i = 0; i < 0xff; i++)
-                 {
-                   USHORT asyncKey;
-                   asyncKey = GetAsyncKeyState(i);
-                   This->m_log << std::hex;
-                   if (asyncKey & 0x8000)
-                   {
-                     This->m_log << _T("  ") << VK2TCHAR[i]
-                                 << _T("(0x") << i << _T("): pressed!")
-                                 << std::endl;
-                   }
-                   if (i == 0x14 || // VK_CAPTITAL
-                       i == 0x15 || // VK_KANA
-                       i == 0x19 || // VK_KANJI
-                       i == 0x90 || // VK_NUMLOCK
-                       i == 0x91    // VK_SCROLL
-                       )
-                   {
-                     if (keys[i] & 1)
-                     {
-                       This->m_log << _T("  ") << VK2TCHAR[i]
-                                   << _T("(0x") << i << _T("): locked!")
-                                   << std::endl;
-                     }
-                   }
-                   This->m_log << std::dec;
-                 }
-                 This->m_log << std::endl;
-               }
-               break;
-             }
-             case ID_MENUITEM_version:
-               ShowWindow(This->m_hwndVersion, SW_SHOW);
-               SetForegroundWindow(This->m_hwndVersion);
-               break;
-             case ID_MENUITEM_help:
-             {
-               _TCHAR buf[GANA_MAX_PATH];
-               CHECK_TRUE( GetModuleFileName(g_hInst, buf, NUMBER_OF(buf)) );
-               tstringi helpFilename = pathRemoveFileSpec(buf);
-               helpFilename += _T("\\");
-               helpFilename += loadString(IDS_helpFilename);
-               ShellExecute(NULL, _T("open"), helpFilename.c_str(),
-                            NULL, NULL, SW_SHOWNORMAL);
-               break;
-             }
-             case ID_MENUITEM_disable:
-               This->m_engine.enable(!This->m_engine.getIsEnabled());
-               This->showTasktrayIcon();
-               break;
-             case ID_MENUITEM_quit:
-               This->m_engine.prepairQuit();
-               PostQuitMessage(0);
-               break;
-           }
-         return 0;
-       }
-
-       case WM_APP_engineNotify:
-       {
-         switch (i_wParam)
-         {
-           case EngineNotify_shellExecute:
-             This->m_engine.shellExecute();
-             break;
-           case EngineNotify_loadSetting:
-             This->load();
-             break;
-           case EngineNotify_helpMessage:
-             This->showHelpMessage(false);
-             if (i_lParam)
-               This->showHelpMessage(true);
-             break;
-           case EngineNotify_showDlg:
-           {
-             // show investigate/log window
-             int sw = (i_lParam & ~MayuDialogType_mask);
-             HWND hwnd = NULL;
-             switch (static_cast<MayuDialogType>(
-               i_lParam & MayuDialogType_mask))
-             {
-               case MayuDialogType_investigate:
-                 hwnd = This->m_hwndInvestigate;
-                 break;
-               case MayuDialogType_log:
-                 hwnd = This->m_hwndLog;
-                 break;
-             }
-             if (hwnd)
-             {
-               ShowWindow(hwnd, sw);
-               switch (sw)
-               {
-                 case SW_SHOWNORMAL:
-                 case SW_SHOWMAXIMIZED:
-                 case SW_SHOW:
-                 case SW_RESTORE:
-                 case SW_SHOWDEFAULT:
-                   SetForegroundWindow(hwnd);
-                   break;
-               }
-             }
-             break;
-           }
-           case EngineNotify_setForegroundWindow:
-             // FIXME: completely useless. why ?
-             setForegroundWindow(reinterpret_cast<HWND>(i_lParam));
-             {
-               Acquire a(&This->m_log, 1);
-               This->m_log << _T("setForegroundWindow(0x")
-                           << std::hex << i_lParam << std::dec << _T(")")
-                           << std::endl;
-             }
-             break;
-           case EngineNotify_clearLog:
-             SendMessage(This->m_hwndLog, WM_COMMAND,
-                         MAKELONG(IDC_BUTTON_clearLog, 0), 0);
-             break;
-           default:
-             break;
-         }
-         return 0;
-       }
-       
-       case WM_APP_dlglogNotify:
-       {
-         switch (i_wParam)
-         {
-           case DlgLogNotify_logCleared:
-             This->showBanner(true);
-             break;
-           default:
-             break;
-         }
-         return 0;
-       }
-
-       case WM_DESTROY:
-         if (This->m_usingSN)
-         {
-           wtsUnRegisterSessionNotification(i_hwnd);
-           This->m_usingSN = false;
-         }
-         return 0;
-       
-       default:
-         if (i_message == This->m_WM_TaskbarRestart)
-         {
-           if (This->showTasktrayIcon(true))
-           {
-             Acquire a(&This->m_log, 0);
-             This->m_log << _T("Tasktray icon is updated.") << std::endl;
-           }
-           else
-           {
-             Acquire a(&This->m_log, 1);
-             This->m_log << _T("Tasktray icon already exists.") << std::endl;
-           }
-           return 0;
-         }
-         else if (i_message == This->m_WM_MayuIPC)
-         {
-           switch (static_cast<MayuIPCCommand>(i_wParam))
-           {
-             case MayuIPCCommand_Enable:
-               This->m_engine.enable(!!i_lParam);
-               This->showTasktrayIcon();
-               if (i_lParam)
-               {
-                 Acquire a(&This->m_log, 1);
-                 This->m_log << _T("Enabled by another application.")
-                             << std::endl;
-               }
-               else
-               {
-                 Acquire a(&This->m_log, 1);
-                 This->m_log << _T("Disabled by another application.")
-                             << std::endl;
-               }
-               break;
-           }
-         }
-      }
-    return DefWindowProc(i_hwnd, i_message, i_wParam, i_lParam);
-  }
-
-  /// load setting
-  void load()
-  {
-    Setting *newSetting = new Setting;
-
-    // set symbol
-    for (int i = 1; i < __argc; ++ i)
-    {
-      if (__targv[i][0] == _T('-') && __targv[i][1] == _T('D'))
-       newSetting->m_symbols.insert(__targv[i] + 2);
-    }
-
-    if (!SettingLoader(&m_log, &m_log).load(newSetting))
-    {
-      ShowWindow(m_hwndLog, SW_SHOW);
-      SetForegroundWindow(m_hwndLog);
-      delete newSetting;
-      Acquire a(&m_log, 0);
-      m_log << _T("error: failed to load.") << std::endl;
-      return;
-    }
-    m_log << _T("successfully loaded.") << std::endl;
-    while (!m_engine.setSetting(newSetting))
-      Sleep(1000);
-    delete m_setting;
-    m_setting = newSetting;
-  }
-
-  // show message (a baloon from the task tray icon)
-  void showHelpMessage(bool i_doesShow = true)
-  {
-    if (m_canUseTasktrayBaloon)
-    {
-      if (i_doesShow)
-      {
-       tstring helpMessage, helpTitle;
-       m_engine.getHelpMessages(&helpMessage, &helpTitle);
-       tcslcpy(m_ni.szInfo, helpMessage.c_str(), NUMBER_OF(m_ni.szInfo));
-       tcslcpy(m_ni.szInfoTitle, helpTitle.c_str(),
-               NUMBER_OF(m_ni.szInfoTitle));
-       m_ni.dwInfoFlags = NIIF_INFO;
-      }
-      else
-       m_ni.szInfo[0] = m_ni.szInfoTitle[0] = _T('\0');
-      CHECK_TRUE( Shell_NotifyIcon(NIM_MODIFY, &m_ni) );
-    }
-  }
-  
-  // change the task tray icon
-  bool showTasktrayIcon(bool i_doesAdd = false)
-  {
-    m_ni.hIcon  = m_tasktrayIcon[m_engine.getIsEnabled() ? 1 : 0];
-    m_ni.szInfo[0] = m_ni.szInfoTitle[0] = _T('\0');
-    if (i_doesAdd) {
-      // http://support.microsoft.com/kb/418138/JA/
-      int guard = 60;
-      for (; !Shell_NotifyIcon(NIM_ADD, &m_ni) && 0 < guard; -- guard) {
-       if (Shell_NotifyIcon(NIM_MODIFY, &m_ni)) {
-         return true;
-       }
-       Sleep(1000);                            // 1sec
-      }
-      return 0 < guard;
-    } else {
-      return !!Shell_NotifyIcon(NIM_MODIFY, &m_ni);
-    }
-  }
-
-  void showBanner(bool i_isCleared)
-  {
-    time_t now;
-    time(&now);
-      
-    _TCHAR starttimebuf[1024];
-    _TCHAR timebuf[1024];
-
-#ifdef __BORLANDC__
-#pragma message("\t\t****\tAfter std::ostream() is called,  ")
-#pragma message("\t\t****\tstrftime(... \"%%#c\" ...) fails.")
-#pragma message("\t\t****\tWhy ? Bug of Borland C++ 5.5.1 ? ")
-#pragma message("\t\t****\t                         - nayuta")
-    _tcsftime(timebuf, NUMBER_OF(timebuf), _T("%Y/%m/%d %H:%M:%S"),
-             localtime(&now));
-    _tcsftime(starttimebuf, NUMBER_OF(starttimebuf), _T("%Y/%m/%d %H:%M:%S"),
-             localtime(&m_startTime));
-#else
-    _tcsftime(timebuf, NUMBER_OF(timebuf), _T("%#c"), localtime(&now));
-    _tcsftime(starttimebuf, NUMBER_OF(starttimebuf), _T("%#c"),
-             localtime(&m_startTime));
-#endif
-      
-    Acquire a(&m_log, 0);
-    m_log << _T("------------------------------------------------------------") << std::endl;
-    m_log << loadString(IDS_mayu) << _T(" ") _T(VERSION);
-#ifndef NDEBUG
-    m_log << _T(" (DEBUG)");
-#endif
-#ifdef _UNICODE
-    m_log << _T(" (UNICODE)");
-#endif
-    m_log << std::endl;
-    m_log << _T("  built by ")
-         << _T(LOGNAME) << _T("@") << toLower(_T(COMPUTERNAME))
-         << _T(" (") << _T(__DATE__) <<  _T(" ")
-         << _T(__TIME__) << _T(", ")
-         << getCompilerVersionString() << _T(")") << std::endl;
-    _TCHAR modulebuf[1024];
-    CHECK_TRUE( GetModuleFileName(g_hInst, modulebuf,
-                                 NUMBER_OF(modulebuf)) );
-    m_log << _T("started at ") << starttimebuf << std::endl;
-    m_log << modulebuf << std::endl;
-    m_log << _T("------------------------------------------------------------") << std::endl;
-
-    if (i_isCleared) {
-      m_log << _T("log was cleared at ") << timebuf << std::endl;
-    } else {
-      m_log << _T("log begins at ") << timebuf << std::endl;
-    }
-  }
-
-public:
-  ///
-  Mayu(HANDLE i_mutex)
-    : m_hwndTaskTray(NULL),
-      m_mutex(i_mutex),
-      m_hwndLog(NULL),
-      m_WM_TaskbarRestart(RegisterWindowMessage(_T("TaskbarCreated"))),
-      m_WM_MayuIPC(RegisterWindowMessage(WM_MayuIPC_NAME)),
-      m_canUseTasktrayBaloon(
-       PACKVERSION(5, 0) <= getDllVersion(_T("shlwapi.dll"))),
-      m_log(WM_APP_msgStreamNotify),
-      m_setting(NULL),
-      m_isSettingDialogOpened(false),
-      m_engine(m_log)
-  {
-#ifdef USE_MAILSLOT
-       m_hNotifyMailslot = CreateMailslot(NOTIFY_MAILSLOT_NAME, 0, MAILSLOT_WAIT_FOREVER, (SECURITY_ATTRIBUTES *)NULL);
-       ASSERT(m_hNotifyMailslot != INVALID_HANDLE_VALUE);
-       m_hNotifyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
-       ASSERT(m_hNotifyEvent);
-       m_olNotify.Offset = 0;
-       m_olNotify.OffsetHigh = 0;
-       m_olNotify.hEvent = m_hNotifyEvent;
-#endif // USE_MAILSLOT
-    time(&m_startTime);
-
-    CHECK_TRUE( Register_focus() );
-    CHECK_TRUE( Register_target() );
-    CHECK_TRUE( Register_tasktray() );
-
-    // change dir
-#if 0
-    HomeDirectories pathes;
-    getHomeDirectories(&pathes);
-    for (HomeDirectories::iterator i = pathes.begin(); i != pathes.end(); ++ i)
-      if (SetCurrentDirectory(i->c_str()))
-       break;
-#endif
-    
-    // create windows, dialogs
-    tstringi title = loadString(IDS_mayu);
-    m_hwndTaskTray = CreateWindow(_T("mayuTasktray"), title.c_str(),
-                                 WS_OVERLAPPEDWINDOW,
-                                 CW_USEDEFAULT, CW_USEDEFAULT, 
-                                 CW_USEDEFAULT, CW_USEDEFAULT, 
-                                 NULL, NULL, g_hInst, this);
-    CHECK_TRUE( m_hwndTaskTray );
-    
-    // set window handle of tasktray to hooks
-#ifndef USE_MAILSLOT
-    g_hookData->m_hwndTaskTray = reinterpret_cast<DWORD>(m_hwndTaskTray);
-#endif // !USE_MAILSLOT
-    CHECK_FALSE( installHooks(Engine::keyboardDetour, &m_engine) );
-    m_usingSN = wtsRegisterSessionNotification(m_hwndTaskTray,
-                                              NOTIFY_FOR_THIS_SESSION);
-
-    DlgLogData dld;
-    dld.m_log = &m_log;
-    dld.m_hwndTaskTray = m_hwndTaskTray;
-    m_hwndLog =
-      CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_log), NULL,
-                       dlgLog_dlgProc, (LPARAM)&dld);
-    CHECK_TRUE( m_hwndLog );
-
-    DlgInvestigateData did;
-    did.m_engine = &m_engine;
-    did.m_hwndLog = m_hwndLog;
-    m_hwndInvestigate =
-      CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_investigate), NULL,
-                       dlgInvestigate_dlgProc, (LPARAM)&did);
-    CHECK_TRUE( m_hwndInvestigate );
-
-    m_hwndVersion =
-      CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_version),
-                       NULL, dlgVersion_dlgProc,
-                       (LPARAM)m_engine.getMayudVersion().c_str());
-    CHECK_TRUE( m_hwndVersion );
-
-    // attach log
-#ifdef LOG_TO_FILE
-    tstring path;
-    _TCHAR exePath[GANA_MAX_PATH];
-    _TCHAR exeDrive[GANA_MAX_PATH];
-    _TCHAR exeDir[GANA_MAX_PATH];
-    GetModuleFileName(NULL, exePath, GANA_MAX_PATH);
-    _tsplitpath_s(exePath, exeDrive, GANA_MAX_PATH, exeDir, GANA_MAX_PATH, NULL, 0, NULL, 0);
-    path = exeDrive;
-    path += exeDir;
-    path += _T("mayu.log");
-    m_logFile.open(path.c_str(), std::ios::app);
-    m_logFile.imbue(std::locale("japanese"));
-#endif // LOG_TO_FILE
-    SendMessage(GetDlgItem(m_hwndLog, IDC_EDIT_log), EM_SETLIMITTEXT, 0, 0);
-    m_log.attach(m_hwndTaskTray);
-
-    // start keyboard handler thread
-    m_engine.setAssociatedWndow(m_hwndTaskTray);
-    m_engine.start();
-    
-    // show tasktray icon
-    m_tasktrayIcon[0] = loadSmallIcon(IDI_ICON_mayu_disabled);
-    m_tasktrayIcon[1] = loadSmallIcon(IDI_ICON_mayu);
-    std::memset(&m_ni, 0, sizeof(m_ni));
-    m_ni.uID    = ID_TaskTrayIcon;
-    m_ni.hWnd   = m_hwndTaskTray;
-    m_ni.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
-    m_ni.hIcon  = m_tasktrayIcon[1];
-    m_ni.uCallbackMessage = WM_APP_taskTrayNotify;
-    tstring tip = loadString(IDS_mayu);
-    tcslcpy(m_ni.szTip, tip.c_str(), NUMBER_OF(m_ni.szTip));
-    if (m_canUseTasktrayBaloon)
-    {
-      m_ni.cbSize = sizeof(m_ni);
-      m_ni.uFlags |= NIF_INFO;
-    }
-    else
-      m_ni.cbSize = NOTIFYICONDATA_V1_SIZE;
-    showTasktrayIcon(true);
-
-    // create menu
-    m_hMenuTaskTray = LoadMenu(g_hInst, MAKEINTRESOURCE(IDR_MENU_tasktray));
-    ASSERT(m_hMenuTaskTray);
-    
-    // set initial lock state
-    notifyLockState();
-
-    BOOL result;
-
-    ZeroMemory(&m_pi,sizeof(m_pi));
-    ZeroMemory(&m_si,sizeof(m_si));
-    m_si.cb=sizeof(m_si);
-#ifdef _WIN64
-    result = CreateProcess(_T("yamyd32"), _T("yamyd32"), NULL, NULL, FALSE,
-                          NORMAL_PRIORITY_CLASS, 0, NULL, &m_si, &m_pi);
-    if (result == FALSE)
-    {
-      TCHAR buf[1024];
-      TCHAR text[1024];
-      TCHAR title[1024];
-
-      LoadString(GetModuleHandle(NULL), IDS_cannotInvoke,
-                text, sizeof(text)/sizeof(text[0]));
-      LoadString(GetModuleHandle(NULL), IDS_mayu,
-                title, sizeof(title)/sizeof(title[0]));
-      _stprintf_s(buf, sizeof(buf)/sizeof(buf[0]),
-                 text, _T("yamyd32"), GetLastError());
-      MessageBox((HWND)NULL, buf, title, MB_OK | MB_ICONSTOP);
-    }
-    else
-    {
-      CloseHandle(m_pi.hThread);
-      CloseHandle(m_pi.hProcess);
-    }
-#endif // _WIN64
-  }
-
-  ///
-  ~Mayu()
-  {
-    ReleaseMutex(m_mutex);
-    WaitForSingleObject(m_mutex, INFINITE);
-    // first, detach log from edit control to avoid deadlock
-    m_log.detach();
-#ifdef LOG_TO_FILE
-    m_logFile.close();
-#endif // LOG_TO_FILE
-   
-    // stop notify from mayu.dll
-    g_hookData->m_hwndTaskTray = NULL;
-    CHECK_FALSE( uninstallHooks() );
-       PostMessage(HWND_BROADCAST, WM_NULL, 0, 0);
-    
-    // destroy windows
-    CHECK_TRUE( DestroyWindow(m_hwndVersion) );
-    CHECK_TRUE( DestroyWindow(m_hwndInvestigate) );
-    CHECK_TRUE( DestroyWindow(m_hwndLog) );
-    CHECK_TRUE( DestroyWindow(m_hwndTaskTray) );
-    
-    // destroy menu
-    DestroyMenu(m_hMenuTaskTray);
-    
-    // delete tasktray icon
-    CHECK_TRUE( Shell_NotifyIcon(NIM_DELETE, &m_ni) );
-    CHECK_TRUE( DestroyIcon(m_tasktrayIcon[1]) );
-    CHECK_TRUE( DestroyIcon(m_tasktrayIcon[0]) );
-
-    // stop keyboard handler thread
-    m_engine.stop();
-    
-    // remove setting;
-    delete m_setting;
-    
-#ifdef USE_MAILSLOT
-    CloseHandle(m_hNotifyEvent);
-    CloseHandle(m_hNotifyMailslot);
-#endif // USE_MAILSLOT
-  }
-
-  /// message loop
-  WPARAM messageLoop()
-  {
-    showBanner(false);
-    load();
-    
-#ifdef USE_MAILSLOT
-    mailslotHandler(0, 0);
-    while (1)
-    {
-      HANDLE handles[] = { m_hNotifyEvent };
-      DWORD ret;
-      switch (ret = MsgWaitForMultipleObjectsEx(NUMBER_OF(handles), &handles[0],
-                                                                                               INFINITE, QS_ALLINPUT, MWMO_ALERTABLE | MWMO_INPUTAVAILABLE))
-      {
-       case WAIT_OBJECT_0:                     // m_hNotifyEvent
-         break;
-         
-        case WAIT_OBJECT_0 + NUMBER_OF(handles):
-       {
-         MSG msg;
-         if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) != 0)
-         {
-           if (msg.message == WM_QUIT)
-           {
-             return msg.wParam;
-           }
-           if (IsDialogMessage(m_hwndLog, &msg))
-             break;
-           if (IsDialogMessage(m_hwndInvestigate, &msg))
-             break;
-           if (IsDialogMessage(m_hwndVersion, &msg))
-             break;
-           TranslateMessage(&msg);
-           DispatchMessage(&msg);
-           break;
-         }
-         break;
-       }
-       
-        case WAIT_IO_COMPLETION:
-         break;
-       
-        case 0x102:
-        default:
-         break;
-      }
-    }
-#else // !USE_MAILSLOT
-    MSG msg;
-    while (0 < GetMessage(&msg, NULL, 0, 0))
-    {
-      if (IsDialogMessage(m_hwndLog, &msg))
-       continue;
-      if (IsDialogMessage(m_hwndInvestigate, &msg))
-       continue;
-      if (IsDialogMessage(m_hwndVersion, &msg))
-       continue;
-      TranslateMessage(&msg);
-      DispatchMessage(&msg);
-    }
-    return msg.wParam;
-#endif // !USE_MAILSLOT
-  }  
-};
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Functions
-
-
-/// convert registry
-void convertRegistry()
-{
-  Registry reg(MAYU_REGISTRY_ROOT);
-  tstringi dot_mayu;
-  bool doesAdd = false;
-  DWORD index;
-  if (reg.read(_T(".mayu"), &dot_mayu))
-  {
-    reg.write(_T(".mayu0"), _T(";") + dot_mayu + _T(";"));
-    reg.remove(_T(".mayu"));
-    doesAdd = true;
-    index = 0;
-  }
-  else if (!reg.read(_T(".mayu0"), &dot_mayu))
-  {
-    reg.write(_T(".mayu0"), loadString(IDS_readFromHomeDirectory) + _T(";;"));
-    doesAdd = true;
-    index = 1;
-  }
-  if (doesAdd)
-  {
-    Registry commonreg(HKEY_LOCAL_MACHINE, _T("Software\\GANAware\\mayu"));
-    tstringi dir, layout;
-    if (commonreg.read(_T("dir"), &dir) &&
-       commonreg.read(_T("layout"), &layout))
-    {
-      tstringi tmp = _T(";") + dir + _T("\\dot.mayu");
-      if (layout == _T("109"))
-      {
-       reg.write(_T(".mayu1"), loadString(IDS_109Emacs) + tmp
-                 + _T(";-DUSE109") _T(";-DUSEdefault"));
-       reg.write(_T(".mayu2"), loadString(IDS_104on109Emacs) + tmp
-                 + _T(";-DUSE109") _T(";-DUSEdefault") _T(";-DUSE104on109"));
-       reg.write(_T(".mayu3"), loadString(IDS_109) + tmp
-                 + _T(";-DUSE109"));
-       reg.write(_T(".mayu4"), loadString(IDS_104on109) + tmp
-                 + _T(";-DUSE109") _T(";-DUSE104on109"));
-      }
-      else
-      {
-       reg.write(_T(".mayu1"), loadString(IDS_104Emacs) + tmp
-                 + _T(";-DUSE104") _T(";-DUSEdefault"));
-       reg.write(_T(".mayu2"), loadString(IDS_109on104Emacs) + tmp
-                 + _T(";-DUSE104") _T(";-DUSEdefault") _T(";-DUSE109on104"));
-       reg.write(_T(".mayu3"), loadString(IDS_104) + tmp
-                 + _T(";-DUSE104"));
-       reg.write(_T(".mayu4"), loadString(IDS_109on104) + tmp
-                 + _T(";-DUSE104") _T(";-DUSE109on104"));
-      }
-      reg.write(_T(".mayuIndex"), index);
-    }
-  }
-}
-
-
-/// main
-int WINAPI _tWinMain(HINSTANCE i_hInstance, HINSTANCE /* i_hPrevInstance */,
-                    LPTSTR /* i_lpszCmdLine */, int /* i_nCmdShow */)
-{
-  g_hInst = i_hInstance;
-
-  // set locale
-  CHECK_TRUE( _tsetlocale(LC_ALL, _T("")) );
-
-  // common controls
-#if defined(_WIN95)
-  InitCommonControls();
-#else
-  INITCOMMONCONTROLSEX icc;
-  icc.dwSize = sizeof(icc);
-  icc.dwICC = ICC_LISTVIEW_CLASSES;
-  CHECK_TRUE( InitCommonControlsEx(&icc) );
-#endif
-
-  // convert old registry to new registry
-#ifndef USE_INI
-  convertRegistry();
-#endif // !USE_INI
-  
-  // is another mayu running ?
-  HANDLE mutex = CreateMutex((SECURITY_ATTRIBUTES *)NULL, TRUE,
-                            MUTEX_MAYU_EXCLUSIVE_RUNNING);
-  if (GetLastError() == ERROR_ALREADY_EXISTS)
-  {
-    // another mayu already running
-    tstring text = loadString(IDS_mayuAlreadyExists);
-    tstring title = loadString(IDS_mayu);
-    if (g_hookData) {
-       UINT WM_TaskbarRestart = RegisterWindowMessage(_T("TaskbarCreated"));
-       PostMessage(reinterpret_cast<HWND>(g_hookData->m_hwndTaskTray),
-                   WM_TaskbarRestart, 0, 0);
-    }
-    MessageBox((HWND)NULL, text.c_str(), title.c_str(), MB_OK | MB_ICONSTOP);
-    return 1;
-  }
-
-  // check remote desktop
-  DWORD sessionId;
-  if (!ProcessIdToSessionId(GetCurrentProcessId(), &sessionId) ||
-      wtsGetActiveConsoleSessionId() != sessionId)
-  {
-    tstring text = loadString(IDS_executedInRemoteDesktop);
-    tstring title = loadString(IDS_mayu);
-    MessageBox((HWND)NULL, text.c_str(), title.c_str(), MB_OK | MB_ICONSTOP);
-    return 1;
-  }
-  
-  try
-  {
-    Mayu(mutex).messageLoop();
-  }
-  catch (ErrorMessage &i_e)
-  {
-    tstring title = loadString(IDS_mayu);
-    MessageBox((HWND)NULL, i_e.getMessage().c_str(), title.c_str(),
-              MB_OK | MB_ICONSTOP);
-  }
-  
-  CHECK_TRUE( CloseHandle(mutex) );
-  return 0;
-}
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// mayu.cpp\r
+\r
+\r
+#define APSTUDIO_INVOKED\r
+\r
+#include "misc.h"\r
+#include "compiler_specific_func.h"\r
+#include "dlginvestigate.h"\r
+#include "dlglog.h"\r
+#include "dlgsetting.h"\r
+#include "dlgversion.h"\r
+#include "engine.h"\r
+#include "errormessage.h"\r
+#include "focus.h"\r
+#include "function.h"\r
+#include "hook.h"\r
+#include "mayu.h"\r
+#include "mayuipc.h"\r
+#include "mayurc.h"\r
+#include "msgstream.h"\r
+#include "multithread.h"\r
+#include "registry.h"\r
+#include "setting.h"\r
+#include "target.h"\r
+#include "windowstool.h"\r
+#include "vk2tchar.h"\r
+#include <process.h>\r
+#include <time.h>\r
+#include <commctrl.h>\r
+#include <wtsapi32.h>\r
+\r
+\r
+///\r
+#define ID_MENUITEM_reloadBegin _APS_NEXT_COMMAND_VALUE\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Mayu\r
+\r
+\r
+///\r
+class Mayu\r
+{\r
+  HWND m_hwndTaskTray;                         /// tasktray window\r
+  HWND m_hwndLog;                              /// log dialog\r
+  HWND m_hwndInvestigate;                      /// investigate dialog\r
+  HWND m_hwndVersion;                          /// version dialog\r
+  \r
+  UINT m_WM_TaskbarRestart;                    /** window message sent when\r
+                                                    taskber restarts */\r
+  UINT m_WM_MayuIPC;                           /** IPC message sent from\r
+                                                   other applications */\r
+  NOTIFYICONDATA m_ni;                         /// taskbar icon data\r
+  HICON m_tasktrayIcon[2];                     /// taskbar icon\r
+  bool m_canUseTasktrayBaloon;                 /// \r
+\r
+  tomsgstream m_log;                           /** log stream (output to log\r
+                                                   dialog's edit) */\r
+#ifdef LOG_TO_FILE\r
+  tofstream m_logFile;\r
+#endif // LOG_TO_FILE\r
+\r
+  HMENU m_hMenuTaskTray;                       /// tasktray menu\r
+  STARTUPINFO m_si;\r
+  PROCESS_INFORMATION m_pi;\r
+  HANDLE m_mutex;\r
+#ifdef USE_MAILSLOT\r
+  HANDLE m_hNotifyMailslot;                    /// mailslot to receive notify\r
+  HANDLE m_hNotifyEvent;                       /// event on receive notify\r
+  OVERLAPPED m_olNotify;                       /// \r
+  BYTE m_notifyBuf[NOTIFY_MESSAGE_SIZE];\r
+#endif // USE_MAILSLOT\r
+  \r
+  Setting *m_setting;                          /// current setting\r
+  bool m_isSettingDialogOpened;                        /// is setting dialog opened ?\r
+  \r
+  Engine m_engine;                             /// engine\r
+\r
+  bool m_usingSN;                 /// using WTSRegisterSessionNotification() ?\r
+  time_t m_startTime;                          /// mayu started at ...\r
+\r
+  enum\r
+  { \r
+    WM_APP_taskTrayNotify = WM_APP + 101,      ///\r
+    WM_APP_msgStreamNotify = WM_APP + 102,     ///\r
+    ID_TaskTrayIcon = 1,                       ///\r
+  };\r
+\r
+private:\r
+#ifdef USE_MAILSLOT\r
+  static VOID CALLBACK mailslotProc(DWORD i_code, DWORD i_len, LPOVERLAPPED i_ol)\r
+  {\r
+    Mayu *pThis;\r
+\r
+    pThis = reinterpret_cast<Mayu*>(CONTAINING_RECORD(i_ol, Mayu, m_olNotify));\r
+    pThis->mailslotHandler(i_code, i_len);\r
+    return;\r
+  }\r
+\r
+  BOOL mailslotHandler(DWORD i_code, DWORD i_len)\r
+  {\r
+    BOOL result;\r
+\r
+    if (i_len)\r
+    {\r
+      COPYDATASTRUCT cd;\r
+\r
+      cd.dwData = reinterpret_cast<Notify *>(m_notifyBuf)->m_type;\r
+      cd.cbData = i_len;\r
+      cd.lpData = m_notifyBuf;\r
+      notifyHandler(&cd);\r
+    }\r
+\r
+    memset(m_notifyBuf, 0, sizeof(m_notifyBuf));\r
+    result = ReadFileEx(m_hNotifyMailslot, m_notifyBuf, sizeof(m_notifyBuf),\r
+                       &m_olNotify, Mayu::mailslotProc);\r
+    return result;\r
+  }\r
+#endif // USE_MAILSLOT\r
+\r
+  /// register class for tasktray\r
+  ATOM Register_tasktray()\r
+  {\r
+    WNDCLASS wc;\r
+    wc.style         = 0;\r
+    wc.lpfnWndProc   = tasktray_wndProc;\r
+    wc.cbClsExtra    = 0;\r
+    wc.cbWndExtra    = sizeof(Mayu *);\r
+    wc.hInstance     = g_hInst;\r
+    wc.hIcon         = NULL;\r
+    wc.hCursor       = NULL;\r
+    wc.hbrBackground = NULL;\r
+    wc.lpszMenuName  = NULL;\r
+    wc.lpszClassName = _T("mayuTasktray");\r
+    return RegisterClass(&wc);\r
+  }\r
+\r
+  /// notify handler\r
+  BOOL notifyHandler(COPYDATASTRUCT *cd)\r
+  {\r
+      switch (cd->dwData)\r
+      {\r
+       case Notify::Type_setFocus:\r
+       case Notify::Type_name:\r
+       {\r
+         NotifySetFocus *n = (NotifySetFocus *)cd->lpData;\r
+         n->m_className[NUMBER_OF(n->m_className) - 1] = _T('\0');\r
+         n->m_titleName[NUMBER_OF(n->m_titleName) - 1] = _T('\0');\r
+         \r
+         if (n->m_type == Notify::Type_setFocus)\r
+           m_engine.setFocus(reinterpret_cast<HWND>(n->m_hwnd), n->m_threadId,\r
+                             n->m_className, n->m_titleName, false);\r
+\r
+         {\r
+           Acquire a(&m_log, 1);\r
+           m_log << _T("HWND:\t") << std::hex\r
+                 << n->m_hwnd\r
+                 << std::dec << std::endl;\r
+           m_log << _T("THREADID:") << static_cast<int>(n->m_threadId)\r
+                 << std::endl;\r
+         }\r
+         Acquire a(&m_log, (n->m_type == Notify::Type_name) ? 0 : 1);\r
+         m_log << _T("CLASS:\t") << n->m_className << std::endl;\r
+         m_log << _T("TITLE:\t") << n->m_titleName << std::endl;\r
+         \r
+         bool isMDI = true;\r
+         HWND hwnd = getToplevelWindow(reinterpret_cast<HWND>(n->m_hwnd), &isMDI);\r
+         RECT rc;\r
+         if (isMDI)\r
+         {\r
+           getChildWindowRect(hwnd, &rc);\r
+           m_log << _T("MDI Window Position/Size: (")\r
+                 << rc.left << _T(", ") << rc.top << _T(") / (")\r
+                 << rcWidth(&rc) << _T("x") << rcHeight(&rc) << _T(")")\r
+                 << std::endl;\r
+           hwnd = getToplevelWindow(reinterpret_cast<HWND>(n->m_hwnd), NULL);\r
+         }\r
+         \r
+         GetWindowRect(hwnd, &rc);\r
+         m_log << _T("Toplevel Window Position/Size: (")\r
+               << rc.left << _T(", ") << rc.top << _T(") / (")\r
+               << rcWidth(&rc) << _T("x") << rcHeight(&rc) << _T(")")\r
+               << std::endl;\r
+\r
+         SystemParametersInfo(SPI_GETWORKAREA, 0, (void *)&rc, FALSE);\r
+         m_log << _T("Desktop Window Position/Size: (")\r
+               << rc.left << _T(", ") << rc.top << _T(") / (")\r
+               << rcWidth(&rc) << _T("x") << rcHeight(&rc) << _T(")")\r
+               << std::endl;\r
+         \r
+         m_log << std::endl;\r
+         break;\r
+       }\r
+       \r
+       case Notify::Type_lockState:\r
+       {\r
+         NotifyLockState *n = (NotifyLockState *)cd->lpData;\r
+         m_engine.setLockState(n->m_isNumLockToggled,\r
+                               n->m_isCapsLockToggled,\r
+                               n->m_isScrollLockToggled,\r
+                               n->m_isKanaLockToggled,\r
+                               n->m_isImeLockToggled,\r
+                               n->m_isImeCompToggled);\r
+#if 0\r
+         Acquire a(&m_log, 0);\r
+         if (n->m_isKanaLockToggled) {\r
+           m_log << _T("Notify::Type_lockState Kana on  : ");\r
+         } else {\r
+           m_log << _T("Notify::Type_lockState Kana off : ");\r
+         }\r
+         m_log << n->m_debugParam << ", "\r
+               << g_hookData->m_correctKanaLockHandling << std::endl;\r
+#endif\r
+         break;\r
+       }\r
+\r
+       case Notify::Type_sync:\r
+       {\r
+         m_engine.syncNotify();\r
+         break;\r
+       }\r
+\r
+       case Notify::Type_threadDetach:\r
+       {\r
+         NotifyThreadDetach *n = (NotifyThreadDetach *)cd->lpData;\r
+         m_engine.threadDetachNotify(n->m_threadId);\r
+         break;\r
+       }\r
+\r
+       case Notify::Type_command:\r
+       {\r
+         NotifyCommand *n = (NotifyCommand *)cd->lpData;\r
+         m_engine.commandNotify(n->m_hwnd, n->m_message,\r
+                                n->m_wParam, n->m_lParam);\r
+         break;\r
+       }\r
+\r
+       case Notify::Type_show:\r
+       {\r
+         NotifyShow *n = (NotifyShow *)cd->lpData;\r
+         switch (n->m_show)\r
+         {\r
+           case NotifyShow::Show_Maximized:\r
+             m_engine.setShow(true, false, n->m_isMDI);\r
+             break;\r
+           case NotifyShow::Show_Minimized:\r
+             m_engine.setShow(false, true, n->m_isMDI);\r
+             break;\r
+           case NotifyShow::Show_Normal:\r
+           default:\r
+             m_engine.setShow(false, false, n->m_isMDI);\r
+             break;\r
+         }       \r
+         break;\r
+       }\r
+\r
+       case Notify::Type_log:\r
+       {\r
+         Acquire a(&m_log, 1);\r
+         NotifyLog *n = (NotifyLog *)cd->lpData;\r
+         m_log << _T("hook log: ") << n->m_msg << std::endl;\r
+         break;\r
+       }\r
+      }\r
+      return true;\r
+  }\r
+\r
+  /// window procedure for tasktray\r
+  static LRESULT CALLBACK\r
+  tasktray_wndProc(HWND i_hwnd, UINT i_message,\r
+                  WPARAM i_wParam, LPARAM i_lParam)\r
+  {\r
+#ifdef MAYU64\r
+    Mayu *This = reinterpret_cast<Mayu *>(GetWindowLongPtr(i_hwnd, 0));\r
+#else\r
+    Mayu *This = reinterpret_cast<Mayu *>(GetWindowLong(i_hwnd, 0));\r
+#endif\r
+\r
+    if (!This)\r
+      switch (i_message)\r
+      {\r
+       case WM_CREATE:\r
+         This = reinterpret_cast<Mayu *>(\r
+           reinterpret_cast<CREATESTRUCT *>(i_lParam)->lpCreateParams);\r
+#ifdef MAYU64\r
+         SetWindowLongPtr(i_hwnd, 0, (LONG_PTR)This);\r
+#else\r
+         SetWindowLong(i_hwnd, 0, (long)This);\r
+#endif\r
+         return 0;\r
+      }\r
+    else\r
+      switch (i_message)\r
+      {\r
+        case WM_COPYDATA:\r
+       {\r
+         COPYDATASTRUCT *cd;\r
+         cd = reinterpret_cast<COPYDATASTRUCT *>(i_lParam);\r
+         return This->notifyHandler(cd);\r
+       }\r
+        case WM_QUERYENDSESSION:\r
+         This->m_engine.prepairQuit();\r
+         PostQuitMessage(0);\r
+         return TRUE;\r
+\r
+#ifndef WM_WTSSESSION_CHANGE                   // WinUser.h\r
+#  define WM_WTSSESSION_CHANGE            0x02B1\r
+#endif\r
+       case WM_WTSSESSION_CHANGE:\r
+       {\r
+         const char *m = "";\r
+         switch (i_wParam)\r
+         {\r
+#ifndef WTS_CONSOLE_CONNECT                    // WinUser.h\r
+#  define WTS_CONSOLE_CONNECT                0x1\r
+#  define WTS_CONSOLE_DISCONNECT             0x2\r
+#  define WTS_REMOTE_CONNECT                 0x3\r
+#  define WTS_REMOTE_DISCONNECT              0x4\r
+#  define WTS_SESSION_LOGON                  0x5\r
+#  define WTS_SESSION_LOGOFF                 0x6\r
+#  define WTS_SESSION_LOCK                   0x7\r
+#  define WTS_SESSION_UNLOCK                 0x8\r
+#endif\r
+           case WTS_CONSOLE_CONNECT:\r
+             m = "WTS_CONSOLE_CONNECT";\r
+             if (!This->m_engine.resume()) {\r
+               This->m_engine.prepairQuit();\r
+               PostQuitMessage(0);\r
+             }\r
+             break;\r
+           case WTS_CONSOLE_DISCONNECT:\r
+             m = "WTS_CONSOLE_DISCONNECT";\r
+             This->m_engine.pause();\r
+             break;\r
+           case WTS_REMOTE_CONNECT: m = "WTS_REMOTE_CONNECT"; break;\r
+           case WTS_REMOTE_DISCONNECT: m = "WTS_REMOTE_DISCONNECT"; break;\r
+           case WTS_SESSION_LOGON:  m = "WTS_SESSION_LOGON"; break;\r
+           case WTS_SESSION_LOGOFF: m = "WTS_SESSION_LOGOFF"; break;\r
+           case WTS_SESSION_LOCK: m = "WTS_SESSION_LOCK"; break;\r
+           case WTS_SESSION_UNLOCK: m = "WTS_SESSION_UNLOCK"; break;\r
+             //case WTS_SESSION_REMOTE_CONTROL: m = "WTS_SESSION_REMOTE_CONTROL"; break;\r
+         }\r
+         This->m_log << _T("WM_WTSESSION_CHANGE(")\r
+                     << i_wParam << ", " << i_lParam << "): "\r
+                     << m << std::endl;\r
+         return TRUE;\r
+       }\r
+       case WM_APP_msgStreamNotify:\r
+       {\r
+         tomsgstream::StreamBuf *log =\r
+           reinterpret_cast<tomsgstream::StreamBuf *>(i_lParam);\r
+         const tstring &str = log->acquireString();\r
+#ifdef LOG_TO_FILE\r
+         This->m_logFile << str << std::flush;\r
+#endif // LOG_TO_FILE\r
+         editInsertTextAtLast(GetDlgItem(This->m_hwndLog, IDC_EDIT_log),\r
+                              str, 65000);\r
+         log->releaseString();\r
+         return 0;\r
+       }\r
+       \r
+       case WM_APP_taskTrayNotify:\r
+       {\r
+         if (i_wParam == ID_TaskTrayIcon)\r
+           switch (i_lParam)\r
+           {\r
+             case WM_RBUTTONUP:\r
+             {\r
+               POINT p;\r
+               CHECK_TRUE( GetCursorPos(&p) );\r
+               SetForegroundWindow(i_hwnd);\r
+               HMENU hMenuSub = GetSubMenu(This->m_hMenuTaskTray, 0);\r
+               if (This->m_engine.getIsEnabled())\r
+                 CheckMenuItem(hMenuSub, ID_MENUITEM_disable,\r
+                               MF_UNCHECKED | MF_BYCOMMAND);\r
+               else\r
+                 CheckMenuItem(hMenuSub, ID_MENUITEM_disable,\r
+                               MF_CHECKED | MF_BYCOMMAND);\r
+               CHECK_TRUE( SetMenuDefaultItem(hMenuSub,\r
+                                         ID_MENUITEM_investigate, FALSE) );\r
+\r
+               // create reload menu\r
+               HMENU hMenuSubSub = GetSubMenu(hMenuSub, 1);\r
+               Registry reg(MAYU_REGISTRY_ROOT);\r
+               int mayuIndex;\r
+               reg.read(_T(".mayuIndex"), &mayuIndex, 0);\r
+               while (DeleteMenu(hMenuSubSub, 0, MF_BYPOSITION))\r
+                 ;\r
+               tregex getName(_T("^([^;]*);"));\r
+               for (int index = 0; ; index ++)\r
+               {\r
+                 _TCHAR buf[100];\r
+                 _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), index);\r
+                 tstringi dot_mayu;\r
+                 if (!reg.read(buf, &dot_mayu))\r
+                   break;\r
+                 tsmatch what;\r
+                 if (boost::regex_search(dot_mayu, what, getName))\r
+                 {\r
+                   MENUITEMINFO mii;\r
+                   std::memset(&mii, 0, sizeof(mii));\r
+                   mii.cbSize = sizeof(mii);\r
+                   mii.fMask = MIIM_ID | MIIM_STATE | MIIM_TYPE;\r
+                   mii.fType = MFT_STRING;\r
+                   mii.fState =\r
+                     MFS_ENABLED | ((mayuIndex == index) ? MFS_CHECKED : 0);\r
+                   mii.wID = ID_MENUITEM_reloadBegin + index;\r
+                   tstringi name(what.str(1));\r
+                   mii.dwTypeData = const_cast<_TCHAR *>(name.c_str());\r
+                   mii.cch = name.size();\r
+                   \r
+                   InsertMenuItem(hMenuSubSub, index, TRUE, &mii);\r
+                 }\r
+               }\r
+\r
+               // show popup menu\r
+               TrackPopupMenu(hMenuSub, TPM_LEFTALIGN,\r
+                              p.x, p.y, 0, i_hwnd, NULL);\r
+               // TrackPopupMenu may fail (ERROR_POPUP_ALREADY_ACTIVE)\r
+               break;\r
+             }\r
+             \r
+             case WM_LBUTTONDBLCLK:\r
+               SendMessage(i_hwnd, WM_COMMAND,\r
+                           MAKELONG(ID_MENUITEM_investigate, 0), 0);\r
+               break;\r
+           }\r
+         return 0;\r
+       }\r
+      \r
+       case WM_COMMAND:\r
+       {\r
+         int notify_code = HIWORD(i_wParam);\r
+         int id = LOWORD(i_wParam);\r
+         if (notify_code == 0) // menu\r
+           switch (id)\r
+           {\r
+             default:\r
+               if (ID_MENUITEM_reloadBegin <= id)\r
+               {\r
+                 Registry reg(MAYU_REGISTRY_ROOT);\r
+                 reg.write(_T(".mayuIndex"), id - ID_MENUITEM_reloadBegin);\r
+                 This->load();\r
+               }\r
+               break;\r
+             case ID_MENUITEM_reload:\r
+               This->load();\r
+               break;\r
+             case ID_MENUITEM_investigate:\r
+             {\r
+               ShowWindow(This->m_hwndLog, SW_SHOW);\r
+               ShowWindow(This->m_hwndInvestigate, SW_SHOW);\r
+               \r
+               RECT rc1, rc2;\r
+               GetWindowRect(This->m_hwndInvestigate, &rc1);\r
+               GetWindowRect(This->m_hwndLog, &rc2);\r
+\r
+               MoveWindow(This->m_hwndLog, rc1.left, rc1.bottom,\r
+                          rcWidth(&rc1), rcHeight(&rc2), TRUE);\r
+               \r
+               SetForegroundWindow(This->m_hwndLog);\r
+               SetForegroundWindow(This->m_hwndInvestigate);\r
+               break;\r
+             }\r
+             case ID_MENUITEM_setting:\r
+               if (!This->m_isSettingDialogOpened)\r
+               {\r
+                 This->m_isSettingDialogOpened = true;\r
+                 if (DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_setting),\r
+                               NULL, dlgSetting_dlgProc))\r
+                   This->load();\r
+                 This->m_isSettingDialogOpened = false;\r
+               }\r
+               break;\r
+             case ID_MENUITEM_log:\r
+               ShowWindow(This->m_hwndLog, SW_SHOW);\r
+               SetForegroundWindow(This->m_hwndLog);\r
+               break;\r
+             case ID_MENUITEM_check:\r
+             {\r
+               BOOL ret;\r
+               BYTE keys[256];\r
+               ret = GetKeyboardState(keys);\r
+               if (ret == 0)\r
+               {\r
+                 This->m_log << _T("Check Keystate Failed(%d)")\r
+                             << GetLastError() << std::endl;\r
+               }\r
+               else\r
+               {\r
+                 This->m_log << _T("Check Keystate: ") << std::endl;\r
+                 for (int i = 0; i < 0xff; i++)\r
+                 {\r
+                   USHORT asyncKey;\r
+                   asyncKey = GetAsyncKeyState(i);\r
+                   This->m_log << std::hex;\r
+                   if (asyncKey & 0x8000)\r
+                   {\r
+                     This->m_log << _T("  ") << VK2TCHAR[i]\r
+                                 << _T("(0x") << i << _T("): pressed!")\r
+                                 << std::endl;\r
+                   }\r
+                   if (i == 0x14 || // VK_CAPTITAL\r
+                       i == 0x15 || // VK_KANA\r
+                       i == 0x19 || // VK_KANJI\r
+                       i == 0x90 || // VK_NUMLOCK\r
+                       i == 0x91    // VK_SCROLL\r
+                       )\r
+                   {\r
+                     if (keys[i] & 1)\r
+                     {\r
+                       This->m_log << _T("  ") << VK2TCHAR[i]\r
+                                   << _T("(0x") << i << _T("): locked!")\r
+                                   << std::endl;\r
+                     }\r
+                   }\r
+                   This->m_log << std::dec;\r
+                 }\r
+                 This->m_log << std::endl;\r
+               }\r
+               break;\r
+             }\r
+             case ID_MENUITEM_version:\r
+               ShowWindow(This->m_hwndVersion, SW_SHOW);\r
+               SetForegroundWindow(This->m_hwndVersion);\r
+               break;\r
+             case ID_MENUITEM_help:\r
+             {\r
+               _TCHAR buf[GANA_MAX_PATH];\r
+               CHECK_TRUE( GetModuleFileName(g_hInst, buf, NUMBER_OF(buf)) );\r
+               tstringi helpFilename = pathRemoveFileSpec(buf);\r
+               helpFilename += _T("\\");\r
+               helpFilename += loadString(IDS_helpFilename);\r
+               ShellExecute(NULL, _T("open"), helpFilename.c_str(),\r
+                            NULL, NULL, SW_SHOWNORMAL);\r
+               break;\r
+             }\r
+             case ID_MENUITEM_disable:\r
+               This->m_engine.enable(!This->m_engine.getIsEnabled());\r
+               This->showTasktrayIcon();\r
+               break;\r
+             case ID_MENUITEM_quit:\r
+               This->m_engine.prepairQuit();\r
+               PostQuitMessage(0);\r
+               break;\r
+           }\r
+         return 0;\r
+       }\r
+\r
+       case WM_APP_engineNotify:\r
+       {\r
+         switch (i_wParam)\r
+         {\r
+           case EngineNotify_shellExecute:\r
+             This->m_engine.shellExecute();\r
+             break;\r
+           case EngineNotify_loadSetting:\r
+             This->load();\r
+             break;\r
+           case EngineNotify_helpMessage:\r
+             This->showHelpMessage(false);\r
+             if (i_lParam)\r
+               This->showHelpMessage(true);\r
+             break;\r
+           case EngineNotify_showDlg:\r
+           {\r
+             // show investigate/log window\r
+             int sw = (i_lParam & ~MayuDialogType_mask);\r
+             HWND hwnd = NULL;\r
+             switch (static_cast<MayuDialogType>(\r
+               i_lParam & MayuDialogType_mask))\r
+             {\r
+               case MayuDialogType_investigate:\r
+                 hwnd = This->m_hwndInvestigate;\r
+                 break;\r
+               case MayuDialogType_log:\r
+                 hwnd = This->m_hwndLog;\r
+                 break;\r
+             }\r
+             if (hwnd)\r
+             {\r
+               ShowWindow(hwnd, sw);\r
+               switch (sw)\r
+               {\r
+                 case SW_SHOWNORMAL:\r
+                 case SW_SHOWMAXIMIZED:\r
+                 case SW_SHOW:\r
+                 case SW_RESTORE:\r
+                 case SW_SHOWDEFAULT:\r
+                   SetForegroundWindow(hwnd);\r
+                   break;\r
+               }\r
+             }\r
+             break;\r
+           }\r
+           case EngineNotify_setForegroundWindow:\r
+             // FIXME: completely useless. why ?\r
+             setForegroundWindow(reinterpret_cast<HWND>(i_lParam));\r
+             {\r
+               Acquire a(&This->m_log, 1);\r
+               This->m_log << _T("setForegroundWindow(0x")\r
+                           << std::hex << i_lParam << std::dec << _T(")")\r
+                           << std::endl;\r
+             }\r
+             break;\r
+           case EngineNotify_clearLog:\r
+             SendMessage(This->m_hwndLog, WM_COMMAND,\r
+                         MAKELONG(IDC_BUTTON_clearLog, 0), 0);\r
+             break;\r
+           default:\r
+             break;\r
+         }\r
+         return 0;\r
+       }\r
+       \r
+       case WM_APP_dlglogNotify:\r
+       {\r
+         switch (i_wParam)\r
+         {\r
+           case DlgLogNotify_logCleared:\r
+             This->showBanner(true);\r
+             break;\r
+           default:\r
+             break;\r
+         }\r
+         return 0;\r
+       }\r
+\r
+       case WM_DESTROY:\r
+         if (This->m_usingSN)\r
+         {\r
+           wtsUnRegisterSessionNotification(i_hwnd);\r
+           This->m_usingSN = false;\r
+         }\r
+         return 0;\r
+       \r
+       default:\r
+         if (i_message == This->m_WM_TaskbarRestart)\r
+         {\r
+           if (This->showTasktrayIcon(true))\r
+           {\r
+             Acquire a(&This->m_log, 0);\r
+             This->m_log << _T("Tasktray icon is updated.") << std::endl;\r
+           }\r
+           else\r
+           {\r
+             Acquire a(&This->m_log, 1);\r
+             This->m_log << _T("Tasktray icon already exists.") << std::endl;\r
+           }\r
+           return 0;\r
+         }\r
+         else if (i_message == This->m_WM_MayuIPC)\r
+         {\r
+           switch (static_cast<MayuIPCCommand>(i_wParam))\r
+           {\r
+             case MayuIPCCommand_Enable:\r
+               This->m_engine.enable(!!i_lParam);\r
+               This->showTasktrayIcon();\r
+               if (i_lParam)\r
+               {\r
+                 Acquire a(&This->m_log, 1);\r
+                 This->m_log << _T("Enabled by another application.")\r
+                             << std::endl;\r
+               }\r
+               else\r
+               {\r
+                 Acquire a(&This->m_log, 1);\r
+                 This->m_log << _T("Disabled by another application.")\r
+                             << std::endl;\r
+               }\r
+               break;\r
+           }\r
+         }\r
+      }\r
+    return DefWindowProc(i_hwnd, i_message, i_wParam, i_lParam);\r
+  }\r
+\r
+  /// load setting\r
+  void load()\r
+  {\r
+    Setting *newSetting = new Setting;\r
+\r
+    // set symbol\r
+    for (int i = 1; i < __argc; ++ i)\r
+    {\r
+      if (__targv[i][0] == _T('-') && __targv[i][1] == _T('D'))\r
+       newSetting->m_symbols.insert(__targv[i] + 2);\r
+    }\r
+\r
+    if (!SettingLoader(&m_log, &m_log).load(newSetting))\r
+    {\r
+      ShowWindow(m_hwndLog, SW_SHOW);\r
+      SetForegroundWindow(m_hwndLog);\r
+      delete newSetting;\r
+      Acquire a(&m_log, 0);\r
+      m_log << _T("error: failed to load.") << std::endl;\r
+      return;\r
+    }\r
+    m_log << _T("successfully loaded.") << std::endl;\r
+    while (!m_engine.setSetting(newSetting))\r
+      Sleep(1000);\r
+    delete m_setting;\r
+    m_setting = newSetting;\r
+  }\r
+\r
+  // show message (a baloon from the task tray icon)\r
+  void showHelpMessage(bool i_doesShow = true)\r
+  {\r
+    if (m_canUseTasktrayBaloon)\r
+    {\r
+      if (i_doesShow)\r
+      {\r
+       tstring helpMessage, helpTitle;\r
+       m_engine.getHelpMessages(&helpMessage, &helpTitle);\r
+       tcslcpy(m_ni.szInfo, helpMessage.c_str(), NUMBER_OF(m_ni.szInfo));\r
+       tcslcpy(m_ni.szInfoTitle, helpTitle.c_str(),\r
+               NUMBER_OF(m_ni.szInfoTitle));\r
+       m_ni.dwInfoFlags = NIIF_INFO;\r
+      }\r
+      else\r
+       m_ni.szInfo[0] = m_ni.szInfoTitle[0] = _T('\0');\r
+      CHECK_TRUE( Shell_NotifyIcon(NIM_MODIFY, &m_ni) );\r
+    }\r
+  }\r
+  \r
+  // change the task tray icon\r
+  bool showTasktrayIcon(bool i_doesAdd = false)\r
+  {\r
+    m_ni.hIcon  = m_tasktrayIcon[m_engine.getIsEnabled() ? 1 : 0];\r
+    m_ni.szInfo[0] = m_ni.szInfoTitle[0] = _T('\0');\r
+    if (i_doesAdd) {\r
+      // http://support.microsoft.com/kb/418138/JA/\r
+      int guard = 60;\r
+      for (; !Shell_NotifyIcon(NIM_ADD, &m_ni) && 0 < guard; -- guard) {\r
+       if (Shell_NotifyIcon(NIM_MODIFY, &m_ni)) {\r
+         return true;\r
+       }\r
+       Sleep(1000);                            // 1sec\r
+      }\r
+      return 0 < guard;\r
+    } else {\r
+      return !!Shell_NotifyIcon(NIM_MODIFY, &m_ni);\r
+    }\r
+  }\r
+\r
+  void showBanner(bool i_isCleared)\r
+  {\r
+    time_t now;\r
+    time(&now);\r
+      \r
+    _TCHAR starttimebuf[1024];\r
+    _TCHAR timebuf[1024];\r
+\r
+#ifdef __BORLANDC__\r
+#pragma message("\t\t****\tAfter std::ostream() is called,  ")\r
+#pragma message("\t\t****\tstrftime(... \"%%#c\" ...) fails.")\r
+#pragma message("\t\t****\tWhy ? Bug of Borland C++ 5.5.1 ? ")\r
+#pragma message("\t\t****\t                         - nayuta")\r
+    _tcsftime(timebuf, NUMBER_OF(timebuf), _T("%Y/%m/%d %H:%M:%S"),\r
+             localtime(&now));\r
+    _tcsftime(starttimebuf, NUMBER_OF(starttimebuf), _T("%Y/%m/%d %H:%M:%S"),\r
+             localtime(&m_startTime));\r
+#else\r
+    _tcsftime(timebuf, NUMBER_OF(timebuf), _T("%#c"), localtime(&now));\r
+    _tcsftime(starttimebuf, NUMBER_OF(starttimebuf), _T("%#c"),\r
+             localtime(&m_startTime));\r
+#endif\r
+      \r
+    Acquire a(&m_log, 0);\r
+    m_log << _T("------------------------------------------------------------") << std::endl;\r
+    m_log << loadString(IDS_mayu) << _T(" ") _T(VERSION);\r
+#ifndef NDEBUG\r
+    m_log << _T(" (DEBUG)");\r
+#endif\r
+#ifdef _UNICODE\r
+    m_log << _T(" (UNICODE)");\r
+#endif\r
+    m_log << std::endl;\r
+    m_log << _T("  built by ")\r
+         << _T(LOGNAME) << _T("@") << toLower(_T(COMPUTERNAME))\r
+         << _T(" (") << _T(__DATE__) <<  _T(" ")\r
+         << _T(__TIME__) << _T(", ")\r
+         << getCompilerVersionString() << _T(")") << std::endl;\r
+    _TCHAR modulebuf[1024];\r
+    CHECK_TRUE( GetModuleFileName(g_hInst, modulebuf,\r
+                                 NUMBER_OF(modulebuf)) );\r
+    m_log << _T("started at ") << starttimebuf << std::endl;\r
+    m_log << modulebuf << std::endl;\r
+    m_log << _T("------------------------------------------------------------") << std::endl;\r
+\r
+    if (i_isCleared) {\r
+      m_log << _T("log was cleared at ") << timebuf << std::endl;\r
+    } else {\r
+      m_log << _T("log begins at ") << timebuf << std::endl;\r
+    }\r
+  }\r
+\r
+public:\r
+  ///\r
+  Mayu(HANDLE i_mutex)\r
+    : m_hwndTaskTray(NULL),\r
+      m_mutex(i_mutex),\r
+      m_hwndLog(NULL),\r
+      m_WM_TaskbarRestart(RegisterWindowMessage(_T("TaskbarCreated"))),\r
+      m_WM_MayuIPC(RegisterWindowMessage(WM_MayuIPC_NAME)),\r
+      m_canUseTasktrayBaloon(\r
+       PACKVERSION(5, 0) <= getDllVersion(_T("shlwapi.dll"))),\r
+      m_log(WM_APP_msgStreamNotify),\r
+      m_setting(NULL),\r
+      m_isSettingDialogOpened(false),\r
+      m_engine(m_log)\r
+  {\r
+#ifdef USE_MAILSLOT\r
+       m_hNotifyMailslot = CreateMailslot(NOTIFY_MAILSLOT_NAME, 0, MAILSLOT_WAIT_FOREVER, (SECURITY_ATTRIBUTES *)NULL);\r
+       ASSERT(m_hNotifyMailslot != INVALID_HANDLE_VALUE);\r
+       m_hNotifyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);\r
+       ASSERT(m_hNotifyEvent);\r
+       m_olNotify.Offset = 0;\r
+       m_olNotify.OffsetHigh = 0;\r
+       m_olNotify.hEvent = m_hNotifyEvent;\r
+#endif // USE_MAILSLOT\r
+    time(&m_startTime);\r
+\r
+    CHECK_TRUE( Register_focus() );\r
+    CHECK_TRUE( Register_target() );\r
+    CHECK_TRUE( Register_tasktray() );\r
+\r
+    // change dir\r
+#if 0\r
+    HomeDirectories pathes;\r
+    getHomeDirectories(&pathes);\r
+    for (HomeDirectories::iterator i = pathes.begin(); i != pathes.end(); ++ i)\r
+      if (SetCurrentDirectory(i->c_str()))\r
+       break;\r
+#endif\r
+    \r
+    // create windows, dialogs\r
+    tstringi title = loadString(IDS_mayu);\r
+    m_hwndTaskTray = CreateWindow(_T("mayuTasktray"), title.c_str(),\r
+                                 WS_OVERLAPPEDWINDOW,\r
+                                 CW_USEDEFAULT, CW_USEDEFAULT, \r
+                                 CW_USEDEFAULT, CW_USEDEFAULT, \r
+                                 NULL, NULL, g_hInst, this);\r
+    CHECK_TRUE( m_hwndTaskTray );\r
+    \r
+    // set window handle of tasktray to hooks\r
+#ifndef USE_MAILSLOT\r
+    g_hookData->m_hwndTaskTray = reinterpret_cast<DWORD>(m_hwndTaskTray);\r
+#endif // !USE_MAILSLOT\r
+    CHECK_FALSE( installHooks(Engine::keyboardDetour, &m_engine) );\r
+    m_usingSN = wtsRegisterSessionNotification(m_hwndTaskTray,\r
+                                              NOTIFY_FOR_THIS_SESSION);\r
+\r
+    DlgLogData dld;\r
+    dld.m_log = &m_log;\r
+    dld.m_hwndTaskTray = m_hwndTaskTray;\r
+    m_hwndLog =\r
+      CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_log), NULL,\r
+                       dlgLog_dlgProc, (LPARAM)&dld);\r
+    CHECK_TRUE( m_hwndLog );\r
+\r
+    DlgInvestigateData did;\r
+    did.m_engine = &m_engine;\r
+    did.m_hwndLog = m_hwndLog;\r
+    m_hwndInvestigate =\r
+      CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_investigate), NULL,\r
+                       dlgInvestigate_dlgProc, (LPARAM)&did);\r
+    CHECK_TRUE( m_hwndInvestigate );\r
+\r
+    m_hwndVersion =\r
+      CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_version),\r
+                       NULL, dlgVersion_dlgProc,\r
+                       (LPARAM)m_engine.getMayudVersion().c_str());\r
+    CHECK_TRUE( m_hwndVersion );\r
+\r
+    // attach log\r
+#ifdef LOG_TO_FILE\r
+    tstring path;\r
+    _TCHAR exePath[GANA_MAX_PATH];\r
+    _TCHAR exeDrive[GANA_MAX_PATH];\r
+    _TCHAR exeDir[GANA_MAX_PATH];\r
+    GetModuleFileName(NULL, exePath, GANA_MAX_PATH);\r
+    _tsplitpath_s(exePath, exeDrive, GANA_MAX_PATH, exeDir, GANA_MAX_PATH, NULL, 0, NULL, 0);\r
+    path = exeDrive;\r
+    path += exeDir;\r
+    path += _T("mayu.log");\r
+    m_logFile.open(path.c_str(), std::ios::app);\r
+    m_logFile.imbue(std::locale("japanese"));\r
+#endif // LOG_TO_FILE\r
+    SendMessage(GetDlgItem(m_hwndLog, IDC_EDIT_log), EM_SETLIMITTEXT, 0, 0);\r
+    m_log.attach(m_hwndTaskTray);\r
+\r
+    // start keyboard handler thread\r
+    m_engine.setAssociatedWndow(m_hwndTaskTray);\r
+    m_engine.start();\r
+    \r
+    // show tasktray icon\r
+    m_tasktrayIcon[0] = loadSmallIcon(IDI_ICON_mayu_disabled);\r
+    m_tasktrayIcon[1] = loadSmallIcon(IDI_ICON_mayu);\r
+    std::memset(&m_ni, 0, sizeof(m_ni));\r
+    m_ni.uID    = ID_TaskTrayIcon;\r
+    m_ni.hWnd   = m_hwndTaskTray;\r
+    m_ni.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;\r
+    m_ni.hIcon  = m_tasktrayIcon[1];\r
+    m_ni.uCallbackMessage = WM_APP_taskTrayNotify;\r
+    tstring tip = loadString(IDS_mayu);\r
+    tcslcpy(m_ni.szTip, tip.c_str(), NUMBER_OF(m_ni.szTip));\r
+    if (m_canUseTasktrayBaloon)\r
+    {\r
+      m_ni.cbSize = sizeof(m_ni);\r
+      m_ni.uFlags |= NIF_INFO;\r
+    }\r
+    else\r
+      m_ni.cbSize = NOTIFYICONDATA_V1_SIZE;\r
+    showTasktrayIcon(true);\r
+\r
+    // create menu\r
+    m_hMenuTaskTray = LoadMenu(g_hInst, MAKEINTRESOURCE(IDR_MENU_tasktray));\r
+    ASSERT(m_hMenuTaskTray);\r
+    \r
+    // set initial lock state\r
+    notifyLockState();\r
+\r
+    BOOL result;\r
+\r
+    ZeroMemory(&m_pi,sizeof(m_pi));\r
+    ZeroMemory(&m_si,sizeof(m_si));\r
+    m_si.cb=sizeof(m_si);\r
+#ifdef _WIN64\r
+    result = CreateProcess(_T("yamyd32"), _T("yamyd32"), NULL, NULL, FALSE,\r
+                          NORMAL_PRIORITY_CLASS, 0, NULL, &m_si, &m_pi);\r
+    if (result == FALSE)\r
+    {\r
+      TCHAR buf[1024];\r
+      TCHAR text[1024];\r
+      TCHAR title[1024];\r
+\r
+      LoadString(GetModuleHandle(NULL), IDS_cannotInvoke,\r
+                text, sizeof(text)/sizeof(text[0]));\r
+      LoadString(GetModuleHandle(NULL), IDS_mayu,\r
+                title, sizeof(title)/sizeof(title[0]));\r
+      _stprintf_s(buf, sizeof(buf)/sizeof(buf[0]),\r
+                 text, _T("yamyd32"), GetLastError());\r
+      MessageBox((HWND)NULL, buf, title, MB_OK | MB_ICONSTOP);\r
+    }\r
+    else\r
+    {\r
+      CloseHandle(m_pi.hThread);\r
+      CloseHandle(m_pi.hProcess);\r
+    }\r
+#endif // _WIN64\r
+  }\r
+\r
+  ///\r
+  ~Mayu()\r
+  {\r
+    ReleaseMutex(m_mutex);\r
+    WaitForSingleObject(m_mutex, INFINITE);\r
+    // first, detach log from edit control to avoid deadlock\r
+    m_log.detach();\r
+#ifdef LOG_TO_FILE\r
+    m_logFile.close();\r
+#endif // LOG_TO_FILE\r
+   \r
+    // stop notify from mayu.dll\r
+    g_hookData->m_hwndTaskTray = NULL;\r
+    CHECK_FALSE( uninstallHooks() );\r
+       PostMessage(HWND_BROADCAST, WM_NULL, 0, 0);\r
+    \r
+    // destroy windows\r
+    CHECK_TRUE( DestroyWindow(m_hwndVersion) );\r
+    CHECK_TRUE( DestroyWindow(m_hwndInvestigate) );\r
+    CHECK_TRUE( DestroyWindow(m_hwndLog) );\r
+    CHECK_TRUE( DestroyWindow(m_hwndTaskTray) );\r
+    \r
+    // destroy menu\r
+    DestroyMenu(m_hMenuTaskTray);\r
+    \r
+    // delete tasktray icon\r
+    CHECK_TRUE( Shell_NotifyIcon(NIM_DELETE, &m_ni) );\r
+    CHECK_TRUE( DestroyIcon(m_tasktrayIcon[1]) );\r
+    CHECK_TRUE( DestroyIcon(m_tasktrayIcon[0]) );\r
+\r
+    // stop keyboard handler thread\r
+    m_engine.stop();\r
+    \r
+    // remove setting;\r
+    delete m_setting;\r
+    \r
+#ifdef USE_MAILSLOT\r
+    CloseHandle(m_hNotifyEvent);\r
+    CloseHandle(m_hNotifyMailslot);\r
+#endif // USE_MAILSLOT\r
+  }\r
+\r
+  /// message loop\r
+  WPARAM messageLoop()\r
+  {\r
+    showBanner(false);\r
+    load();\r
+    \r
+#ifdef USE_MAILSLOT\r
+    mailslotHandler(0, 0);\r
+    while (1)\r
+    {\r
+      HANDLE handles[] = { m_hNotifyEvent };\r
+      DWORD ret;\r
+      switch (ret = MsgWaitForMultipleObjectsEx(NUMBER_OF(handles), &handles[0],\r
+                                                                                               INFINITE, QS_ALLINPUT, MWMO_ALERTABLE | MWMO_INPUTAVAILABLE))\r
+      {\r
+       case WAIT_OBJECT_0:                     // m_hNotifyEvent\r
+         break;\r
+         \r
+        case WAIT_OBJECT_0 + NUMBER_OF(handles):\r
+       {\r
+         MSG msg;\r
+         if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) != 0)\r
+         {\r
+           if (msg.message == WM_QUIT)\r
+           {\r
+             return msg.wParam;\r
+           }\r
+           if (IsDialogMessage(m_hwndLog, &msg))\r
+             break;\r
+           if (IsDialogMessage(m_hwndInvestigate, &msg))\r
+             break;\r
+           if (IsDialogMessage(m_hwndVersion, &msg))\r
+             break;\r
+           TranslateMessage(&msg);\r
+           DispatchMessage(&msg);\r
+           break;\r
+         }\r
+         break;\r
+       }\r
+       \r
+        case WAIT_IO_COMPLETION:\r
+         break;\r
+       \r
+        case 0x102:\r
+        default:\r
+         break;\r
+      }\r
+    }\r
+#else // !USE_MAILSLOT\r
+    MSG msg;\r
+    while (0 < GetMessage(&msg, NULL, 0, 0))\r
+    {\r
+      if (IsDialogMessage(m_hwndLog, &msg))\r
+       continue;\r
+      if (IsDialogMessage(m_hwndInvestigate, &msg))\r
+       continue;\r
+      if (IsDialogMessage(m_hwndVersion, &msg))\r
+       continue;\r
+      TranslateMessage(&msg);\r
+      DispatchMessage(&msg);\r
+    }\r
+    return msg.wParam;\r
+#endif // !USE_MAILSLOT\r
+  }  \r
+};\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Functions\r
+\r
+\r
+/// convert registry\r
+void convertRegistry()\r
+{\r
+  Registry reg(MAYU_REGISTRY_ROOT);\r
+  tstringi dot_mayu;\r
+  bool doesAdd = false;\r
+  DWORD index;\r
+  if (reg.read(_T(".mayu"), &dot_mayu))\r
+  {\r
+    reg.write(_T(".mayu0"), _T(";") + dot_mayu + _T(";"));\r
+    reg.remove(_T(".mayu"));\r
+    doesAdd = true;\r
+    index = 0;\r
+  }\r
+  else if (!reg.read(_T(".mayu0"), &dot_mayu))\r
+  {\r
+    reg.write(_T(".mayu0"), loadString(IDS_readFromHomeDirectory) + _T(";;"));\r
+    doesAdd = true;\r
+    index = 1;\r
+  }\r
+  if (doesAdd)\r
+  {\r
+    Registry commonreg(HKEY_LOCAL_MACHINE, _T("Software\\GANAware\\mayu"));\r
+    tstringi dir, layout;\r
+    if (commonreg.read(_T("dir"), &dir) &&\r
+       commonreg.read(_T("layout"), &layout))\r
+    {\r
+      tstringi tmp = _T(";") + dir + _T("\\dot.mayu");\r
+      if (layout == _T("109"))\r
+      {\r
+       reg.write(_T(".mayu1"), loadString(IDS_109Emacs) + tmp\r
+                 + _T(";-DUSE109") _T(";-DUSEdefault"));\r
+       reg.write(_T(".mayu2"), loadString(IDS_104on109Emacs) + tmp\r
+                 + _T(";-DUSE109") _T(";-DUSEdefault") _T(";-DUSE104on109"));\r
+       reg.write(_T(".mayu3"), loadString(IDS_109) + tmp\r
+                 + _T(";-DUSE109"));\r
+       reg.write(_T(".mayu4"), loadString(IDS_104on109) + tmp\r
+                 + _T(";-DUSE109") _T(";-DUSE104on109"));\r
+      }\r
+      else\r
+      {\r
+       reg.write(_T(".mayu1"), loadString(IDS_104Emacs) + tmp\r
+                 + _T(";-DUSE104") _T(";-DUSEdefault"));\r
+       reg.write(_T(".mayu2"), loadString(IDS_109on104Emacs) + tmp\r
+                 + _T(";-DUSE104") _T(";-DUSEdefault") _T(";-DUSE109on104"));\r
+       reg.write(_T(".mayu3"), loadString(IDS_104) + tmp\r
+                 + _T(";-DUSE104"));\r
+       reg.write(_T(".mayu4"), loadString(IDS_109on104) + tmp\r
+                 + _T(";-DUSE104") _T(";-DUSE109on104"));\r
+      }\r
+      reg.write(_T(".mayuIndex"), index);\r
+    }\r
+  }\r
+}\r
+\r
+\r
+/// main\r
+int WINAPI _tWinMain(HINSTANCE i_hInstance, HINSTANCE /* i_hPrevInstance */,\r
+                    LPTSTR /* i_lpszCmdLine */, int /* i_nCmdShow */)\r
+{\r
+  g_hInst = i_hInstance;\r
+\r
+  // set locale\r
+  CHECK_TRUE( _tsetlocale(LC_ALL, _T("")) );\r
+\r
+  // common controls\r
+#if defined(_WIN95)\r
+  InitCommonControls();\r
+#else\r
+  INITCOMMONCONTROLSEX icc;\r
+  icc.dwSize = sizeof(icc);\r
+  icc.dwICC = ICC_LISTVIEW_CLASSES;\r
+  CHECK_TRUE( InitCommonControlsEx(&icc) );\r
+#endif\r
+\r
+  // convert old registry to new registry\r
+#ifndef USE_INI\r
+  convertRegistry();\r
+#endif // !USE_INI\r
+  \r
+  // is another mayu running ?\r
+  HANDLE mutex = CreateMutex((SECURITY_ATTRIBUTES *)NULL, TRUE,\r
+                            MUTEX_MAYU_EXCLUSIVE_RUNNING);\r
+  if (GetLastError() == ERROR_ALREADY_EXISTS)\r
+  {\r
+    // another mayu already running\r
+    tstring text = loadString(IDS_mayuAlreadyExists);\r
+    tstring title = loadString(IDS_mayu);\r
+    if (g_hookData) {\r
+       UINT WM_TaskbarRestart = RegisterWindowMessage(_T("TaskbarCreated"));\r
+       PostMessage(reinterpret_cast<HWND>(g_hookData->m_hwndTaskTray),\r
+                   WM_TaskbarRestart, 0, 0);\r
+    }\r
+    MessageBox((HWND)NULL, text.c_str(), title.c_str(), MB_OK | MB_ICONSTOP);\r
+    return 1;\r
+  }\r
+\r
+  // check remote desktop\r
+  DWORD sessionId;\r
+  if (!ProcessIdToSessionId(GetCurrentProcessId(), &sessionId) ||\r
+      wtsGetActiveConsoleSessionId() != sessionId)\r
+  {\r
+    tstring text = loadString(IDS_executedInRemoteDesktop);\r
+    tstring title = loadString(IDS_mayu);\r
+    MessageBox((HWND)NULL, text.c_str(), title.c_str(), MB_OK | MB_ICONSTOP);\r
+    return 1;\r
+  }\r
+  \r
+  try\r
+  {\r
+    Mayu(mutex).messageLoop();\r
+  }\r
+  catch (ErrorMessage &i_e)\r
+  {\r
+    tstring title = loadString(IDS_mayu);\r
+    MessageBox((HWND)NULL, i_e.getMessage().c_str(), title.c_str(),\r
+              MB_OK | MB_ICONSTOP);\r
+  }\r
+  \r
+  CHECK_TRUE( CloseHandle(mutex) );\r
+  return 0;\r
+}\r
diff --git a/mayu.h b/mayu.h
index ff6ea99..56dd407 100644 (file)
--- a/mayu.h
+++ b/mayu.h
@@ -1,20 +1,20 @@
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// mayu.h
-
-
-#ifndef _MAYU_H
-#  define _MAYU_H
-
-
-///
-#  define MAYU_REGISTRY_ROOT HKEY_CURRENT_USER, _T("Software\\GANAware\\mayu")
-
-///
-#  define MUTEX_MAYU_EXCLUSIVE_RUNNING         \
-_T("{46269F4D-D560-40f9-B38B-DB5E280FEF47}")
-
-///
-#  define MAX_MAYU_REGISTRY_ENTRIES 256
-
-
-#endif // _MAYU_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// mayu.h\r
+\r
+\r
+#ifndef _MAYU_H\r
+#  define _MAYU_H\r
+\r
+\r
+///\r
+#  define MAYU_REGISTRY_ROOT HKEY_CURRENT_USER, _T("Software\\GANAware\\mayu")\r
+\r
+///\r
+#  define MUTEX_MAYU_EXCLUSIVE_RUNNING         \\r
+_T("{46269F4D-D560-40f9-B38B-DB5E280FEF47}")\r
+\r
+///\r
+#  define MAX_MAYU_REGISTRY_ENTRIES 256\r
+\r
+\r
+#endif // _MAYU_H\r
index 4fc28d6..5b5bbd0 100644 (file)
--- a/mayuipc.h
+++ b/mayuipc.h
@@ -1,60 +1,60 @@
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// mayuipc.h - mayu inter process communication
-
-#ifndef _MAYUIPC_H
-#  define _MAYUIPC_H
-
-#  include <windows.h>
-
-#  ifdef __cplusplus
-extern "C" {
-#  endif // __cplusplus
-
-/// 
-#  define WM_MayuIPC_NAME _T("MayuIPC{46269F4D-D560-40f9-B38B-DB5E280FEF47}")
-
-enum MayuIPCCommand
-{
-       // enable or disable Mayu
-       MayuIPCCommand_Enable = 1,
-};
-
-BOOL MayuIPC_PostMessage(MayuIPCCommand i_wParam, LPARAM i_lParam);
-BOOL MayuIPC_Enable(BOOL i_isEnabled);
-
-#  ifdef _MAYUIPC_H_DEFINE_FUNCTIONS
-
-BOOL MayuIPC_PostMessage(MayuIPCCommand i_command, LPARAM i_lParam)
-{
-       static UINT WM_MayuIPC;
-       HWND hwnd;
-       
-       if (WM_MayuIPC == 0)
-       {
-               WM_MayuIPC = RegisterWindowMessage(WM_MayuIPC_NAME);
-               if (WM_MayuIPC == 0)
-               {
-                       return FALSE;
-               }
-       }
-       
-       hwnd = FindWindow(_T("mayuTasktray"), NULL);
-       if (hwnd == NULL)
-       {
-               return FALSE;
-       }
-       PostMessage(hwnd, WM_MayuIPC, i_command, i_lParam);
-       return TRUE;
-}
-
-BOOL MayuIPC_Enable(BOOL i_isEnabled)
-{
-       return MayuIPC_PostMessage(MayuIPCCommand_Enable, i_isEnabled);
-}
-
-#  endif // _MAYUIPC_H_DEFINE_FUNCTIONS
-
-#  ifdef __cplusplus
-}
-#  endif // __cplusplus
-#endif // !_MAYUIPC_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// mayuipc.h - mayu inter process communication\r
+\r
+#ifndef _MAYUIPC_H\r
+#  define _MAYUIPC_H\r
+\r
+#  include <windows.h>\r
+\r
+#  ifdef __cplusplus\r
+extern "C" {\r
+#  endif // __cplusplus\r
+\r
+/// \r
+#  define WM_MayuIPC_NAME _T("MayuIPC{46269F4D-D560-40f9-B38B-DB5E280FEF47}")\r
+\r
+enum MayuIPCCommand\r
+{\r
+       // enable or disable Mayu\r
+       MayuIPCCommand_Enable = 1,\r
+};\r
+\r
+BOOL MayuIPC_PostMessage(MayuIPCCommand i_wParam, LPARAM i_lParam);\r
+BOOL MayuIPC_Enable(BOOL i_isEnabled);\r
+\r
+#  ifdef _MAYUIPC_H_DEFINE_FUNCTIONS\r
+\r
+BOOL MayuIPC_PostMessage(MayuIPCCommand i_command, LPARAM i_lParam)\r
+{\r
+       static UINT WM_MayuIPC;\r
+       HWND hwnd;\r
+       \r
+       if (WM_MayuIPC == 0)\r
+       {\r
+               WM_MayuIPC = RegisterWindowMessage(WM_MayuIPC_NAME);\r
+               if (WM_MayuIPC == 0)\r
+               {\r
+                       return FALSE;\r
+               }\r
+       }\r
+       \r
+       hwnd = FindWindow(_T("mayuTasktray"), NULL);\r
+       if (hwnd == NULL)\r
+       {\r
+               return FALSE;\r
+       }\r
+       PostMessage(hwnd, WM_MayuIPC, i_command, i_lParam);\r
+       return TRUE;\r
+}\r
+\r
+BOOL MayuIPC_Enable(BOOL i_isEnabled)\r
+{\r
+       return MayuIPC_PostMessage(MayuIPCCommand_Enable, i_isEnabled);\r
+}\r
+\r
+#  endif // _MAYUIPC_H_DEFINE_FUNCTIONS\r
+\r
+#  ifdef __cplusplus\r
+}\r
+#  endif // __cplusplus\r
+#endif // !_MAYUIPC_H\r
diff --git a/misc.h b/misc.h
index 9322f96..b35ddaf 100644 (file)
--- a/misc.h
+++ b/misc.h
@@ -1,67 +1,67 @@
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// misc.h
-
-
-#ifndef _MISC_H
-#  define _MISC_H
-
-#  include "compiler_specific.h"
-#  include <windows.h>
-#  include <cassert>
-
-
-typedef unsigned char u_char;                  /// unsigned char
-typedef unsigned short u_short;                        /// unsigned short
-typedef unsigned long u_long;                  /// unsigned long
-
-typedef char int8;                             /// signed 8bit
-typedef short int16;                           /// signed 16bit
-typedef long int32;                            /// signed 32bit
-typedef unsigned char u_int8;                  /// unsigned 8bit
-typedef unsigned short u_int16;                        /// unsigned 16bit
-typedef unsigned long u_int32;                 /// unsigned 32bit
-#if defined(__BORLANDC__)
-typedef unsigned __int64 u_int64;                      /// unsigned 64bit
-#elif _MSC_VER <= 1300
-typedef unsigned _int64 u_int64;                       /// unsigned 64bit
-#else
-typedef unsigned long long u_int64;                    /// unsigned 64bit
-#endif
-
-
-#  ifdef NDEBUG
-#    define ASSERT(i_exp)
-#    define CHECK(i_cond, i_exp)       i_exp
-#    define CHECK_TRUE(i_exp)          i_exp
-#    define CHECK_FALSE(i_exp)         i_exp
-#  else // NDEBUG
-/// assertion. i_exp is evaluated only in debug build
-#    define ASSERT(i_exp)              assert(i_exp)
-/// assertion, but i_exp is always evaluated
-#    define CHECK(i_cond, i_exp)       assert(i_cond (i_exp))
-/// identical to CHECK(!!, i_exp)
-#    define CHECK_TRUE(i_exp)          assert(!!(i_exp))
-/// identical to CHECK(!, i_exp)
-#    define CHECK_FALSE(i_exp)         assert(!(i_exp))
-#  endif // NDEBUG
-
-
-/// get number of array elements
-#  define NUMBER_OF(i_array) (sizeof(i_array) / sizeof((i_array)[0]))
-
-/// max path length
-#  define GANA_MAX_PATH                (MAX_PATH * 4)
-
-/// max length of global atom
-#  define GANA_MAX_ATOM_LENGTH 256
-
-#  undef MAX
-/// redefine MAX macro
-#  define MAX(a, b)    (((b) < (a)) ? (a) : (b))
-
-#  undef MIN
-/// redefine MIN macro
-#  define MIN(a, b)    (((a) < (b)) ? (a) : (b))
-
-
-#endif // !_MISC_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// misc.h\r
+\r
+\r
+#ifndef _MISC_H\r
+#  define _MISC_H\r
+\r
+#  include "compiler_specific.h"\r
+#  include <windows.h>\r
+#  include <cassert>\r
+\r
+\r
+typedef unsigned char u_char;                  /// unsigned char\r
+typedef unsigned short u_short;                        /// unsigned short\r
+typedef unsigned long u_long;                  /// unsigned long\r
+\r
+typedef char int8;                             /// signed 8bit\r
+typedef short int16;                           /// signed 16bit\r
+typedef long int32;                            /// signed 32bit\r
+typedef unsigned char u_int8;                  /// unsigned 8bit\r
+typedef unsigned short u_int16;                        /// unsigned 16bit\r
+typedef unsigned long u_int32;                 /// unsigned 32bit\r
+#if defined(__BORLANDC__)\r
+typedef unsigned __int64 u_int64;                      /// unsigned 64bit\r
+#elif _MSC_VER <= 1300\r
+typedef unsigned _int64 u_int64;                       /// unsigned 64bit\r
+#else\r
+typedef unsigned long long u_int64;                    /// unsigned 64bit\r
+#endif\r
+\r
+\r
+#  ifdef NDEBUG\r
+#    define ASSERT(i_exp)\r
+#    define CHECK(i_cond, i_exp)       i_exp\r
+#    define CHECK_TRUE(i_exp)          i_exp\r
+#    define CHECK_FALSE(i_exp)         i_exp\r
+#  else // NDEBUG\r
+/// assertion. i_exp is evaluated only in debug build\r
+#    define ASSERT(i_exp)              assert(i_exp)\r
+/// assertion, but i_exp is always evaluated\r
+#    define CHECK(i_cond, i_exp)       assert(i_cond (i_exp))\r
+/// identical to CHECK(!!, i_exp)\r
+#    define CHECK_TRUE(i_exp)          assert(!!(i_exp))\r
+/// identical to CHECK(!, i_exp)\r
+#    define CHECK_FALSE(i_exp)         assert(!(i_exp))\r
+#  endif // NDEBUG\r
+\r
+\r
+/// get number of array elements\r
+#  define NUMBER_OF(i_array) (sizeof(i_array) / sizeof((i_array)[0]))\r
+\r
+/// max path length\r
+#  define GANA_MAX_PATH                (MAX_PATH * 4)\r
+\r
+/// max length of global atom\r
+#  define GANA_MAX_ATOM_LENGTH 256\r
+\r
+#  undef MAX\r
+/// redefine MAX macro\r
+#  define MAX(a, b)    (((b) < (a)) ? (a) : (b))\r
+\r
+#  undef MIN\r
+/// redefine MIN macro\r
+#  define MIN(a, b)    (((a) < (b)) ? (a) : (b))\r
+\r
+\r
+#endif // !_MISC_H\r
index d720d32..6af8767 100644 (file)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// msgstream.h
-
-
-#ifndef _MSGSTREAM_H
-#  define _MSGSTREAM_H
-
-#  include "misc.h"
-#  include "stringtool.h"
-#  include "multithread.h"
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// msgstream
-
-/** msgstream.
-
-    <p>Before writing to omsgstream, you must acquire lock by calling
-    <code>acquire()</code>.  Then after completion of writing, you
-    must call <code>release()</code>.</p>
-    
-    <p>Omsgbuf calls <code>PostMessage(hwnd, messageid, 0,
-    (LPARAM)omsgbuf)</code> to notify that string is ready to get.
-    When the window (<code>hwnd</code>) get the message, you can get
-    the string containd in the omsgbuf by calling
-    <code>acquireString()</code>.  After calling
-    <code>acquireString()</code>, you must / call releaseString().</p>
-
-*/
-
-template<class T, size_t SIZE = 1024,
-  class TR = std::char_traits<T>, class A = std::allocator<T> >
-class basic_msgbuf : public std::basic_streambuf<T, TR>, public SyncObject
-{
-public:
-  typedef std::basic_string<T, TR, A> String;  /// 
-  typedef std::basic_streambuf<T, TR> Super;   ///
-  
-private:
-  HWND m_hwnd;                                 /** window handle for
-                                                   notification */
-  UINT m_messageId;                            /// messageid for notification
-  T *m_buf;                                    /// for streambuf
-  String m_str;                                        /// for notification
-  CriticalSection m_cs;                                /// lock
-  A m_allocator;                               /// allocator
-  
-  /** debug level.
-      if ( m_msgDebugLevel &lt;= m_debugLevel ), message is displayed
-  */
-  int m_debugLevel;
-  int m_msgDebugLevel;                         ///
-
-private:
-  basic_msgbuf(const basic_msgbuf &);          /// disable copy constructor
-
-public:
-  ///
-  basic_msgbuf(UINT i_messageId, HWND i_hwnd = 0)
-    : m_hwnd(i_hwnd),
-      m_messageId(i_messageId),
-      m_buf(m_allocator.allocate(SIZE, 0)),
-      m_debugLevel(0),
-      m_msgDebugLevel(0)
-  {
-    ASSERT(m_buf);
-    setp(m_buf, m_buf + SIZE);
-  }
-  
-  ///
-  ~basic_msgbuf()
-  {
-    sync();
-    m_allocator.deallocate(m_buf, SIZE);
-  }
-  
-  /// attach/detach a window
-  basic_msgbuf* attach(HWND i_hwnd)
-  {
-    Acquire a(&m_cs);
-    ASSERT( !m_hwnd && i_hwnd );
-    m_hwnd = i_hwnd;
-    if (!m_str.empty())
-      PostMessage(m_hwnd, m_messageId, 0, (LPARAM)this);
-    return this;
-  }
-  
-  ///
-  basic_msgbuf* detach()
-  {
-    Acquire a(&m_cs);
-    sync();
-    m_hwnd = 0;
-    return this;
-  }
-  
-  /// get window handle
-  HWND getHwnd() const { return m_hwnd; }
-  
-  /// is a window attached ?
-  int is_open() const { return !!m_hwnd; }
-  
-  /// acquire string and release the string
-  const String &acquireString()
-  {
-    m_cs.acquire();
-    return m_str;
-  }
-  
-  ///
-  void releaseString()
-  {
-    m_str.resize(0);
-    m_cs.release();
-  }
-
-  /// set debug level
-  void setDebugLevel(int i_debugLevel)
-  {
-    m_debugLevel = i_debugLevel;
-  }
-  
-  ///
-  int getDebugLevel() const { return m_debugLevel; }
-  
-  // for stream
-  typename Super::int_type overflow(typename Super::int_type i_c = TR::eof())
-  {
-    if (sync() == TR::eof()) // sync before new buffer created below
-      return TR::eof();
-    
-    if (i_c != TR::eof())
-    {
-      *pptr() = TR::to_char_type(i_c);
-      pbump(1);
-      sync();
-    }
-    return TR::not_eof(i_c); // return something other than EOF if successful
-  }
-  
-  // for stream
-  int sync()
-  {
-    T *begin = pbase();
-    T *end = pptr();
-    T *i;
-    for (i = begin; i < end; ++ i)
-      if (_istlead(*i))
-       ++ i;
-    if (i == end)
-    {
-      if (m_msgDebugLevel <= m_debugLevel)
-       m_str += String(begin, end - begin);
-      setp(m_buf, m_buf + SIZE);
-    }
-    else // end < i
-    {
-      if (m_msgDebugLevel <= m_debugLevel)
-       m_str += String(begin, end - begin - 1);
-      m_buf[0] = end[-1];
-      setp(m_buf, m_buf + SIZE);
-      pbump(1);
-    }
-    return TR::not_eof(0);
-  }
-
-  // sync object
-  
-  /// begin writing
-  virtual void acquire()
-  {
-    m_cs.acquire();
-  }
-
-  /// begin writing
-  virtual void acquire(int i_msgDebugLevel)
-  {
-    m_cs.acquire();
-    m_msgDebugLevel = i_msgDebugLevel;
-  }
-  
-  /// end writing
-  virtual void release()
-  {
-    if (!m_str.empty())
-      PostMessage(m_hwnd, m_messageId, 0, reinterpret_cast<LPARAM>(this));
-    m_msgDebugLevel = m_debugLevel;
-    m_cs.release();
-  }
-};
-
-
-///
-template<class T, size_t SIZE = 1024,
-  class TR = std::char_traits<T>, class A = std::allocator<T> >
-class basic_omsgstream : public std::basic_ostream<T, TR>, public SyncObject
-{
-public:
-  typedef std::basic_ostream<T, TR> Super;     /// 
-  typedef basic_msgbuf<T, SIZE, TR, A> StreamBuf; /// 
-  typedef std::basic_string<T, TR, A> String;  /// 
-  
-private:
-  StreamBuf m_streamBuf;                       /// 
-
-public:
-  ///
-  explicit basic_omsgstream(UINT i_messageId, HWND i_hwnd = 0)
-    : Super(&m_streamBuf), m_streamBuf(i_messageId, i_hwnd)
-  {
-  }
-  
-  ///
-  virtual ~basic_omsgstream()
-  {
-  }
-  
-  ///
-  StreamBuf *rdbuf() const
-  {
-    return const_cast<StreamBuf *>(&m_streamBuf);
-  }
-
-  /// attach a msg control
-  void attach(HWND i_hwnd)
-  {
-    m_streamBuf.attach(i_hwnd);
-  }
-
-  /// detach a msg control
-  void detach()
-  {
-    m_streamBuf.detach();
-  }
-
-  /// get window handle of the msg control
-  HWND getHwnd() const
-  {
-    return m_streamBuf.getHwnd();
-  }
-
-  /// is the msg control attached ?
-  int is_open() const
-  {
-    return m_streamBuf.is_open();
-  }
-
-  /// set debug level
-  void setDebugLevel(int i_debugLevel)
-  {
-    m_streamBuf.setDebugLevel(i_debugLevel);
-  }
-  
-  ///
-  int getDebugLevel() const
-  {
-    return m_streamBuf.getDebugLevel();
-  }
-
-  /// acquire string and release the string
-  const String &acquireString()
-  {
-    return m_streamBuf.acquireString();
-  }
-  
-  ///
-  void releaseString()
-  {
-    m_streamBuf->releaseString();
-  }
-
-  // sync object
-  
-  /// begin writing
-  virtual void acquire()
-  {
-    m_streamBuf.acquire();
-  }
-  
-  /// begin writing
-  virtual void acquire(int i_msgDebugLevel)
-  {
-    m_streamBuf.acquire(i_msgDebugLevel);
-  }
-  
-  /// end writing
-  virtual void release()
-  {
-    m_streamBuf.release();
-  }
-};
-
-///
-typedef basic_omsgstream<_TCHAR> tomsgstream;
-
-
-#endif // !_MSGSTREAM_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// msgstream.h\r
+\r
+\r
+#ifndef _MSGSTREAM_H\r
+#  define _MSGSTREAM_H\r
+\r
+#  include "misc.h"\r
+#  include "stringtool.h"\r
+#  include "multithread.h"\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// msgstream\r
+\r
+/** msgstream.\r
+\r
+    <p>Before writing to omsgstream, you must acquire lock by calling\r
+    <code>acquire()</code>.  Then after completion of writing, you\r
+    must call <code>release()</code>.</p>\r
+    \r
+    <p>Omsgbuf calls <code>PostMessage(hwnd, messageid, 0,\r
+    (LPARAM)omsgbuf)</code> to notify that string is ready to get.\r
+    When the window (<code>hwnd</code>) get the message, you can get\r
+    the string containd in the omsgbuf by calling\r
+    <code>acquireString()</code>.  After calling\r
+    <code>acquireString()</code>, you must / call releaseString().</p>\r
+\r
+*/\r
+\r
+template<class T, size_t SIZE = 1024,\r
+  class TR = std::char_traits<T>, class A = std::allocator<T> >\r
+class basic_msgbuf : public std::basic_streambuf<T, TR>, public SyncObject\r
+{\r
+public:\r
+  typedef std::basic_string<T, TR, A> String;  /// \r
+  typedef std::basic_streambuf<T, TR> Super;   ///\r
+  \r
+private:\r
+  HWND m_hwnd;                                 /** window handle for\r
+                                                   notification */\r
+  UINT m_messageId;                            /// messageid for notification\r
+  T *m_buf;                                    /// for streambuf\r
+  String m_str;                                        /// for notification\r
+  CriticalSection m_cs;                                /// lock\r
+  A m_allocator;                               /// allocator\r
+  \r
+  /** debug level.\r
+      if ( m_msgDebugLevel &lt;= m_debugLevel ), message is displayed\r
+  */\r
+  int m_debugLevel;\r
+  int m_msgDebugLevel;                         ///\r
+\r
+private:\r
+  basic_msgbuf(const basic_msgbuf &);          /// disable copy constructor\r
+\r
+public:\r
+  ///\r
+  basic_msgbuf(UINT i_messageId, HWND i_hwnd = 0)\r
+    : m_hwnd(i_hwnd),\r
+      m_messageId(i_messageId),\r
+      m_buf(m_allocator.allocate(SIZE, 0)),\r
+      m_debugLevel(0),\r
+      m_msgDebugLevel(0)\r
+  {\r
+    ASSERT(m_buf);\r
+    setp(m_buf, m_buf + SIZE);\r
+  }\r
+  \r
+  ///\r
+  ~basic_msgbuf()\r
+  {\r
+    sync();\r
+    m_allocator.deallocate(m_buf, SIZE);\r
+  }\r
+  \r
+  /// attach/detach a window\r
+  basic_msgbuf* attach(HWND i_hwnd)\r
+  {\r
+    Acquire a(&m_cs);\r
+    ASSERT( !m_hwnd && i_hwnd );\r
+    m_hwnd = i_hwnd;\r
+    if (!m_str.empty())\r
+      PostMessage(m_hwnd, m_messageId, 0, (LPARAM)this);\r
+    return this;\r
+  }\r
+  \r
+  ///\r
+  basic_msgbuf* detach()\r
+  {\r
+    Acquire a(&m_cs);\r
+    sync();\r
+    m_hwnd = 0;\r
+    return this;\r
+  }\r
+  \r
+  /// get window handle\r
+  HWND getHwnd() const { return m_hwnd; }\r
+  \r
+  /// is a window attached ?\r
+  int is_open() const { return !!m_hwnd; }\r
+  \r
+  /// acquire string and release the string\r
+  const String &acquireString()\r
+  {\r
+    m_cs.acquire();\r
+    return m_str;\r
+  }\r
+  \r
+  ///\r
+  void releaseString()\r
+  {\r
+    m_str.resize(0);\r
+    m_cs.release();\r
+  }\r
+\r
+  /// set debug level\r
+  void setDebugLevel(int i_debugLevel)\r
+  {\r
+    m_debugLevel = i_debugLevel;\r
+  }\r
+  \r
+  ///\r
+  int getDebugLevel() const { return m_debugLevel; }\r
+  \r
+  // for stream\r
+  typename Super::int_type overflow(typename Super::int_type i_c = TR::eof())\r
+  {\r
+    if (sync() == TR::eof()) // sync before new buffer created below\r
+      return TR::eof();\r
+    \r
+    if (i_c != TR::eof())\r
+    {\r
+      *pptr() = TR::to_char_type(i_c);\r
+      pbump(1);\r
+      sync();\r
+    }\r
+    return TR::not_eof(i_c); // return something other than EOF if successful\r
+  }\r
+  \r
+  // for stream\r
+  int sync()\r
+  {\r
+    T *begin = pbase();\r
+    T *end = pptr();\r
+    T *i;\r
+    for (i = begin; i < end; ++ i)\r
+      if (_istlead(*i))\r
+       ++ i;\r
+    if (i == end)\r
+    {\r
+      if (m_msgDebugLevel <= m_debugLevel)\r
+       m_str += String(begin, end - begin);\r
+      setp(m_buf, m_buf + SIZE);\r
+    }\r
+    else // end < i\r
+    {\r
+      if (m_msgDebugLevel <= m_debugLevel)\r
+       m_str += String(begin, end - begin - 1);\r
+      m_buf[0] = end[-1];\r
+      setp(m_buf, m_buf + SIZE);\r
+      pbump(1);\r
+    }\r
+    return TR::not_eof(0);\r
+  }\r
+\r
+  // sync object\r
+  \r
+  /// begin writing\r
+  virtual void acquire()\r
+  {\r
+    m_cs.acquire();\r
+  }\r
+\r
+  /// begin writing\r
+  virtual void acquire(int i_msgDebugLevel)\r
+  {\r
+    m_cs.acquire();\r
+    m_msgDebugLevel = i_msgDebugLevel;\r
+  }\r
+  \r
+  /// end writing\r
+  virtual void release()\r
+  {\r
+    if (!m_str.empty())\r
+      PostMessage(m_hwnd, m_messageId, 0, reinterpret_cast<LPARAM>(this));\r
+    m_msgDebugLevel = m_debugLevel;\r
+    m_cs.release();\r
+  }\r
+};\r
+\r
+\r
+///\r
+template<class T, size_t SIZE = 1024,\r
+  class TR = std::char_traits<T>, class A = std::allocator<T> >\r
+class basic_omsgstream : public std::basic_ostream<T, TR>, public SyncObject\r
+{\r
+public:\r
+  typedef std::basic_ostream<T, TR> Super;     /// \r
+  typedef basic_msgbuf<T, SIZE, TR, A> StreamBuf; /// \r
+  typedef std::basic_string<T, TR, A> String;  /// \r
+  \r
+private:\r
+  StreamBuf m_streamBuf;                       /// \r
+\r
+public:\r
+  ///\r
+  explicit basic_omsgstream(UINT i_messageId, HWND i_hwnd = 0)\r
+    : Super(&m_streamBuf), m_streamBuf(i_messageId, i_hwnd)\r
+  {\r
+  }\r
+  \r
+  ///\r
+  virtual ~basic_omsgstream()\r
+  {\r
+  }\r
+  \r
+  ///\r
+  StreamBuf *rdbuf() const\r
+  {\r
+    return const_cast<StreamBuf *>(&m_streamBuf);\r
+  }\r
+\r
+  /// attach a msg control\r
+  void attach(HWND i_hwnd)\r
+  {\r
+    m_streamBuf.attach(i_hwnd);\r
+  }\r
+\r
+  /// detach a msg control\r
+  void detach()\r
+  {\r
+    m_streamBuf.detach();\r
+  }\r
+\r
+  /// get window handle of the msg control\r
+  HWND getHwnd() const\r
+  {\r
+    return m_streamBuf.getHwnd();\r
+  }\r
+\r
+  /// is the msg control attached ?\r
+  int is_open() const\r
+  {\r
+    return m_streamBuf.is_open();\r
+  }\r
+\r
+  /// set debug level\r
+  void setDebugLevel(int i_debugLevel)\r
+  {\r
+    m_streamBuf.setDebugLevel(i_debugLevel);\r
+  }\r
+  \r
+  ///\r
+  int getDebugLevel() const\r
+  {\r
+    return m_streamBuf.getDebugLevel();\r
+  }\r
+\r
+  /// acquire string and release the string\r
+  const String &acquireString()\r
+  {\r
+    return m_streamBuf.acquireString();\r
+  }\r
+  \r
+  ///\r
+  void releaseString()\r
+  {\r
+    m_streamBuf->releaseString();\r
+  }\r
+\r
+  // sync object\r
+  \r
+  /// begin writing\r
+  virtual void acquire()\r
+  {\r
+    m_streamBuf.acquire();\r
+  }\r
+  \r
+  /// begin writing\r
+  virtual void acquire(int i_msgDebugLevel)\r
+  {\r
+    m_streamBuf.acquire(i_msgDebugLevel);\r
+  }\r
+  \r
+  /// end writing\r
+  virtual void release()\r
+  {\r
+    m_streamBuf.release();\r
+  }\r
+};\r
+\r
+///\r
+typedef basic_omsgstream<_TCHAR> tomsgstream;\r
+\r
+\r
+#endif // !_MSGSTREAM_H\r
index ffefe5d..ea315c7 100644 (file)
@@ -1,56 +1,56 @@
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// multithread.h
-
-
-#ifndef _MULTITHREAD_H
-#  define _MULTITHREAD_H
-
-#  include <windows.h>
-
-
-///
-class SyncObject
-{
-public:
-  ///
-  virtual void acquire() = 0;
-  ///
-  virtual void acquire(int ) { acquire(); }
-  ///
-  virtual void release() = 0;
-};
-
-
-///
-class CriticalSection : public SyncObject
-{
-  CRITICAL_SECTION m_cs;                       ///
-
-public:
-  ///
-  CriticalSection() { InitializeCriticalSection(&m_cs); }
-  ///
-  ~CriticalSection() { DeleteCriticalSection(&m_cs); }
-  ///
-  void acquire() { EnterCriticalSection(&m_cs); }
-  ///
-  void release() { LeaveCriticalSection(&m_cs); }
-};
-
-
-///
-class Acquire
-{
-  SyncObject *m_so;    ///
-  
-public:
-  ///
-  Acquire(SyncObject *i_so) : m_so(i_so) { m_so->acquire(); }
-  ///
-  Acquire(SyncObject *i_so, int i_n) : m_so(i_so) { m_so->acquire(i_n); }
-  ///
-  ~Acquire() { m_so->release(); }
-};
-
-
-#endif // !_MULTITHREAD_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// multithread.h\r
+\r
+\r
+#ifndef _MULTITHREAD_H\r
+#  define _MULTITHREAD_H\r
+\r
+#  include <windows.h>\r
+\r
+\r
+///\r
+class SyncObject\r
+{\r
+public:\r
+  ///\r
+  virtual void acquire() = 0;\r
+  ///\r
+  virtual void acquire(int ) { acquire(); }\r
+  ///\r
+  virtual void release() = 0;\r
+};\r
+\r
+\r
+///\r
+class CriticalSection : public SyncObject\r
+{\r
+  CRITICAL_SECTION m_cs;                       ///\r
+\r
+public:\r
+  ///\r
+  CriticalSection() { InitializeCriticalSection(&m_cs); }\r
+  ///\r
+  ~CriticalSection() { DeleteCriticalSection(&m_cs); }\r
+  ///\r
+  void acquire() { EnterCriticalSection(&m_cs); }\r
+  ///\r
+  void release() { LeaveCriticalSection(&m_cs); }\r
+};\r
+\r
+\r
+///\r
+class Acquire\r
+{\r
+  SyncObject *m_so;    ///\r
+  \r
+public:\r
+  ///\r
+  Acquire(SyncObject *i_so) : m_so(i_so) { m_so->acquire(); }\r
+  ///\r
+  Acquire(SyncObject *i_so, int i_n) : m_so(i_so) { m_so->acquire(i_n); }\r
+  ///\r
+  ~Acquire() { m_so->release(); }\r
+};\r
+\r
+\r
+#endif // !_MULTITHREAD_H\r
index f9fa927..3f129aa 100644 (file)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// parser.cpp
-
-
-#include "misc.h"
-
-#include "errormessage.h"
-#include "parser.h"
-#include <cassert>
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Token
-
-
-Token::Token(const Token &i_token)
-  : m_type(i_token.m_type),
-    m_isValueQuoted(i_token.m_isValueQuoted),
-    m_numericValue(i_token.m_numericValue),
-    m_stringValue(i_token.m_stringValue),
-    m_data(i_token.m_data)
-{
-}
-
-Token::Token(int i_value, const tstringi &i_display)
-  : m_type(Type_number),
-    m_isValueQuoted(false),
-    m_numericValue(i_value),
-    m_stringValue(i_display),
-    m_data(NULL)
-{
-}
-
-Token::Token(const tstringi &i_value, bool i_isValueQuoted, bool i_isRegexp)
-  : m_type(i_isRegexp ? Type_regexp : Type_string),
-    m_isValueQuoted(i_isValueQuoted),
-    m_numericValue(0),
-    m_stringValue(i_value),
-    m_data(NULL)
-{
-}
-
-Token::Token(Type i_m_type)
-  : m_type(i_m_type),
-    m_isValueQuoted(false),
-    m_numericValue(0),
-    m_stringValue(_T("")),
-    m_data(NULL)
-{
-  ASSERT(m_type == Type_openParen || m_type == Type_closeParen ||
-        m_type == Type_comma);
-}
-
-// get numeric value
-int Token::getNumber() const
-{
-  if (m_type == Type_number)
-    return m_numericValue;
-  if (m_stringValue.empty())
-    return 0;
-  else
-    throw ErrorMessage() << _T("`") << *this << _T("' is not a Type_number.");
-}
-
-// get string value
-tstringi Token::getString() const
-{
-  if (m_type == Type_string)
-    return m_stringValue;
-  throw ErrorMessage() << _T("`") << *this << _T("' is not a string.");
-}
-
-// get regexp value
-tstringi Token::getRegexp() const
-{
-  if (m_type == Type_regexp)
-    return m_stringValue;
-  throw ErrorMessage() << _T("`") << *this << _T("' is not a regexp.");
-}
-
-// case insensitive equal
-bool Token::operator==(const _TCHAR *i_str) const
-{
-  if (m_type == Type_string)
-    return m_stringValue == i_str;
-  return false;
-}
-
-// paren equal
-bool Token::operator==(const _TCHAR i_c) const
-{
-  if (i_c == _T('(')) return m_type == Type_openParen;
-  if (i_c == _T(')')) return m_type == Type_openParen;
-  return false;
-}
-
-// add string
-void Token::add(const tstringi &i_str)
-{
-  m_stringValue += i_str;
-}
-
-// stream output
-tostream &operator<<(tostream &i_ost, const Token &i_token)
-{
-  switch (i_token.m_type)
-  {
-    case Token::Type_string: i_ost << i_token.m_stringValue; break;
-    case Token::Type_number: i_ost << i_token.m_stringValue; break;
-    case Token::Type_regexp: i_ost << i_token.m_stringValue; break;
-    case Token::Type_openParen: i_ost << _T("("); break;
-    case Token::Type_closeParen: i_ost << _T(")"); break;
-    case Token::Type_comma: i_ost << _T(", "); break;
-  }
-  return i_ost;
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Parser
-
-
-Parser::Parser(const _TCHAR *i_str, size_t i_length)
-  : m_lineNumber(1),
-    m_prefixes(NULL),
-    m_internalLineNumber(1),
-    m_ptr(i_str),
-    m_end(i_str + i_length)
-{
-}
-
-// set string that may be prefix of a token.
-// prefix_ is not copied, so it must be preserved after setPrefix()
-void Parser::setPrefixes(const Prefixes *i_prefixes)
-{
-  m_prefixes = i_prefixes;
-}
-
-// get a line
-bool Parser::getLine(tstringi *o_line)
-{
-  o_line->resize(0);
-
-  if (m_ptr == m_end)
-    return false;
-  
-  const _TCHAR *begin = m_ptr;
-  const _TCHAR *end = m_end;
-  
-  // lines are separated by: "\r\n", "\n", "\x2028" (Unicode Line Separator)
-  while (m_ptr != m_end)
-    switch (*m_ptr)
-    {
-      case _T('\n'):
-#ifdef UNICODE
-      case 0x2028:
-       //case _T('\x2028'):    //  (U+2028)
-#endif
-       end = m_ptr;
-       ++ m_ptr;
-       goto got_line_end;
-      case _T('\r'):
-       if (m_ptr + 1 != m_end && m_ptr[1] == _T('\n'))
-       {
-         end = m_ptr;
-         m_ptr += 2;
-         goto got_line_end;
-       }
-       // fall through
-      default:
-       ++ m_ptr;
-       break;
-    }
-  got_line_end:
-  ++ m_internalLineNumber;
-  // o_line->assign(begin, end);               // why bcc cannot link this ?
-  o_line->assign(begin, end - begin);          // workarond for bcc
-  return true;
-}
-
-// symbol test
-static bool isSymbolChar(_TCHAR i_c)
-{
-  if (i_c == _T('\0'))
-    return false;
-  if (_istlead(i_c) ||
-      _istalpha(i_c) ||
-      _istdigit(i_c) ||
-      _istlead(i_c))
-    return true;
-
-#ifdef UNICODE
-  if (0x80 <= i_c && _istgraph(i_c))
-    return true;
-#endif // UNICODE
-
-  if (_istpunct(i_c))
-    return !!_tcschr(_T("-+/?_\\"), i_c);
-
-#ifdef UNICODE
-  // check arrows
-  if (_tcschr(_T("\x2190\x2191\x2192\x2193"), i_c)) {
-    return true;
-  }
-#endif // UNICODE
-  return _istgraph(i_c);
-}
-
-
-// get a parsed line.
-// if no more lines exist, returns false
-bool Parser::getLine(std::vector<Token> *o_tokens)
-{
-  o_tokens->clear();
-  m_lineNumber = m_internalLineNumber;
-
-  tstringi line;
-  bool isTokenExist = false;
-  continue_getLineLoop:
-  while (getLine(&line))
-  {
-    const _TCHAR *t = line.c_str();
-
-    continue_getTokenLoop:
-    while (true)
-    {
-      // skip white space
-      while (*t != _T('\0') && _istspace(*t))
-       t ++;
-      if (*t == _T('\0') || *t == _T('#'))
-       goto break_getTokenLoop; // no more tokens exist
-      if (*t == _T('\\') && *(t + 1) == _T('\0'))
-       goto continue_getLineLoop; // continue to next line
-      
-      const _TCHAR *tokenStart = t;
-      
-      // comma or empty token
-      if (*t == _T(','))
-      {
-       if (!isTokenExist)
-         o_tokens->push_back(Token(_T(""), false));
-       isTokenExist = false;
-       o_tokens->push_back(Token(Token::Type_comma));
-       t ++;
-       goto continue_getTokenLoop;
-      }
-
-      // paren
-      if (*t == _T('('))
-      {
-       o_tokens->push_back(Token(Token::Type_openParen));
-       isTokenExist = false;
-       t ++;
-       goto continue_getTokenLoop;
-      }
-      if (*t == _T(')'))
-      {
-       if (!isTokenExist)
-         o_tokens->push_back(Token(_T(""), false));
-       isTokenExist = true;
-       o_tokens->push_back(Token(Token::Type_closeParen));
-       t ++;
-       goto continue_getTokenLoop;
-      }
-
-      isTokenExist = true;
-      
-      // prefix
-      if (m_prefixes)
-       for (size_t i = 0; i < m_prefixes->size(); i ++)
-         if (_tcsnicmp(tokenStart, m_prefixes->at(i).c_str(),
-                       m_prefixes->at(i).size()) == 0)
-         {
-           o_tokens->push_back(Token(m_prefixes->at(i), false));
-           t += m_prefixes->at(i).size();
-           goto continue_getTokenLoop;
-         }
-
-      // quoted or regexp
-      if (*t == _T('"') || *t == _T('\'') ||
-         *t == _T('/') || (*t == _T('\\') && *(t + 1) == _T('m') &&
-                           *(t + 2) != _T('\0')))
-      {
-       bool isRegexp = !(*t == _T('"') || *t == _T('\''));
-       _TCHAR q[2] = { *t++, _T('\0') }; // quote character
-       if (q[0] == _T('\\'))
-       {
-         t++;
-         q[0] = *t++;
-       }
-       tokenStart = t;
-       
-       while (*t != _T('\0') && *t != q[0])
-       {
-         if (*t == _T('\\') && *(t + 1))
-           t ++;
-         if (_istlead(*t) && *(t + 1))
-           t ++;
-         t ++;
-       }
-       
-       tstring str =
-         interpretMetaCharacters(tokenStart, t - tokenStart, q, isRegexp);
-#ifdef _MBCS
-       if (isRegexp)
-         str = guardRegexpFromMbcs(str.c_str());
-#endif
-       // concatinate continuous string
-       if (!isRegexp &&
-           0 < o_tokens->size() && o_tokens->back().isString() &&
-           o_tokens->back().isQuoted())
-         o_tokens->back().add(str);
-       else
-         o_tokens->push_back(Token(str, true, isRegexp));
-       if (*t != _T('\0'))
-         t ++;
-       goto continue_getTokenLoop;
-      }
-
-      // not quoted
-      {
-       while (isSymbolChar(*t))
-       {
-         if (*t == _T('\\'))
-           if (*(t + 1))
-             t ++;
-           else
-             break;
-         if (_istlead(*t) && *(t + 1))
-           t ++;
-         t ++;
-       }
-       if (t == tokenStart)
-       {
-         ErrorMessage e;
-         e << _T("invalid character ");
-#ifdef UNICODE
-         e << _T("U+");
-         e << std::hex; // << std::setw(4) << std::setfill(_T('0'));
-         e << (int)(wchar_t)*t;
-#else
-         e << _T("\\x");
-         e << std::hex; // << std::setw(2) << std::setfill(_T('0'));
-         e << (int)(u_char)*t;
-#endif
-         e << std::dec;
-         if (_istprint(*t))
-           e << _T("(") << *t << _T(")");
-         throw e;
-       }
-       
-       _TCHAR *numEnd = NULL;
-       long value = _tcstol(tokenStart, &numEnd, 0);
-       if (tokenStart == numEnd)
-       {
-         tstring str = interpretMetaCharacters(tokenStart, t - tokenStart);
-         o_tokens->push_back(Token(str, false));
-       }
-       else
-       {
-         o_tokens->push_back(
-           Token(value, tstringi(tokenStart, numEnd - tokenStart)));
-         t = numEnd;
-       }
-       goto continue_getTokenLoop;
-      }
-    }
-    break_getTokenLoop:
-    if (0 < o_tokens->size())
-      break;
-    m_lineNumber = m_internalLineNumber;
-    isTokenExist = false;
-  }
-  
-  return 0 < o_tokens->size();
-}
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// parser.cpp\r
+\r
+\r
+#include "misc.h"\r
+\r
+#include "errormessage.h"\r
+#include "parser.h"\r
+#include <cassert>\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Token\r
+\r
+\r
+Token::Token(const Token &i_token)\r
+  : m_type(i_token.m_type),\r
+    m_isValueQuoted(i_token.m_isValueQuoted),\r
+    m_numericValue(i_token.m_numericValue),\r
+    m_stringValue(i_token.m_stringValue),\r
+    m_data(i_token.m_data)\r
+{\r
+}\r
+\r
+Token::Token(int i_value, const tstringi &i_display)\r
+  : m_type(Type_number),\r
+    m_isValueQuoted(false),\r
+    m_numericValue(i_value),\r
+    m_stringValue(i_display),\r
+    m_data(NULL)\r
+{\r
+}\r
+\r
+Token::Token(const tstringi &i_value, bool i_isValueQuoted, bool i_isRegexp)\r
+  : m_type(i_isRegexp ? Type_regexp : Type_string),\r
+    m_isValueQuoted(i_isValueQuoted),\r
+    m_numericValue(0),\r
+    m_stringValue(i_value),\r
+    m_data(NULL)\r
+{\r
+}\r
+\r
+Token::Token(Type i_m_type)\r
+  : m_type(i_m_type),\r
+    m_isValueQuoted(false),\r
+    m_numericValue(0),\r
+    m_stringValue(_T("")),\r
+    m_data(NULL)\r
+{\r
+  ASSERT(m_type == Type_openParen || m_type == Type_closeParen ||\r
+        m_type == Type_comma);\r
+}\r
+\r
+// get numeric value\r
+int Token::getNumber() const\r
+{\r
+  if (m_type == Type_number)\r
+    return m_numericValue;\r
+  if (m_stringValue.empty())\r
+    return 0;\r
+  else\r
+    throw ErrorMessage() << _T("`") << *this << _T("' is not a Type_number.");\r
+}\r
+\r
+// get string value\r
+tstringi Token::getString() const\r
+{\r
+  if (m_type == Type_string)\r
+    return m_stringValue;\r
+  throw ErrorMessage() << _T("`") << *this << _T("' is not a string.");\r
+}\r
+\r
+// get regexp value\r
+tstringi Token::getRegexp() const\r
+{\r
+  if (m_type == Type_regexp)\r
+    return m_stringValue;\r
+  throw ErrorMessage() << _T("`") << *this << _T("' is not a regexp.");\r
+}\r
+\r
+// case insensitive equal\r
+bool Token::operator==(const _TCHAR *i_str) const\r
+{\r
+  if (m_type == Type_string)\r
+    return m_stringValue == i_str;\r
+  return false;\r
+}\r
+\r
+// paren equal\r
+bool Token::operator==(const _TCHAR i_c) const\r
+{\r
+  if (i_c == _T('(')) return m_type == Type_openParen;\r
+  if (i_c == _T(')')) return m_type == Type_openParen;\r
+  return false;\r
+}\r
+\r
+// add string\r
+void Token::add(const tstringi &i_str)\r
+{\r
+  m_stringValue += i_str;\r
+}\r
+\r
+// stream output\r
+tostream &operator<<(tostream &i_ost, const Token &i_token)\r
+{\r
+  switch (i_token.m_type)\r
+  {\r
+    case Token::Type_string: i_ost << i_token.m_stringValue; break;\r
+    case Token::Type_number: i_ost << i_token.m_stringValue; break;\r
+    case Token::Type_regexp: i_ost << i_token.m_stringValue; break;\r
+    case Token::Type_openParen: i_ost << _T("("); break;\r
+    case Token::Type_closeParen: i_ost << _T(")"); break;\r
+    case Token::Type_comma: i_ost << _T(", "); break;\r
+  }\r
+  return i_ost;\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Parser\r
+\r
+\r
+Parser::Parser(const _TCHAR *i_str, size_t i_length)\r
+  : m_lineNumber(1),\r
+    m_prefixes(NULL),\r
+    m_internalLineNumber(1),\r
+    m_ptr(i_str),\r
+    m_end(i_str + i_length)\r
+{\r
+}\r
+\r
+// set string that may be prefix of a token.\r
+// prefix_ is not copied, so it must be preserved after setPrefix()\r
+void Parser::setPrefixes(const Prefixes *i_prefixes)\r
+{\r
+  m_prefixes = i_prefixes;\r
+}\r
+\r
+// get a line\r
+bool Parser::getLine(tstringi *o_line)\r
+{\r
+  o_line->resize(0);\r
+\r
+  if (m_ptr == m_end)\r
+    return false;\r
+  \r
+  const _TCHAR *begin = m_ptr;\r
+  const _TCHAR *end = m_end;\r
+  \r
+  // lines are separated by: "\r\n", "\n", "\x2028" (Unicode Line Separator)\r
+  while (m_ptr != m_end)\r
+    switch (*m_ptr)\r
+    {\r
+      case _T('\n'):\r
+#ifdef UNICODE\r
+      case 0x2028:\r
+       //case _T('\x2028'):    //  (U+2028)\r
+#endif\r
+       end = m_ptr;\r
+       ++ m_ptr;\r
+       goto got_line_end;\r
+      case _T('\r'):\r
+       if (m_ptr + 1 != m_end && m_ptr[1] == _T('\n'))\r
+       {\r
+         end = m_ptr;\r
+         m_ptr += 2;\r
+         goto got_line_end;\r
+       }\r
+       // fall through\r
+      default:\r
+       ++ m_ptr;\r
+       break;\r
+    }\r
+  got_line_end:\r
+  ++ m_internalLineNumber;\r
+  // o_line->assign(begin, end);               // why bcc cannot link this ?\r
+  o_line->assign(begin, end - begin);          // workarond for bcc\r
+  return true;\r
+}\r
+\r
+// symbol test\r
+static bool isSymbolChar(_TCHAR i_c)\r
+{\r
+  if (i_c == _T('\0'))\r
+    return false;\r
+  if (_istlead(i_c) ||\r
+      _istalpha(i_c) ||\r
+      _istdigit(i_c) ||\r
+      _istlead(i_c))\r
+    return true;\r
+\r
+#ifdef UNICODE\r
+  if (0x80 <= i_c && _istgraph(i_c))\r
+    return true;\r
+#endif // UNICODE\r
+\r
+  if (_istpunct(i_c))\r
+    return !!_tcschr(_T("-+/?_\\"), i_c);\r
+\r
+#ifdef UNICODE\r
+  // check arrows\r
+  if (_tcschr(_T("\x2190\x2191\x2192\x2193"), i_c)) {\r
+    return true;\r
+  }\r
+#endif // UNICODE\r
+  return _istgraph(i_c);\r
+}\r
+\r
+\r
+// get a parsed line.\r
+// if no more lines exist, returns false\r
+bool Parser::getLine(std::vector<Token> *o_tokens)\r
+{\r
+  o_tokens->clear();\r
+  m_lineNumber = m_internalLineNumber;\r
+\r
+  tstringi line;\r
+  bool isTokenExist = false;\r
+  continue_getLineLoop:\r
+  while (getLine(&line))\r
+  {\r
+    const _TCHAR *t = line.c_str();\r
+\r
+    continue_getTokenLoop:\r
+    while (true)\r
+    {\r
+      // skip white space\r
+      while (*t != _T('\0') && _istspace(*t))\r
+       t ++;\r
+      if (*t == _T('\0') || *t == _T('#'))\r
+       goto break_getTokenLoop; // no more tokens exist\r
+      if (*t == _T('\\') && *(t + 1) == _T('\0'))\r
+       goto continue_getLineLoop; // continue to next line\r
+      \r
+      const _TCHAR *tokenStart = t;\r
+      \r
+      // comma or empty token\r
+      if (*t == _T(','))\r
+      {\r
+       if (!isTokenExist)\r
+         o_tokens->push_back(Token(_T(""), false));\r
+       isTokenExist = false;\r
+       o_tokens->push_back(Token(Token::Type_comma));\r
+       t ++;\r
+       goto continue_getTokenLoop;\r
+      }\r
+\r
+      // paren\r
+      if (*t == _T('('))\r
+      {\r
+       o_tokens->push_back(Token(Token::Type_openParen));\r
+       isTokenExist = false;\r
+       t ++;\r
+       goto continue_getTokenLoop;\r
+      }\r
+      if (*t == _T(')'))\r
+      {\r
+       if (!isTokenExist)\r
+         o_tokens->push_back(Token(_T(""), false));\r
+       isTokenExist = true;\r
+       o_tokens->push_back(Token(Token::Type_closeParen));\r
+       t ++;\r
+       goto continue_getTokenLoop;\r
+      }\r
+\r
+      isTokenExist = true;\r
+      \r
+      // prefix\r
+      if (m_prefixes)\r
+       for (size_t i = 0; i < m_prefixes->size(); i ++)\r
+         if (_tcsnicmp(tokenStart, m_prefixes->at(i).c_str(),\r
+                       m_prefixes->at(i).size()) == 0)\r
+         {\r
+           o_tokens->push_back(Token(m_prefixes->at(i), false));\r
+           t += m_prefixes->at(i).size();\r
+           goto continue_getTokenLoop;\r
+         }\r
+\r
+      // quoted or regexp\r
+      if (*t == _T('"') || *t == _T('\'') ||\r
+         *t == _T('/') || (*t == _T('\\') && *(t + 1) == _T('m') &&\r
+                           *(t + 2) != _T('\0')))\r
+      {\r
+       bool isRegexp = !(*t == _T('"') || *t == _T('\''));\r
+       _TCHAR q[2] = { *t++, _T('\0') }; // quote character\r
+       if (q[0] == _T('\\'))\r
+       {\r
+         t++;\r
+         q[0] = *t++;\r
+       }\r
+       tokenStart = t;\r
+       \r
+       while (*t != _T('\0') && *t != q[0])\r
+       {\r
+         if (*t == _T('\\') && *(t + 1))\r
+           t ++;\r
+         if (_istlead(*t) && *(t + 1))\r
+           t ++;\r
+         t ++;\r
+       }\r
+       \r
+       tstring str =\r
+         interpretMetaCharacters(tokenStart, t - tokenStart, q, isRegexp);\r
+#ifdef _MBCS\r
+       if (isRegexp)\r
+         str = guardRegexpFromMbcs(str.c_str());\r
+#endif\r
+       // concatinate continuous string\r
+       if (!isRegexp &&\r
+           0 < o_tokens->size() && o_tokens->back().isString() &&\r
+           o_tokens->back().isQuoted())\r
+         o_tokens->back().add(str);\r
+       else\r
+         o_tokens->push_back(Token(str, true, isRegexp));\r
+       if (*t != _T('\0'))\r
+         t ++;\r
+       goto continue_getTokenLoop;\r
+      }\r
+\r
+      // not quoted\r
+      {\r
+       while (isSymbolChar(*t))\r
+       {\r
+         if (*t == _T('\\'))\r
+           if (*(t + 1))\r
+             t ++;\r
+           else\r
+             break;\r
+         if (_istlead(*t) && *(t + 1))\r
+           t ++;\r
+         t ++;\r
+       }\r
+       if (t == tokenStart)\r
+       {\r
+         ErrorMessage e;\r
+         e << _T("invalid character ");\r
+#ifdef UNICODE\r
+         e << _T("U+");\r
+         e << std::hex; // << std::setw(4) << std::setfill(_T('0'));\r
+         e << (int)(wchar_t)*t;\r
+#else\r
+         e << _T("\\x");\r
+         e << std::hex; // << std::setw(2) << std::setfill(_T('0'));\r
+         e << (int)(u_char)*t;\r
+#endif\r
+         e << std::dec;\r
+         if (_istprint(*t))\r
+           e << _T("(") << *t << _T(")");\r
+         throw e;\r
+       }\r
+       \r
+       _TCHAR *numEnd = NULL;\r
+       long value = _tcstol(tokenStart, &numEnd, 0);\r
+       if (tokenStart == numEnd)\r
+       {\r
+         tstring str = interpretMetaCharacters(tokenStart, t - tokenStart);\r
+         o_tokens->push_back(Token(str, false));\r
+       }\r
+       else\r
+       {\r
+         o_tokens->push_back(\r
+           Token(value, tstringi(tokenStart, numEnd - tokenStart)));\r
+         t = numEnd;\r
+       }\r
+       goto continue_getTokenLoop;\r
+      }\r
+    }\r
+    break_getTokenLoop:\r
+    if (0 < o_tokens->size())\r
+      break;\r
+    m_lineNumber = m_internalLineNumber;\r
+    isTokenExist = false;\r
+  }\r
+  \r
+  return 0 < o_tokens->size();\r
+}\r
index a662867..b71eabd 100644 (file)
--- a/parser.h
+++ b/parser.h
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// parser.h
-
-
-#ifndef _PARSER_H
-#  define _PARSER_H
-
-#  include "misc.h"
-#  include "stringtool.h"
-#  include <vector>
-
-
-///
-class Token
-{
-public:
-  ///
-  enum Type
-  {
-    Type_string,                               ///
-    Type_number,                               ///
-    Type_regexp,                               ///
-    Type_openParen,                            ///
-    Type_closeParen,                           ///
-    Type_comma,                                        ///
-  };
-  
-private:
-  u_char m_type;                               ///
-  bool m_isValueQuoted;                                ///
-  int m_numericValue;                          ///
-  tstringi m_stringValue;                      ///
-  long m_data;                                 ///
-  
-public:
-  ///
-  Token(const Token &i_token);
-  ///
-  Token(int i_value, const tstringi &i_display);
-  ///
-  Token(const tstringi &i_value, bool i_isValueQuoted,
-       bool i_isRegexp = false);
-  ///
-  Token(Type i_type);
-  
-  /// is the value quoted ?
-  bool isQuoted() const { return m_isValueQuoted; }
-
-  /// value type
-  Type getType() const { return static_cast<Type>(m_type); }
-  ///
-  bool isString() const { return m_type == Type_string; }
-  ///
-  bool isNumber() const { return m_type == Type_number; }
-  ///
-  bool isRegexp() const { return m_type == Type_regexp; }
-  ///
-  bool isOpenParen() const { return m_type == Type_openParen; }
-  ///
-  bool isCloseParen() const { return m_type == Type_closeParen; }
-  ///
-  bool isComma() const { return m_type == Type_comma; }
-  
-  /// get numeric value
-  int getNumber() const;
-  
-  /// get string value
-  tstringi getString() const;
-  
-  /// get regexp value
-  tstringi getRegexp() const;
-
-  /// get data
-  long getData() const { return m_data; }
-  ///
-  void setData(long i_data) { m_data = i_data; }
-  
-  /// case insensitive equal
-  bool operator==(const tstringi &i_str) const
-  { return *this == i_str.c_str(); }
-  ///
-  bool operator==(const _TCHAR *i_str) const;
-  ///
-  bool operator!=(const tstringi &i_str) const
-  { return *this != i_str.c_str(); }
-  ///
-  bool operator!=(const _TCHAR *i_str) const { return !(*this == i_str); }
-  
-  /** paren equal
-      @param i_c '<code>(</code>' or '<code>)</code>' */
-  bool operator==(const _TCHAR i_c) const;
-  /** paren equal
-      @param i_c '<code>(</code>' or '<code>)</code>' */
-  bool operator!=(const _TCHAR i_c) const { return !(*this == i_c); }
-
-  /// add string
-  void add(const tstringi &i_str);
-
-  /// stream output
-  friend tostream &operator<<(tostream &i_ost, const Token &i_token);
-};
-
-
-///
-class Parser
-{
-public:
-  ///
-  typedef std::vector<Token> Tokens;
-  
-private:
-  ///
-  typedef std::vector<tstringi> Prefixes;
-  
-private:
-  size_t m_lineNumber;                         /// current line number
-  const Prefixes *m_prefixes;                  /** string that may be prefix
-                                                    of a token */
-  
-  size_t m_internalLineNumber;                 /// next line number
-  const _TCHAR *m_ptr;                         /// read pointer
-  const _TCHAR *m_end;                         /// end pointer
-
-private:
-  /// get a line
-  bool getLine(tstringi *o_line);
-  
-public:
-  ///
-  Parser(const _TCHAR *i_str, size_t i_length);
-
-  /** get a parsed line.  if no more lines exist, returns false */
-  bool getLine(Tokens *o_tokens);
-  
-  /// get current line number
-  size_t getLineNumber() const { return m_lineNumber; }
-  
-  /** set string that may be prefix of a token.  prefix_ is not
-      copied, so it must be preserved after setPrefix() */
-  void setPrefixes(const Prefixes *m_prefixes);
-};
-
-
-#endif // !_PARSER_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// parser.h\r
+\r
+\r
+#ifndef _PARSER_H\r
+#  define _PARSER_H\r
+\r
+#  include "misc.h"\r
+#  include "stringtool.h"\r
+#  include <vector>\r
+\r
+\r
+///\r
+class Token\r
+{\r
+public:\r
+  ///\r
+  enum Type\r
+  {\r
+    Type_string,                               ///\r
+    Type_number,                               ///\r
+    Type_regexp,                               ///\r
+    Type_openParen,                            ///\r
+    Type_closeParen,                           ///\r
+    Type_comma,                                        ///\r
+  };\r
+  \r
+private:\r
+  u_char m_type;                               ///\r
+  bool m_isValueQuoted;                                ///\r
+  int m_numericValue;                          ///\r
+  tstringi m_stringValue;                      ///\r
+  long m_data;                                 ///\r
+  \r
+public:\r
+  ///\r
+  Token(const Token &i_token);\r
+  ///\r
+  Token(int i_value, const tstringi &i_display);\r
+  ///\r
+  Token(const tstringi &i_value, bool i_isValueQuoted,\r
+       bool i_isRegexp = false);\r
+  ///\r
+  Token(Type i_type);\r
+  \r
+  /// is the value quoted ?\r
+  bool isQuoted() const { return m_isValueQuoted; }\r
+\r
+  /// value type\r
+  Type getType() const { return static_cast<Type>(m_type); }\r
+  ///\r
+  bool isString() const { return m_type == Type_string; }\r
+  ///\r
+  bool isNumber() const { return m_type == Type_number; }\r
+  ///\r
+  bool isRegexp() const { return m_type == Type_regexp; }\r
+  ///\r
+  bool isOpenParen() const { return m_type == Type_openParen; }\r
+  ///\r
+  bool isCloseParen() const { return m_type == Type_closeParen; }\r
+  ///\r
+  bool isComma() const { return m_type == Type_comma; }\r
+  \r
+  /// get numeric value\r
+  int getNumber() const;\r
+  \r
+  /// get string value\r
+  tstringi getString() const;\r
+  \r
+  /// get regexp value\r
+  tstringi getRegexp() const;\r
+\r
+  /// get data\r
+  long getData() const { return m_data; }\r
+  ///\r
+  void setData(long i_data) { m_data = i_data; }\r
+  \r
+  /// case insensitive equal\r
+  bool operator==(const tstringi &i_str) const\r
+  { return *this == i_str.c_str(); }\r
+  ///\r
+  bool operator==(const _TCHAR *i_str) const;\r
+  ///\r
+  bool operator!=(const tstringi &i_str) const\r
+  { return *this != i_str.c_str(); }\r
+  ///\r
+  bool operator!=(const _TCHAR *i_str) const { return !(*this == i_str); }\r
+  \r
+  /** paren equal\r
+      @param i_c '<code>(</code>' or '<code>)</code>' */\r
+  bool operator==(const _TCHAR i_c) const;\r
+  /** paren equal\r
+      @param i_c '<code>(</code>' or '<code>)</code>' */\r
+  bool operator!=(const _TCHAR i_c) const { return !(*this == i_c); }\r
+\r
+  /// add string\r
+  void add(const tstringi &i_str);\r
+\r
+  /// stream output\r
+  friend tostream &operator<<(tostream &i_ost, const Token &i_token);\r
+};\r
+\r
+\r
+///\r
+class Parser\r
+{\r
+public:\r
+  ///\r
+  typedef std::vector<Token> Tokens;\r
+  \r
+private:\r
+  ///\r
+  typedef std::vector<tstringi> Prefixes;\r
+  \r
+private:\r
+  size_t m_lineNumber;                         /// current line number\r
+  const Prefixes *m_prefixes;                  /** string that may be prefix\r
+                                                    of a token */\r
+  \r
+  size_t m_internalLineNumber;                 /// next line number\r
+  const _TCHAR *m_ptr;                         /// read pointer\r
+  const _TCHAR *m_end;                         /// end pointer\r
+\r
+private:\r
+  /// get a line\r
+  bool getLine(tstringi *o_line);\r
+  \r
+public:\r
+  ///\r
+  Parser(const _TCHAR *i_str, size_t i_length);\r
+\r
+  /** get a parsed line.  if no more lines exist, returns false */\r
+  bool getLine(Tokens *o_tokens);\r
+  \r
+  /// get current line number\r
+  size_t getLineNumber() const { return m_lineNumber; }\r
+  \r
+  /** set string that may be prefix of a token.  prefix_ is not\r
+      copied, so it must be preserved after setPrefix() */\r
+  void setPrefixes(const Prefixes *m_prefixes);\r
+};\r
+\r
+\r
+#endif // !_PARSER_H\r
index e7a38fc..70e2a7a 100644 (file)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// registry.cpp
-
-
-#include "registry.h"
-#include "stringtool.h"
-#include "array.h"
-#include <malloc.h>
-
-
-// remove
-bool Registry::remove(HKEY i_root, const tstring &i_path,
-                     const tstring &i_name)
-{
-#ifdef USE_INI
-  return false;
-  if (i_name.empty())
-    return false;
-  return WritePrivateProfileString(_T("yamy"), i_name.c_str(), NULL, i_path.c_str()) == TRUE;
-#else // !USE_INI
-  if (i_name.empty())
-    return RegDeleteKey(i_root, i_path.c_str()) == ERROR_SUCCESS;
-  HKEY hkey;
-  if (ERROR_SUCCESS !=
-      RegOpenKeyEx(i_root, i_path.c_str(), 0, KEY_SET_VALUE, &hkey))
-    return false;
-  LONG r = RegDeleteValue(hkey, i_name.c_str());
-  RegCloseKey(hkey);
-  return r == ERROR_SUCCESS;
-#endif // !USE_INI
-}
-
-
-// does exist the key ?
-bool Registry::doesExist(HKEY i_root, const tstring &i_path)
-{
-#ifdef USE_INI
-  return true;
-#else // !USE_INI
-  HKEY hkey;
-  if (ERROR_SUCCESS !=
-      RegOpenKeyEx(i_root, i_path.c_str(), 0, KEY_READ, &hkey))
-    return false;
-  RegCloseKey(hkey);
-  return true;
-#endif // !USE_INI
-}
-
-
-// read DWORD
-bool Registry::read(HKEY i_root, const tstring &i_path,
-                   const tstring &i_name, int *o_value, int i_defaultValue)
-{
-#ifdef USE_INI
-  *o_value =
-    GetPrivateProfileInt(_T("yamy"), i_name.c_str(), i_defaultValue, i_path.c_str());
-  return true;
-#else // !USE_INI
-  HKEY hkey;
-  if (ERROR_SUCCESS ==
-      RegOpenKeyEx(i_root, i_path.c_str(), 0, KEY_READ, &hkey))
-  {
-    DWORD type = REG_DWORD;
-    DWORD size = sizeof(*o_value);
-    LONG r = RegQueryValueEx(hkey, i_name.c_str(), NULL,
-                            &type, (BYTE *)o_value, &size);
-    RegCloseKey(hkey);
-    if (r == ERROR_SUCCESS)
-      return true;
-  }
-  *o_value = i_defaultValue;
-  return false;
-#endif // !USE_INI
-}
-
-
-// write DWORD
-bool Registry::write(HKEY i_root, const tstring &i_path, const tstring &i_name,
-                    int i_value)
-{
-#ifdef USE_INI
-  DWORD ret;
-  _TCHAR buf[GANA_MAX_PATH];
-
-  _stprintf(buf, _T("%d"), i_value);
-  ret =  WritePrivateProfileString(_T("yamy"), i_name.c_str(),
-                                  buf, i_path.c_str());
-  return ret != 0;
-#else // !USE_INI
-  HKEY hkey;
-  DWORD disposition;
-  if (ERROR_SUCCESS !=
-      RegCreateKeyEx(i_root, i_path.c_str(), 0, _T(""),
-                    REG_OPTION_NON_VOLATILE,
-                    KEY_ALL_ACCESS, NULL, &hkey, &disposition))
-    return false;
-  LONG r = RegSetValueEx(hkey, i_name.c_str(), NULL, REG_DWORD,
-                        (BYTE *)&i_value, sizeof(i_value));
-  RegCloseKey(hkey);
-  return r == ERROR_SUCCESS;
-#endif // !USE_INI
-}
-
-
-// read string
-bool Registry::read(HKEY i_root, const tstring &i_path, const tstring &i_name,
-                   tstring *o_value, const tstring &i_defaultValue)
-{
-#ifdef USE_INI
-  _TCHAR buf[GANA_MAX_PATH];
-  DWORD len;
-  len = GetPrivateProfileString(_T("yamy"), i_name.c_str(), _T(""),
-                               buf, sizeof(buf) / sizeof(buf[0]), i_path.c_str());
-  if (len > 0)
-  {
-    *o_value = buf;
-    return true;
-  }
-  if (!i_defaultValue.empty())
-    *o_value = i_defaultValue;
-  return false;
-#else // !USE_INI
-  HKEY hkey;
-  if (ERROR_SUCCESS ==
-      RegOpenKeyEx(i_root, i_path.c_str(), 0, KEY_READ, &hkey))
-  {
-    DWORD type = REG_SZ;
-    DWORD size = 0;
-    BYTE dummy;
-    if (ERROR_MORE_DATA ==
-       RegQueryValueEx(hkey, i_name.c_str(), NULL, &type, &dummy, &size))
-    {
-      if (0 < size)
-      {
-       Array<BYTE> buf(size);
-       if (ERROR_SUCCESS == RegQueryValueEx(hkey, i_name.c_str(),
-                                            NULL, &type, buf.get(), &size))
-       {
-         buf.back() = 0;
-         *o_value = reinterpret_cast<_TCHAR *>(buf.get());
-         RegCloseKey(hkey);
-         return true;
-       }
-      }
-    }
-    RegCloseKey(hkey);
-  }
-  if (!i_defaultValue.empty())
-    *o_value = i_defaultValue;
-  return false;
-#endif // !USE_INI
-}
-
-
-// write string
-bool Registry::write(HKEY i_root, const tstring &i_path,
-                    const tstring &i_name, const tstring &i_value)
-{
-#ifdef USE_INI
-  DWORD ret;
-
-  ret =  WritePrivateProfileString(_T("yamy"), i_name.c_str(),
-                                  i_value.c_str(), i_path.c_str());
-  return ret != 0;
-#else // !USE_INI
-  HKEY hkey;
-  DWORD disposition;
-  if (ERROR_SUCCESS !=
-      RegCreateKeyEx(i_root, i_path.c_str(), 0, _T(""),
-                    REG_OPTION_NON_VOLATILE,
-                    KEY_ALL_ACCESS, NULL, &hkey, &disposition))
-    return false;
-  RegSetValueEx(hkey, i_name.c_str(), NULL, REG_SZ,
-               (BYTE *)i_value.c_str(),
-               (i_value.size() + 1) * sizeof(tstring::value_type));
-  RegCloseKey(hkey);
-  return true;
-#endif // !USE_INI
-}
-
-
-#ifndef USE_INI
-// read list of string
-bool Registry::read(HKEY i_root, const tstring &i_path, const tstring &i_name,
-                   tstrings *o_value, const tstrings &i_defaultValue)
-{
-  HKEY hkey;
-  if (ERROR_SUCCESS ==
-      RegOpenKeyEx(i_root, i_path.c_str(), 0, KEY_READ, &hkey))
-  {
-    DWORD type = REG_MULTI_SZ;
-    DWORD size = 0;
-    BYTE dummy;
-    if (ERROR_MORE_DATA ==
-       RegQueryValueEx(hkey, i_name.c_str(), NULL, &type, &dummy, &size))
-    {
-      if (0 < size)
-      {
-       Array<BYTE> buf(size);
-       if (ERROR_SUCCESS == RegQueryValueEx(hkey, i_name.c_str(),
-                                            NULL, &type, buf.get(), &size))
-       {
-         buf.back() = 0;
-         o_value->clear();
-         const _TCHAR *p = reinterpret_cast<_TCHAR *>(buf.get());
-         const _TCHAR *end = reinterpret_cast<_TCHAR *>(buf.end());
-         while (p < end && *p)
-         {
-           o_value->push_back(p);
-           p += o_value->back().length() + 1;
-         }
-         RegCloseKey(hkey);
-         return true;
-       }
-      }
-    }
-    RegCloseKey(hkey);
-  }
-  if (!i_defaultValue.empty())
-    *o_value = i_defaultValue;
-  return false;
-}
-
-
-// write list of string
-bool Registry::write(HKEY i_root, const tstring &i_path,
-                    const tstring &i_name, const tstrings &i_value)
-{
-  HKEY hkey;
-  DWORD disposition;
-  if (ERROR_SUCCESS !=
-      RegCreateKeyEx(i_root, i_path.c_str(), 0, _T(""),
-                    REG_OPTION_NON_VOLATILE,
-                    KEY_ALL_ACCESS, NULL, &hkey, &disposition))
-    return false;
-  tstring value;
-  for (tstrings::const_iterator i = i_value.begin(); i != i_value.end(); ++ i)
-  {
-    value += *i;
-    value += _T('\0');
-  }
-  RegSetValueEx(hkey, i_name.c_str(), NULL, REG_MULTI_SZ,
-               (BYTE *)value.c_str(),
-               (value.size() + 1) * sizeof(tstring::value_type));
-  RegCloseKey(hkey);
-  return true;
-}
-
-
-// read binary
-bool Registry::read(HKEY i_root, const tstring &i_path,
-                   const tstring &i_name, BYTE *o_value, DWORD i_valueSize,
-                   const BYTE *i_defaultValue, DWORD i_defaultValueSize)
-{
-  if (o_value && 0 < i_valueSize)
-  {
-    HKEY hkey;
-    if (ERROR_SUCCESS ==
-       RegOpenKeyEx(i_root, i_path.c_str(), 0, KEY_READ, &hkey))
-    {
-      DWORD type = REG_BINARY;
-      LONG r = RegQueryValueEx(hkey, i_name.c_str(), NULL, &type,
-                              (BYTE *)o_value, &i_valueSize);
-      RegCloseKey(hkey);
-      if (r == ERROR_SUCCESS)
-       return true;
-    }
-  }
-  if (i_defaultValue)
-    CopyMemory(o_value, i_defaultValue,
-              MIN(i_defaultValueSize, i_valueSize));
-  return false;
-}
-
-
-// write binary
-bool Registry::write(HKEY i_root, const tstring &i_path, const tstring &i_name,
-                    const BYTE *i_value, DWORD i_valueSize)
-{
-  if (!i_value)
-    return false;
-  HKEY hkey;
-  DWORD disposition;
-  if (ERROR_SUCCESS !=
-      RegCreateKeyEx(i_root, i_path.c_str(), 0, _T(""),
-                    REG_OPTION_NON_VOLATILE,
-                    KEY_ALL_ACCESS, NULL, &hkey, &disposition))
-    return false;
-  RegSetValueEx(hkey, i_name.c_str(), NULL, REG_BINARY, i_value, i_valueSize);
-  RegCloseKey(hkey);
-  return true;
-}
-#endif //!USE_INI
-
-
-//
-static bool string2logfont(LOGFONT *o_lf, const tstring &i_strlf)
-{
-  // -13,0,0,0,400,0,0,0,128,1,2,1,1,Terminal
-  tregex lf(_T("^(-?\\d+),(-?\\d+),(-?\\d+),(-?\\d+),(-?\\d+),")
-           _T("(-?\\d+),(-?\\d+),(-?\\d+),(-?\\d+),(-?\\d+),")
-           _T("(-?\\d+),(-?\\d+),(-?\\d+),(.+)$"));
-  tsmatch what;
-
-  if (!boost::regex_match(i_strlf, what, lf))
-    return false;
-  o_lf->lfHeight         =       _ttoi(what.str(1).c_str());
-  o_lf->lfWidth          =       _ttoi(what.str(2).c_str());
-  o_lf->lfEscapement     =       _ttoi(what.str(3).c_str());
-  o_lf->lfOrientation    =       _ttoi(what.str(4).c_str());
-  o_lf->lfWeight         =       _ttoi(what.str(5).c_str());
-  o_lf->lfItalic         = (BYTE)_ttoi(what.str(6).c_str());
-  o_lf->lfUnderline      = (BYTE)_ttoi(what.str(7).c_str());
-  o_lf->lfStrikeOut      = (BYTE)_ttoi(what.str(8).c_str());
-  o_lf->lfCharSet        = (BYTE)_ttoi(what.str(9).c_str());
-  o_lf->lfOutPrecision   = (BYTE)_ttoi(what.str(10).c_str());
-  o_lf->lfClipPrecision  = (BYTE)_ttoi(what.str(11).c_str());
-  o_lf->lfQuality        = (BYTE)_ttoi(what.str(12).c_str());
-  o_lf->lfPitchAndFamily = (BYTE)_ttoi(what.str(13).c_str());
-  tcslcpy(o_lf->lfFaceName, what.str(14).c_str(), NUMBER_OF(o_lf->lfFaceName));
-  return true;
-}
-
-
-// read LOGFONT
-bool Registry::read(HKEY i_root, const tstring &i_path, const tstring &i_name,
-                   LOGFONT *o_value, const tstring &i_defaultStringValue)
-{
-  tstring buf;
-  if (!read(i_root, i_path, i_name, &buf) || !string2logfont(o_value, buf))
-  {
-    if (!i_defaultStringValue.empty())
-      string2logfont(o_value, i_defaultStringValue);
-    return false;
-  }
-  return true;
-}
-
-
-// write LOGFONT
-bool Registry::write(HKEY i_root, const tstring &i_path, const tstring &i_name,
-                    const LOGFONT &i_value)
-{
-  _TCHAR buf[1024];
-  _sntprintf(buf, NUMBER_OF(buf),
-            _T("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%s"),
-            i_value.lfHeight, i_value.lfWidth, i_value.lfEscapement,
-            i_value.lfOrientation, i_value.lfWeight, i_value.lfItalic,
-            i_value.lfUnderline, i_value.lfStrikeOut, i_value.lfCharSet,
-            i_value.lfOutPrecision, i_value.lfClipPrecision,
-            i_value.lfQuality,
-            i_value.lfPitchAndFamily, i_value.lfFaceName);
-  return Registry::write(i_root, i_path, i_name, buf);
-}
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// registry.cpp\r
+\r
+\r
+#include "registry.h"\r
+#include "stringtool.h"\r
+#include "array.h"\r
+#include <malloc.h>\r
+\r
+\r
+// remove\r
+bool Registry::remove(HKEY i_root, const tstring &i_path,\r
+                     const tstring &i_name)\r
+{\r
+#ifdef USE_INI\r
+  return false;\r
+  if (i_name.empty())\r
+    return false;\r
+  return WritePrivateProfileString(_T("yamy"), i_name.c_str(), NULL, i_path.c_str()) == TRUE;\r
+#else // !USE_INI\r
+  if (i_name.empty())\r
+    return RegDeleteKey(i_root, i_path.c_str()) == ERROR_SUCCESS;\r
+  HKEY hkey;\r
+  if (ERROR_SUCCESS !=\r
+      RegOpenKeyEx(i_root, i_path.c_str(), 0, KEY_SET_VALUE, &hkey))\r
+    return false;\r
+  LONG r = RegDeleteValue(hkey, i_name.c_str());\r
+  RegCloseKey(hkey);\r
+  return r == ERROR_SUCCESS;\r
+#endif // !USE_INI\r
+}\r
+\r
+\r
+// does exist the key ?\r
+bool Registry::doesExist(HKEY i_root, const tstring &i_path)\r
+{\r
+#ifdef USE_INI\r
+  return true;\r
+#else // !USE_INI\r
+  HKEY hkey;\r
+  if (ERROR_SUCCESS !=\r
+      RegOpenKeyEx(i_root, i_path.c_str(), 0, KEY_READ, &hkey))\r
+    return false;\r
+  RegCloseKey(hkey);\r
+  return true;\r
+#endif // !USE_INI\r
+}\r
+\r
+\r
+// read DWORD\r
+bool Registry::read(HKEY i_root, const tstring &i_path,\r
+                   const tstring &i_name, int *o_value, int i_defaultValue)\r
+{\r
+#ifdef USE_INI\r
+  *o_value =\r
+    GetPrivateProfileInt(_T("yamy"), i_name.c_str(), i_defaultValue, i_path.c_str());\r
+  return true;\r
+#else // !USE_INI\r
+  HKEY hkey;\r
+  if (ERROR_SUCCESS ==\r
+      RegOpenKeyEx(i_root, i_path.c_str(), 0, KEY_READ, &hkey))\r
+  {\r
+    DWORD type = REG_DWORD;\r
+    DWORD size = sizeof(*o_value);\r
+    LONG r = RegQueryValueEx(hkey, i_name.c_str(), NULL,\r
+                            &type, (BYTE *)o_value, &size);\r
+    RegCloseKey(hkey);\r
+    if (r == ERROR_SUCCESS)\r
+      return true;\r
+  }\r
+  *o_value = i_defaultValue;\r
+  return false;\r
+#endif // !USE_INI\r
+}\r
+\r
+\r
+// write DWORD\r
+bool Registry::write(HKEY i_root, const tstring &i_path, const tstring &i_name,\r
+                    int i_value)\r
+{\r
+#ifdef USE_INI\r
+  DWORD ret;\r
+  _TCHAR buf[GANA_MAX_PATH];\r
+\r
+  _stprintf(buf, _T("%d"), i_value);\r
+  ret =  WritePrivateProfileString(_T("yamy"), i_name.c_str(),\r
+                                  buf, i_path.c_str());\r
+  return ret != 0;\r
+#else // !USE_INI\r
+  HKEY hkey;\r
+  DWORD disposition;\r
+  if (ERROR_SUCCESS !=\r
+      RegCreateKeyEx(i_root, i_path.c_str(), 0, _T(""),\r
+                    REG_OPTION_NON_VOLATILE,\r
+                    KEY_ALL_ACCESS, NULL, &hkey, &disposition))\r
+    return false;\r
+  LONG r = RegSetValueEx(hkey, i_name.c_str(), NULL, REG_DWORD,\r
+                        (BYTE *)&i_value, sizeof(i_value));\r
+  RegCloseKey(hkey);\r
+  return r == ERROR_SUCCESS;\r
+#endif // !USE_INI\r
+}\r
+\r
+\r
+// read string\r
+bool Registry::read(HKEY i_root, const tstring &i_path, const tstring &i_name,\r
+                   tstring *o_value, const tstring &i_defaultValue)\r
+{\r
+#ifdef USE_INI\r
+  _TCHAR buf[GANA_MAX_PATH];\r
+  DWORD len;\r
+  len = GetPrivateProfileString(_T("yamy"), i_name.c_str(), _T(""),\r
+                               buf, sizeof(buf) / sizeof(buf[0]), i_path.c_str());\r
+  if (len > 0)\r
+  {\r
+    *o_value = buf;\r
+    return true;\r
+  }\r
+  if (!i_defaultValue.empty())\r
+    *o_value = i_defaultValue;\r
+  return false;\r
+#else // !USE_INI\r
+  HKEY hkey;\r
+  if (ERROR_SUCCESS ==\r
+      RegOpenKeyEx(i_root, i_path.c_str(), 0, KEY_READ, &hkey))\r
+  {\r
+    DWORD type = REG_SZ;\r
+    DWORD size = 0;\r
+    BYTE dummy;\r
+    if (ERROR_MORE_DATA ==\r
+       RegQueryValueEx(hkey, i_name.c_str(), NULL, &type, &dummy, &size))\r
+    {\r
+      if (0 < size)\r
+      {\r
+       Array<BYTE> buf(size);\r
+       if (ERROR_SUCCESS == RegQueryValueEx(hkey, i_name.c_str(),\r
+                                            NULL, &type, buf.get(), &size))\r
+       {\r
+         buf.back() = 0;\r
+         *o_value = reinterpret_cast<_TCHAR *>(buf.get());\r
+         RegCloseKey(hkey);\r
+         return true;\r
+       }\r
+      }\r
+    }\r
+    RegCloseKey(hkey);\r
+  }\r
+  if (!i_defaultValue.empty())\r
+    *o_value = i_defaultValue;\r
+  return false;\r
+#endif // !USE_INI\r
+}\r
+\r
+\r
+// write string\r
+bool Registry::write(HKEY i_root, const tstring &i_path,\r
+                    const tstring &i_name, const tstring &i_value)\r
+{\r
+#ifdef USE_INI\r
+  DWORD ret;\r
+\r
+  ret =  WritePrivateProfileString(_T("yamy"), i_name.c_str(),\r
+                                  i_value.c_str(), i_path.c_str());\r
+  return ret != 0;\r
+#else // !USE_INI\r
+  HKEY hkey;\r
+  DWORD disposition;\r
+  if (ERROR_SUCCESS !=\r
+      RegCreateKeyEx(i_root, i_path.c_str(), 0, _T(""),\r
+                    REG_OPTION_NON_VOLATILE,\r
+                    KEY_ALL_ACCESS, NULL, &hkey, &disposition))\r
+    return false;\r
+  RegSetValueEx(hkey, i_name.c_str(), NULL, REG_SZ,\r
+               (BYTE *)i_value.c_str(),\r
+               (i_value.size() + 1) * sizeof(tstring::value_type));\r
+  RegCloseKey(hkey);\r
+  return true;\r
+#endif // !USE_INI\r
+}\r
+\r
+\r
+#ifndef USE_INI\r
+// read list of string\r
+bool Registry::read(HKEY i_root, const tstring &i_path, const tstring &i_name,\r
+                   tstrings *o_value, const tstrings &i_defaultValue)\r
+{\r
+  HKEY hkey;\r
+  if (ERROR_SUCCESS ==\r
+      RegOpenKeyEx(i_root, i_path.c_str(), 0, KEY_READ, &hkey))\r
+  {\r
+    DWORD type = REG_MULTI_SZ;\r
+    DWORD size = 0;\r
+    BYTE dummy;\r
+    if (ERROR_MORE_DATA ==\r
+       RegQueryValueEx(hkey, i_name.c_str(), NULL, &type, &dummy, &size))\r
+    {\r
+      if (0 < size)\r
+      {\r
+       Array<BYTE> buf(size);\r
+       if (ERROR_SUCCESS == RegQueryValueEx(hkey, i_name.c_str(),\r
+                                            NULL, &type, buf.get(), &size))\r
+       {\r
+         buf.back() = 0;\r
+         o_value->clear();\r
+         const _TCHAR *p = reinterpret_cast<_TCHAR *>(buf.get());\r
+         const _TCHAR *end = reinterpret_cast<_TCHAR *>(buf.end());\r
+         while (p < end && *p)\r
+         {\r
+           o_value->push_back(p);\r
+           p += o_value->back().length() + 1;\r
+         }\r
+         RegCloseKey(hkey);\r
+         return true;\r
+       }\r
+      }\r
+    }\r
+    RegCloseKey(hkey);\r
+  }\r
+  if (!i_defaultValue.empty())\r
+    *o_value = i_defaultValue;\r
+  return false;\r
+}\r
+\r
+\r
+// write list of string\r
+bool Registry::write(HKEY i_root, const tstring &i_path,\r
+                    const tstring &i_name, const tstrings &i_value)\r
+{\r
+  HKEY hkey;\r
+  DWORD disposition;\r
+  if (ERROR_SUCCESS !=\r
+      RegCreateKeyEx(i_root, i_path.c_str(), 0, _T(""),\r
+                    REG_OPTION_NON_VOLATILE,\r
+                    KEY_ALL_ACCESS, NULL, &hkey, &disposition))\r
+    return false;\r
+  tstring value;\r
+  for (tstrings::const_iterator i = i_value.begin(); i != i_value.end(); ++ i)\r
+  {\r
+    value += *i;\r
+    value += _T('\0');\r
+  }\r
+  RegSetValueEx(hkey, i_name.c_str(), NULL, REG_MULTI_SZ,\r
+               (BYTE *)value.c_str(),\r
+               (value.size() + 1) * sizeof(tstring::value_type));\r
+  RegCloseKey(hkey);\r
+  return true;\r
+}\r
+\r
+\r
+// read binary\r
+bool Registry::read(HKEY i_root, const tstring &i_path,\r
+                   const tstring &i_name, BYTE *o_value, DWORD i_valueSize,\r
+                   const BYTE *i_defaultValue, DWORD i_defaultValueSize)\r
+{\r
+  if (o_value && 0 < i_valueSize)\r
+  {\r
+    HKEY hkey;\r
+    if (ERROR_SUCCESS ==\r
+       RegOpenKeyEx(i_root, i_path.c_str(), 0, KEY_READ, &hkey))\r
+    {\r
+      DWORD type = REG_BINARY;\r
+      LONG r = RegQueryValueEx(hkey, i_name.c_str(), NULL, &type,\r
+                              (BYTE *)o_value, &i_valueSize);\r
+      RegCloseKey(hkey);\r
+      if (r == ERROR_SUCCESS)\r
+       return true;\r
+    }\r
+  }\r
+  if (i_defaultValue)\r
+    CopyMemory(o_value, i_defaultValue,\r
+              MIN(i_defaultValueSize, i_valueSize));\r
+  return false;\r
+}\r
+\r
+\r
+// write binary\r
+bool Registry::write(HKEY i_root, const tstring &i_path, const tstring &i_name,\r
+                    const BYTE *i_value, DWORD i_valueSize)\r
+{\r
+  if (!i_value)\r
+    return false;\r
+  HKEY hkey;\r
+  DWORD disposition;\r
+  if (ERROR_SUCCESS !=\r
+      RegCreateKeyEx(i_root, i_path.c_str(), 0, _T(""),\r
+                    REG_OPTION_NON_VOLATILE,\r
+                    KEY_ALL_ACCESS, NULL, &hkey, &disposition))\r
+    return false;\r
+  RegSetValueEx(hkey, i_name.c_str(), NULL, REG_BINARY, i_value, i_valueSize);\r
+  RegCloseKey(hkey);\r
+  return true;\r
+}\r
+#endif //!USE_INI\r
+\r
+\r
+//\r
+static bool string2logfont(LOGFONT *o_lf, const tstring &i_strlf)\r
+{\r
+  // -13,0,0,0,400,0,0,0,128,1,2,1,1,Terminal\r
+  tregex lf(_T("^(-?\\d+),(-?\\d+),(-?\\d+),(-?\\d+),(-?\\d+),")\r
+           _T("(-?\\d+),(-?\\d+),(-?\\d+),(-?\\d+),(-?\\d+),")\r
+           _T("(-?\\d+),(-?\\d+),(-?\\d+),(.+)$"));\r
+  tsmatch what;\r
+\r
+  if (!boost::regex_match(i_strlf, what, lf))\r
+    return false;\r
+  o_lf->lfHeight         =       _ttoi(what.str(1).c_str());\r
+  o_lf->lfWidth          =       _ttoi(what.str(2).c_str());\r
+  o_lf->lfEscapement     =       _ttoi(what.str(3).c_str());\r
+  o_lf->lfOrientation    =       _ttoi(what.str(4).c_str());\r
+  o_lf->lfWeight         =       _ttoi(what.str(5).c_str());\r
+  o_lf->lfItalic         = (BYTE)_ttoi(what.str(6).c_str());\r
+  o_lf->lfUnderline      = (BYTE)_ttoi(what.str(7).c_str());\r
+  o_lf->lfStrikeOut      = (BYTE)_ttoi(what.str(8).c_str());\r
+  o_lf->lfCharSet        = (BYTE)_ttoi(what.str(9).c_str());\r
+  o_lf->lfOutPrecision   = (BYTE)_ttoi(what.str(10).c_str());\r
+  o_lf->lfClipPrecision  = (BYTE)_ttoi(what.str(11).c_str());\r
+  o_lf->lfQuality        = (BYTE)_ttoi(what.str(12).c_str());\r
+  o_lf->lfPitchAndFamily = (BYTE)_ttoi(what.str(13).c_str());\r
+  tcslcpy(o_lf->lfFaceName, what.str(14).c_str(), NUMBER_OF(o_lf->lfFaceName));\r
+  return true;\r
+}\r
+\r
+\r
+// read LOGFONT\r
+bool Registry::read(HKEY i_root, const tstring &i_path, const tstring &i_name,\r
+                   LOGFONT *o_value, const tstring &i_defaultStringValue)\r
+{\r
+  tstring buf;\r
+  if (!read(i_root, i_path, i_name, &buf) || !string2logfont(o_value, buf))\r
+  {\r
+    if (!i_defaultStringValue.empty())\r
+      string2logfont(o_value, i_defaultStringValue);\r
+    return false;\r
+  }\r
+  return true;\r
+}\r
+\r
+\r
+// write LOGFONT\r
+bool Registry::write(HKEY i_root, const tstring &i_path, const tstring &i_name,\r
+                    const LOGFONT &i_value)\r
+{\r
+  _TCHAR buf[1024];\r
+  _sntprintf(buf, NUMBER_OF(buf),\r
+            _T("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%s"),\r
+            i_value.lfHeight, i_value.lfWidth, i_value.lfEscapement,\r
+            i_value.lfOrientation, i_value.lfWeight, i_value.lfItalic,\r
+            i_value.lfUnderline, i_value.lfStrikeOut, i_value.lfCharSet,\r
+            i_value.lfOutPrecision, i_value.lfClipPrecision,\r
+            i_value.lfQuality,\r
+            i_value.lfPitchAndFamily, i_value.lfFaceName);\r
+  return Registry::write(i_root, i_path, i_name, buf);\r
+}\r
index 531c62d..8a283c2 100644 (file)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// registry.h
-
-
-#ifndef _REGISTRY_H
-#  define _REGISTRY_H
-
-#  include "stringtool.h"
-#  include <list>
-
-
-/// registry access class
-class Registry
-{
-  HKEY m_root;                                 /// registry root
-  tstring m_path;                              /// path from registry root
-
-public:
-  typedef std::list<tstring> tstrings;
-  
-public:
-  ///
-  Registry() : m_root(NULL) { setRoot(NULL, _T("")); }
-  ///
-  Registry(HKEY i_root, const tstring &i_path)
-    : m_root(i_root), m_path(i_path) { setRoot(i_root, i_path); }
-  
-  /// set registry root and path
-  void setRoot(HKEY i_root, const tstring &i_path)
-  {
-    m_root = i_root;
-    m_path = i_path;
-    _TCHAR exePath[GANA_MAX_PATH];
-    _TCHAR exeDrive[GANA_MAX_PATH];
-    _TCHAR exeDir[GANA_MAX_PATH];
-    GetModuleFileName(NULL, exePath, GANA_MAX_PATH);
-    _tsplitpath_s(exePath, exeDrive, GANA_MAX_PATH, exeDir, GANA_MAX_PATH, NULL, 0, NULL, 0);
-    m_path = exeDrive;
-    m_path += exeDir;
-    m_path += _T("yamy.ini");
-  }
-  
-  /// remvoe
-  bool remove(const tstring &i_name = _T("")) const
-  { return remove(m_root, m_path, i_name); }
-  
-  /// does exist the key ?
-  bool doesExist() const { return doesExist(m_root, m_path); }
-
-  /// read DWORD
-  bool read(const tstring &i_name, int *o_value, int i_defaultValue = 0)
-    const
-  { return read(m_root, m_path, i_name, o_value, i_defaultValue); }
-  /// write DWORD
-  bool write(const tstring &i_name, int i_value) const
-  { return write(m_root, m_path, i_name, i_value); }
-  /// read tstring
-  bool read(const tstring &i_name, tstring *o_value, 
-           const tstring &i_defaultValue = _T("")) const
-  { return read(m_root, m_path, i_name, o_value, i_defaultValue); }
-  /// write tstring
-  bool write(const tstring &i_name, const tstring &i_value) const
-  { return write(m_root, m_path, i_name, i_value); }
-
-#ifndef USE_INI
-  /// read list of tstring
-  bool read(const tstring &i_name, tstrings *o_value, 
-           const tstrings &i_defaultValue = tstrings()) const
-  { return read(m_root, m_path, i_name, o_value, i_defaultValue); }
-  /// write list of tstring
-  bool write(const tstring &i_name, const tstrings &i_value) const
-  { return write(m_root, m_path, i_name, i_value); }
-
-  /// read binary data
-  bool read(const tstring &i_name, BYTE *o_value, DWORD i_valueSize,
-           const BYTE *i_defaultValue = NULL, DWORD i_defaultValueSize = 0)
-    const
-  { return read(m_root, m_path, i_name, o_value, i_valueSize, i_defaultValue,
-               i_defaultValueSize); }
-  /// write binary data
-  bool write(const tstring &i_name, const BYTE *i_value,
-            DWORD i_valueSize) const
-  { return write(m_root, m_path, i_name, i_value, i_valueSize); }
-#endif //!USE_INI
-
-public:
-  /// remove
-  static bool remove(HKEY i_root, const tstring &i_path,
-                    const tstring &i_name = _T(""));
-  
-  /// does exist the key ?
-  static bool doesExist(HKEY i_root, const tstring &i_path);
-  
-  /// read DWORD
-  static bool read(HKEY i_root, const tstring &i_path, const tstring &i_name,
-                  int *o_value, int i_defaultValue = 0);
-  /// write DWORD
-  static bool write(HKEY i_root, const tstring &i_path, const tstring &i_name,
-                   int i_value);
-
-  /// read tstring
-  static bool read(HKEY i_root, const tstring &i_path, const tstring &i_name,
-                  tstring *o_value, const tstring &i_defaultValue = _T(""));
-  /// write tstring
-  static bool write(HKEY i_root, const tstring &i_path, const tstring &i_name,
-                   const tstring &i_value);
-  
-#ifndef USE_INI
-  /// read list of tstring
-  static bool read(HKEY i_root, const tstring &i_path, const tstring &i_name,
-                  tstrings *o_value, const tstrings &i_defaultValue = tstrings());
-  /// write list of tstring
-  static bool write(HKEY i_root, const tstring &i_path, const tstring &i_name,
-                   const tstrings &i_value);
-  
-  /// read binary data
-  static bool read(HKEY i_root, const tstring &i_path, const tstring &i_name,
-                  BYTE *o_value, DWORD i_valueSize,
-                  const BYTE *i_defaultValue = NULL,
-                  DWORD i_defaultValueSize = 0);
-  /// write binary data
-  static bool write(HKEY i_root, const tstring &i_path, const tstring &i_name,
-                   const BYTE *i_value, DWORD i_valueSize);
-#endif //!USE_INI
-  /// read LOGFONT
-  static bool read(HKEY i_root, const tstring &i_path, const tstring &i_name,
-                  LOGFONT *o_value, const tstring &i_defaultStringValue);
-  /// write LOGFONT
-  static bool write(HKEY i_root, const tstring &i_path, const tstring &i_name,
-                   const LOGFONT &i_value);
-};
-
-
-#endif // !_REGISTRY_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// registry.h\r
+\r
+\r
+#ifndef _REGISTRY_H\r
+#  define _REGISTRY_H\r
+\r
+#  include "stringtool.h"\r
+#  include <list>\r
+\r
+\r
+/// registry access class\r
+class Registry\r
+{\r
+  HKEY m_root;                                 /// registry root\r
+  tstring m_path;                              /// path from registry root\r
+\r
+public:\r
+  typedef std::list<tstring> tstrings;\r
+  \r
+public:\r
+  ///\r
+  Registry() : m_root(NULL) { setRoot(NULL, _T("")); }\r
+  ///\r
+  Registry(HKEY i_root, const tstring &i_path)\r
+    : m_root(i_root), m_path(i_path) { setRoot(i_root, i_path); }\r
+  \r
+  /// set registry root and path\r
+  void setRoot(HKEY i_root, const tstring &i_path)\r
+  {\r
+    m_root = i_root;\r
+    m_path = i_path;\r
+    _TCHAR exePath[GANA_MAX_PATH];\r
+    _TCHAR exeDrive[GANA_MAX_PATH];\r
+    _TCHAR exeDir[GANA_MAX_PATH];\r
+    GetModuleFileName(NULL, exePath, GANA_MAX_PATH);\r
+    _tsplitpath_s(exePath, exeDrive, GANA_MAX_PATH, exeDir, GANA_MAX_PATH, NULL, 0, NULL, 0);\r
+    m_path = exeDrive;\r
+    m_path += exeDir;\r
+    m_path += _T("yamy.ini");\r
+  }\r
+  \r
+  /// remvoe\r
+  bool remove(const tstring &i_name = _T("")) const\r
+  { return remove(m_root, m_path, i_name); }\r
+  \r
+  /// does exist the key ?\r
+  bool doesExist() const { return doesExist(m_root, m_path); }\r
+\r
+  /// read DWORD\r
+  bool read(const tstring &i_name, int *o_value, int i_defaultValue = 0)\r
+    const\r
+  { return read(m_root, m_path, i_name, o_value, i_defaultValue); }\r
+  /// write DWORD\r
+  bool write(const tstring &i_name, int i_value) const\r
+  { return write(m_root, m_path, i_name, i_value); }\r
\r
+  /// read tstring\r
+  bool read(const tstring &i_name, tstring *o_value, \r
+           const tstring &i_defaultValue = _T("")) const\r
+  { return read(m_root, m_path, i_name, o_value, i_defaultValue); }\r
+  /// write tstring\r
+  bool write(const tstring &i_name, const tstring &i_value) const\r
+  { return write(m_root, m_path, i_name, i_value); }\r
+\r
+#ifndef USE_INI\r
+  /// read list of tstring\r
+  bool read(const tstring &i_name, tstrings *o_value, \r
+           const tstrings &i_defaultValue = tstrings()) const\r
+  { return read(m_root, m_path, i_name, o_value, i_defaultValue); }\r
+  /// write list of tstring\r
+  bool write(const tstring &i_name, const tstrings &i_value) const\r
+  { return write(m_root, m_path, i_name, i_value); }\r
+\r
+  /// read binary data\r
+  bool read(const tstring &i_name, BYTE *o_value, DWORD i_valueSize,\r
+           const BYTE *i_defaultValue = NULL, DWORD i_defaultValueSize = 0)\r
+    const\r
+  { return read(m_root, m_path, i_name, o_value, i_valueSize, i_defaultValue,\r
+               i_defaultValueSize); }\r
+  /// write binary data\r
+  bool write(const tstring &i_name, const BYTE *i_value,\r
+            DWORD i_valueSize) const\r
+  { return write(m_root, m_path, i_name, i_value, i_valueSize); }\r
+#endif //!USE_INI\r
+\r
+public:\r
+  /// remove\r
+  static bool remove(HKEY i_root, const tstring &i_path,\r
+                    const tstring &i_name = _T(""));\r
+  \r
+  /// does exist the key ?\r
+  static bool doesExist(HKEY i_root, const tstring &i_path);\r
+  \r
+  /// read DWORD\r
+  static bool read(HKEY i_root, const tstring &i_path, const tstring &i_name,\r
+                  int *o_value, int i_defaultValue = 0);\r
+  /// write DWORD\r
+  static bool write(HKEY i_root, const tstring &i_path, const tstring &i_name,\r
+                   int i_value);\r
+\r
+  /// read tstring\r
+  static bool read(HKEY i_root, const tstring &i_path, const tstring &i_name,\r
+                  tstring *o_value, const tstring &i_defaultValue = _T(""));\r
+  /// write tstring\r
+  static bool write(HKEY i_root, const tstring &i_path, const tstring &i_name,\r
+                   const tstring &i_value);\r
+  \r
+#ifndef USE_INI\r
+  /// read list of tstring\r
+  static bool read(HKEY i_root, const tstring &i_path, const tstring &i_name,\r
+                  tstrings *o_value, const tstrings &i_defaultValue = tstrings());\r
+  /// write list of tstring\r
+  static bool write(HKEY i_root, const tstring &i_path, const tstring &i_name,\r
+                   const tstrings &i_value);\r
+  \r
+  /// read binary data\r
+  static bool read(HKEY i_root, const tstring &i_path, const tstring &i_name,\r
+                  BYTE *o_value, DWORD i_valueSize,\r
+                  const BYTE *i_defaultValue = NULL,\r
+                  DWORD i_defaultValueSize = 0);\r
+  /// write binary data\r
+  static bool write(HKEY i_root, const tstring &i_path, const tstring &i_name,\r
+                   const BYTE *i_value, DWORD i_valueSize);\r
+#endif //!USE_INI\r
+  /// read LOGFONT\r
+  static bool read(HKEY i_root, const tstring &i_path, const tstring &i_name,\r
+                  LOGFONT *o_value, const tstring &i_defaultStringValue);\r
+  /// write LOGFONT\r
+  static bool write(HKEY i_root, const tstring &i_path, const tstring &i_name,\r
+                   const LOGFONT &i_value);\r
+};\r
+\r
+\r
+#endif // !_REGISTRY_H\r
index 8a6a91b..c5bd0d1 100644 (file)
@@ -1,7 +1,7 @@
-#ifndef MAYU_AFXRES_H
-#  define MAYU_AFXRES_H
-
-#  include "windows.h"
-#  define IDC_STATIC -1
-
-#endif // !MAYU_AFXRES_H
+#ifndef MAYU_AFXRES_H\r
+#  define MAYU_AFXRES_H\r
+\r
+#  include "windows.h"\r
+#  define IDC_STATIC -1\r
+\r
+#endif // !MAYU_AFXRES_H\r
index d9145c8..cd40581 100644 (file)
-///////////////////////////////////////////////////////////////////////////////
-// setup.cpp
-
-
-#include "../misc.h"
-#include "../registry.h"
-#include "../stringtool.h"
-#include "../windowstool.h"
-#include "installer.h"
-
-#include <shlobj.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-
-namespace Installer
-{
-  using namespace std;
-  
-  
-  /////////////////////////////////////////////////////////////////////////////
-  // Utility Functions
-
-  /** createLink
-               uses the shell's IShellLink and IPersistFile interfaces to
-               create and store a shortcut to the specified object.
-      @return
-               the result of calling the member functions of the interfaces.
-      @param i_pathObj
-               address of a buffer containing the path of the object.
-      @param i_pathLink
-               address of a buffer containing the path where the
-               shell link is to be stored.
-      @param i_desc
-               address of a buffer containing the description of the
-               shell link.
-  */
-  HRESULT createLink(LPCTSTR i_pathObj, LPCTSTR i_pathLink, LPCTSTR i_desc,
-                    LPCTSTR i_workingDirectory)
-  { 
-    // Get a pointer to the IShellLink interface. 
-    IShellLink* psl;
-    HRESULT hres =
-      CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
-                      IID_IShellLink, (void **)&psl);
-    if (SUCCEEDED(hres))
-    { 
-      // Set the path to the shortcut target and add the description. 
-      psl->SetPath(i_pathObj);
-      psl->SetDescription(i_desc);
-      if (i_workingDirectory)
-       psl->SetWorkingDirectory(i_workingDirectory);
-      // Query IShellLink for the IPersistFile interface for saving the 
-      // shortcut in persistent storage. 
-      IPersistFile* ppf; 
-      hres = psl->QueryInterface(IID_IPersistFile, (void **)&ppf);
-      if (SUCCEEDED(hres))
-      {
-#ifdef UNICODE
-       // Save the link by calling IPersistFile::Save. 
-       hres = ppf->Save(i_pathLink, TRUE); 
-#else
-       wchar_t wsz[MAX_PATH];
-       // Ensure that the string is ANSI. 
-       MultiByteToWideChar(CP_ACP, 0, i_pathLink, -1, wsz, MAX_PATH);
-       // Save the link by calling IPersistFile::Save. 
-       hres = ppf->Save(wsz, TRUE); 
-#endif
-       ppf->Release();
-      }
-      psl->Release();
-    } 
-    return hres; 
-  }
-
-
-  // create file extension information
-  void createFileExtension(const tstringi &i_ext, const tstring &i_contentType,
-                          const tstringi &i_fileType,
-                          const tstring &i_fileTypeName,
-                          const tstringi &i_iconPath,
-                          const tstring &i_command)
-  {
-    tstring dummy;
-
-    Registry regExt(HKEY_CLASSES_ROOT, i_ext);
-    if (!         regExt.read (_T(""), &dummy))
-      CHECK_TRUE( regExt.write(_T(""), i_fileType) );
-    if (!         regExt.read (_T("Content Type"), &dummy))
-      CHECK_TRUE( regExt.write(_T("Content Type"), i_contentType) );
-
-    Registry      regFileType(HKEY_CLASSES_ROOT, i_fileType);
-    if (!         regFileType.read (_T(""), &dummy))
-      CHECK_TRUE( regFileType.write(_T(""), i_fileTypeName) );
-
-    Registry      regFileTypeIcon(HKEY_CLASSES_ROOT,
-                                 i_fileType + _T("\\DefaultIcon"));
-    if (!         regFileTypeIcon.read (_T(""), &dummy))
-      CHECK_TRUE( regFileTypeIcon.write(_T(""), i_iconPath) );
-
-    Registry      regFileTypeComand(HKEY_CLASSES_ROOT,
-                                   i_fileType + _T("\\shell\\open\\command"));
-    if (!         regFileTypeComand.read (_T(""), &dummy))
-      CHECK_TRUE( regFileTypeComand.write(_T(""), i_command) );
-  }
-
-
-  // remove file extension information
-  void removeFileExtension(const tstringi &i_ext, const tstringi &i_fileType)
-  {
-    Registry::remove(HKEY_CLASSES_ROOT, i_ext);
-    Registry::remove(HKEY_CLASSES_ROOT,
-                    i_fileType + _T("\\shell\\open\\command"));
-    Registry::remove(HKEY_CLASSES_ROOT, i_fileType + _T("\\shell\\open"));
-    Registry::remove(HKEY_CLASSES_ROOT, i_fileType + _T("\\shell"));
-    Registry::remove(HKEY_CLASSES_ROOT, i_fileType);
-  }
-
-  
-  // create uninstallation information
-  void createUninstallInformation(const tstringi &i_name,
-                                 const tstring &i_displayName,
-                                 const tstring &i_commandLine)
-  {
-    Registry reg(
-      HKEY_LOCAL_MACHINE,
-      _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\")
-      + i_name);
-
-    CHECK_TRUE( reg.write(_T("DisplayName"), i_displayName) );
-    CHECK_TRUE( reg.write(_T("UninstallString"), i_commandLine) );
-  }
-
-  
-  // remove uninstallation information
-  void removeUninstallInformation(const tstringi &i_name)
-  {
-    Registry::
-      remove(HKEY_LOCAL_MACHINE,
-            _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\")
-            + i_name);
-  }
-  
-  
-  // normalize path
-  tstringi normalizePath(tstringi i_path)
-  {
-    tregex regSlash(_T("^(.*)/(.*)$"));
-    tsmatch what;
-    while (boost::regex_search(i_path, what, regSlash))
-      i_path = what.str(1) + _T("\\") + what.str(2);
-
-    tregex regTailBackSlash(_T("^(.*)\\\\$"));
-    while (boost::regex_search(i_path, what, regTailBackSlash))
-      i_path = what.str(1);
-    
-    return i_path;
-  }
-  
-  
-  // create deep directory
-  bool createDirectories(const _TCHAR *i_folder)
-  {
-    const _TCHAR *s = _tcschr(i_folder, _T('\\')); // TODO: '/'
-    if (s && s - i_folder == 2 && i_folder[1] == _T(':'))
-      s = _tcschr(s + 1, _T('\\'));
-    
-    struct _stat sbuf;
-    while (s)
-    {
-      tstringi f(i_folder, 0, s - i_folder);
-      if (_tstat(f.c_str(), &sbuf) < 0)
-       if (!CreateDirectory(f.c_str(), NULL))
-         return false;
-      s = _tcschr(s + 1, _T('\\'));
-    }
-    if (_tstat(i_folder, &sbuf) < 0)
-      if (!CreateDirectory(i_folder, NULL))
-       return false;
-    return true;
-  }
-
-
-  // get driver directory
-  tstringi getDriverDirectory()
-  {
-    _TCHAR buf[GANA_MAX_PATH];
-    CHECK_TRUE( GetSystemDirectory(buf, NUMBER_OF(buf)) );
-    return tstringi(buf) + _T("\\drivers");
-  }
-
-  
-  // get current directory
-  tstringi getModuleDirectory()
-  {
-    _TCHAR buf[GANA_MAX_PATH];
-    CHECK_TRUE( GetModuleFileName(g_hInst, buf, NUMBER_OF(buf)) );
-    tregex reg(_T("^(.*)\\\\[^\\\\]*$"));
-    tsmatch what;
-    tstringi path(buf);
-    if (boost::regex_search(path, what, reg))
-      return what.str(1);
-    else
-      return path;
-  }
-
-
-  // get start menu name
-  tstringi getStartMenuName(const tstringi &i_shortcutName)
-  {
-#if 0
-    char programDir[GANA_MAX_PATH];
-    if (SUCCEEDED(SHGetSpecialFolderPath(NULL, programDir,
-                                        CSIDL_COMMON_PROGRAMS, FALSE)))
-      return tstringi(programDir) + "\\" + shortcutName + ".lnk";
-#else
-    tstringi programDir;
-    if (Registry::read(HKEY_LOCAL_MACHINE,
-                      _T("Software\\Microsoft\\Windows\\CurrentVersion\\")
-                      _T("Explorer\\Shell Folders"), _T("Common Programs"),
-                      &programDir))
-      return programDir + _T("\\") + i_shortcutName + _T(".lnk");
-#endif
-    return _T("");
-  }
-
-
-  // get start up name
-  tstringi getStartUpName(const tstringi &i_shortcutName)
-  {
-    tstringi startupDir;
-    if (Registry::read(HKEY_CURRENT_USER,
-                      _T("Software\\Microsoft\\Windows\\CurrentVersion\\")
-                      _T("Explorer\\Shell Folders"), _T("Startup"),
-                      &startupDir))
-      return startupDir + _T("\\") + i_shortcutName + _T(".lnk");
-    return _T("");
-  }
-
-
-#if defined(_WINNT)
-
-#  define MAYUD_FILTER_KEY _T("System\\CurrentControlSet\\Control\\Class\\{4D36E96B-E325-11CE-BFC1-08002BE10318}")
-
-  // create driver service
-  DWORD createDriverService(const tstringi &i_serviceName,
-                           const tstring &i_serviceDescription,
-                           const tstringi &i_driverPath,
-                           const _TCHAR *i_preloadedGroups,
-                           bool forUsb)
-  {
-    SC_HANDLE hscm =
-      OpenSCManager(NULL, NULL,
-                   SC_MANAGER_CREATE_SERVICE | SC_MANAGER_CONNECT);
-    if (!hscm)
-      return false;
-
-    SC_HANDLE hs =
-      CreateService(hscm, i_serviceName.c_str(), i_serviceDescription.c_str(),
-                   SERVICE_START | SERVICE_STOP, SERVICE_KERNEL_DRIVER,
-                   forUsb == true ? SERVICE_DEMAND_START : SERVICE_AUTO_START,
-                   SERVICE_ERROR_IGNORE,
-                   i_driverPath.c_str(), NULL, NULL,
-                   i_preloadedGroups, NULL, NULL);
-    DWORD err = GetLastError();
-    if (hs == NULL)
-    {
-      switch (err)
-      {
-       case ERROR_SERVICE_EXISTS:
-       {
-#if 0
-         hs = OpenService(hscm, i_serviceName.c_str(), SERVICE_CHANGE_CONFIG);
-         if (hs == NULL) {
-           CloseServiceHandle(hscm);
-           return GetLastError();
-         }
-         if (!ChangeServiceConfig(
-               hscm, SERVICE_KERNEL_DRIVER,
-               forUsb == true ? SERVICE_DEMAND_START : SERVICE_AUTO_START,
-               SERVICE_ERROR_IGNORE,
-               i_driverPath.c_str(), NULL, NULL,
-               i_preloadedGroups, NULL, NULL,
-               i_serviceDescription.c_str())) {
-           CloseServiceHandle(hs);
-           CloseServiceHandle(hscm);
-           return GetLastError();              // ERROR_IO_PENDING!
-           // this code always reaches here. why?
-         }
-#else
-         Registry reg(HKEY_LOCAL_MACHINE,
-                      _T("SYSTEM\\CurrentControlSet\\Services\\mayud"));
-         reg.write(_T("Start"),
-                   forUsb ? SERVICE_DEMAND_START : SERVICE_AUTO_START);
-#endif
-         break;
-       }
-       default:
-       {
-         CloseServiceHandle(hscm);
-         return err;
-       }
-      }
-    }
-    CloseServiceHandle(hs);
-    CloseServiceHandle(hscm);
-
-    if (forUsb == true) {
-      Registry reg(HKEY_LOCAL_MACHINE, MAYUD_FILTER_KEY);
-      typedef std::list<tstring> Filters;
-      Filters filters;
-      if (!reg.read(_T("UpperFilters"), &filters))
-       return false;
-      for (Filters::iterator i = filters.begin(); i != filters.end(); ) {
-         Filters::iterator next = i;
-         ++ next;
-         if (*i == _T("mayud")) {
-             filters.erase(i);
-         }
-         i = next;
-      }
-      filters.push_back(_T("mayud"));
-      if (!reg.write(_T("UpperFilters"), filters))
-       return false;
-    }
-
-    return ERROR_SUCCESS;
-  }
-#endif // _WINNT
-
-
-#if defined(_WINNT)
-  // remove driver service
-  DWORD removeDriverService(const tstringi &i_serviceName)
-  {
-    DWORD err = ERROR_SUCCESS;
-    
-    Registry reg(HKEY_LOCAL_MACHINE, MAYUD_FILTER_KEY);
-    std::list<tstring> filters;
-    if (reg.read(_T("UpperFilters"), &filters))
-    {
-      filters.remove(_T("mayud"));
-      reg.write(_T("UpperFilters"), filters);
-    }
-
-    SC_HANDLE hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
-    SC_HANDLE hs =
-      OpenService(hscm, i_serviceName.c_str(),
-                 SERVICE_START | SERVICE_STOP | DELETE);
-    if (!hs)
-    {
-      err = GetLastError();
-      goto error;
-    }
-
-    SERVICE_STATUS ss;
-    ControlService(hs, SERVICE_CONTROL_STOP, &ss);
-  
-    if (!DeleteService(hs))
-    {
-      err = GetLastError();
-      goto error;
-    }
-    error:
-    CloseServiceHandle(hs);
-    CloseServiceHandle(hscm);
-    return err;
-  }
-#endif // _WINNT
-
-
-  // check operating system
-  bool checkOs(SetupFile::OS os)
-  {
-    OSVERSIONINFO ver;
-    ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-    GetVersionEx(&ver);
-    
-    switch (os)
-    {
-      default:
-      case SetupFile::ALL:
-       return true;
-      case SetupFile::W9x:
-       return (ver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS &&
-               4 <= ver.dwMajorVersion);
-      case SetupFile::NT :
-       return (ver.dwPlatformId == VER_PLATFORM_WIN32_NT &&
-               4 <= ver.dwMajorVersion);
-      case SetupFile::NT4:
-       return (ver.dwPlatformId == VER_PLATFORM_WIN32_NT &&
-               ver.dwMajorVersion == 4);
-      case SetupFile::W2k:                     // W2k, XP, ...
-       return (ver.dwPlatformId == VER_PLATFORM_WIN32_NT &&
-               5 <= ver.dwMajorVersion);
-    }
-  }
-
-  
-  // install files
-  bool installFiles(const SetupFile::Data *i_setupFiles,
-                   size_t i_setupFilesSize, u_int32 i_flags,
-                   const tstringi &i_srcDir, const tstringi &i_destDir)
-  {
-    tstringi to, from;
-    tstringi destDriverDir = getDriverDirectory();
-
-    for (size_t i = 0; i < i_setupFilesSize; ++ i)
-    {
-      const SetupFile::Data &s = i_setupFiles[i];
-      const tstringi &fromDir = i_srcDir;
-      const tstringi &toDir =
-       (s.m_destination == SetupFile::ToDriver) ? destDriverDir : i_destDir;
-
-      if (!s.m_from)
-       continue;                               // remove only
-
-      if (fromDir == toDir)
-       continue;                               // same directory
-
-      if (!checkOs(s.m_os))                    // check operating system
-       continue;
-
-      if ((s.m_flags & i_flags) != i_flags)    // check flags
-       continue;
-      
-      // type
-      switch (s.m_kind)
-      {
-       case SetupFile::Dll:
-       {
-         // rename driver
-         tstringi from_ = toDir + _T("\\") + s.m_to;
-         tstringi to_ = toDir + _T("\\deleted.") + s.m_to;
-         DeleteFile(to_.c_str());
-         MoveFile(from_.c_str(), to_.c_str());
-         DeleteFile(to_.c_str());
-       }
-       // fall through
-       default:
-       case SetupFile::File:
-       {
-         from += fromDir + _T('\\') + s.m_from + _T('\0');
-         to   += toDir   + _T('\\') + s.m_to   + _T('\0');
-         break;
-       }
-       case SetupFile::Dir:
-       {
-         createDirectories((toDir + _T('\\') + s.m_to).c_str());
-         break;
-       }
-      }
-    }
-#if 0
-    {
-      tstringi to_(to), from_(from);
-      for (size_t i = 0; i < to_.size(); ++ i)
-       if (!to_[i])
-         to_[i] = ' ';
-      for (size_t i = 0; i < from_.size(); ++ i)
-       if (!from_[i])
-         from_[i] = ' ';
-      MessageBox(NULL, to_.c_str(), from_.c_str(), MB_OK);
-    }
-#endif
-
-    SHFILEOPSTRUCT fo;
-    ::ZeroMemory(&fo, sizeof(fo));
-    fo.wFunc = FO_COPY;
-    fo.fFlags = FOF_MULTIDESTFILES;
-    fo.pFrom = from.c_str();
-    fo.pTo   = to.c_str();
-    if (SHFileOperation(&fo) || fo.fAnyOperationsAborted)
-      return false;
-    return true;
-  }
-  
-
-  // remove files from src
-  bool removeSrcFiles(const SetupFile::Data *i_setupFiles, 
-                     size_t i_setupFilesSize, u_int32 i_flags,
-                     const tstringi &i_srcDir)
-  {
-    tstringi destDriverDir = getDriverDirectory();
-
-    for (size_t i = 0; i < i_setupFilesSize; ++ i)
-    {
-      const SetupFile::Data &s = i_setupFiles[i_setupFilesSize - i - 1];
-      const tstringi &fromDir = i_srcDir;
-      
-      if (!s.m_from)
-       continue;       // remove only
-
-      if (!checkOs(s.m_os))    // check operating system
-       continue;
-      
-      if ((s.m_flags & i_flags) != i_flags)    // check flags
-       continue;
-
-      // type
-      switch (s.m_kind)
-      {
-       default:
-       case SetupFile::Dll:
-       case SetupFile::File:
-         DeleteFile((fromDir + _T('\\') + s.m_from).c_str());
-         break;
-       case SetupFile::Dir:
-         RemoveDirectory((fromDir + _T('\\') + s.m_from).c_str());
-         break;
-      }
-    }
-    RemoveDirectory(i_srcDir.c_str());
-    return true;
-  }
-
-  
-  // remove files
-  void removeFiles(const SetupFile::Data *i_setupFiles,
-                  size_t i_setupFilesSize, u_int32 i_flags,
-                  const tstringi &i_destDir)
-  {
-    tstringi destDriverDir = getDriverDirectory();
-
-    for (size_t i = 0; i < i_setupFilesSize; ++ i)
-    {
-      const SetupFile::Data &s = i_setupFiles[i_setupFilesSize - i - 1];
-      const tstringi &toDir =
-       (s.m_destination == SetupFile::ToDriver) ? destDriverDir : i_destDir;
-
-      if (!checkOs(s.m_os))    // check operating system
-       continue;
-
-      if ((s.m_flags & i_flags) != i_flags)    // check flags
-       continue;
-      
-      // type
-      switch (s.m_kind)
-      {
-       case SetupFile::Dll:
-         DeleteFile((toDir + _T("\\deleted.") + s.m_to).c_str());
-         // fall through
-       default:
-       case SetupFile::File:
-         DeleteFile((toDir + _T('\\') + s.m_to).c_str());
-         break;
-       case SetupFile::Dir:
-         RemoveDirectory((toDir + _T('\\') + s.m_to).c_str());
-         break;
-      }
-    }
-    RemoveDirectory(i_destDir.c_str());
-  }
-  
-  
-  // uninstall step1
-  int uninstallStep1(const _TCHAR *i_uninstallOption)
-  {
-    // copy this EXEcutable image into the user's temp directory
-    _TCHAR setup_exe[GANA_MAX_PATH], tmp_setup_exe[GANA_MAX_PATH];
-    GetModuleFileName(NULL, setup_exe, NUMBER_OF(setup_exe));
-    GetTempPath(NUMBER_OF(tmp_setup_exe), tmp_setup_exe);
-    GetTempFileName(tmp_setup_exe, _T("del"), 0, tmp_setup_exe);
-    CopyFile(setup_exe, tmp_setup_exe, FALSE);
-    
-    // open the clone EXE using FILE_FLAG_DELETE_ON_CLOSE
-    HANDLE hfile = CreateFile(tmp_setup_exe, 0, FILE_SHARE_READ, NULL,
-                             OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL);
-    
-    // spawn the clone EXE passing it our EXE's process handle
-    // and the full path name to the original EXE file.
-    _TCHAR commandLine[512];
-    HANDLE hProcessOrig =
-      OpenProcess(SYNCHRONIZE, TRUE, GetCurrentProcessId());
-    _sntprintf(commandLine, NUMBER_OF(commandLine), _T("%s %s %d"),
-              tmp_setup_exe, i_uninstallOption, hProcessOrig);
-    STARTUPINFO si;
-    ::ZeroMemory(&si, sizeof(si));
-    si.cb = sizeof(si);
-    PROCESS_INFORMATION pi;
-    CreateProcess(NULL, commandLine, NULL, NULL, TRUE, 0, NULL, NULL, &si,&pi);
-    Sleep(2000); // important
-    CloseHandle(hProcessOrig);
-    CloseHandle(hfile);
-    
-    return 0;
-  }
-
-  // uninstall step2
-  // (after this function, we cannot use any resource)
-  void uninstallStep2(const _TCHAR *argByStep1)
-  {
-    // clone EXE: When original EXE terminates, delete it
-    HANDLE hProcessOrig = (HANDLE)_ttoi(argByStep1);
-    WaitForSingleObject(hProcessOrig, INFINITE);
-    CloseHandle(hProcessOrig);
-  }
-  
-  
-  /////////////////////////////////////////////////////////////////////////////
-  // Locale / StringResource
-
-
-  // constructor
-  Resource::Resource(const StringResource *i_stringResources)
-    : m_stringResources(i_stringResources),
-      m_locale(LOCALE_C)
-  {
-    struct LocaleInformaton
-    {
-      const _TCHAR *m_localeString;
-      Locale m_locale;
-    };
-
-    // set locale information
-    const _TCHAR *localeString = ::_tsetlocale(LC_ALL, _T(""));
-    
-    static const LocaleInformaton locales[] =
-    {
-      { _T("Japanese_Japan.932"), LOCALE_Japanese_Japan_932 },
-    };
-
-    for (size_t i = 0; i < NUMBER_OF(locales); ++ i)
-      if (_tcsicmp(localeString, locales[i].m_localeString) == 0)
-      {
-       m_locale = locales[i].m_locale;
-       break;
-      }
-  }
-  
-  
-  // get resource string
-  const _TCHAR *Resource::loadString(UINT i_id)
-  {
-    int n = static_cast<int>(m_locale);
-    int index = -1;
-    for (int i = 0; m_stringResources[i].m_str; ++ i)
-      if (m_stringResources[i].m_id == i_id)
-      {
-       if (n == 0)
-         return m_stringResources[i].m_str;
-       index = i;
-       n --;
-      }
-    if (0 <= index)
-      return m_stringResources[index].m_str;
-    else
-      return _T("");
-  }
-}
+///////////////////////////////////////////////////////////////////////////////\r
+// setup.cpp\r
+\r
+\r
+#include "../misc.h"\r
+#include "../registry.h"\r
+#include "../stringtool.h"\r
+#include "../windowstool.h"\r
+#include "installer.h"\r
+\r
+#include <shlobj.h>\r
+#include <sys/types.h>\r
+#include <sys/stat.h>\r
+\r
+\r
+namespace Installer\r
+{\r
+  using namespace std;\r
+  \r
+  \r
+  /////////////////////////////////////////////////////////////////////////////\r
+  // Utility Functions\r
+\r
+  /** createLink\r
+               uses the shell's IShellLink and IPersistFile interfaces to\r
+               create and store a shortcut to the specified object.\r
+      @return\r
+               the result of calling the member functions of the interfaces.\r
+      @param i_pathObj\r
+               address of a buffer containing the path of the object.\r
+      @param i_pathLink\r
+               address of a buffer containing the path where the\r
+               shell link is to be stored.\r
+      @param i_desc\r
+               address of a buffer containing the description of the\r
+               shell link.\r
+  */\r
+  HRESULT createLink(LPCTSTR i_pathObj, LPCTSTR i_pathLink, LPCTSTR i_desc,\r
+                    LPCTSTR i_workingDirectory)\r
+  { \r
+    // Get a pointer to the IShellLink interface. \r
+    IShellLink* psl;\r
+    HRESULT hres =\r
+      CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,\r
+                      IID_IShellLink, (void **)&psl);\r
+    if (SUCCEEDED(hres))\r
+    { \r
+      // Set the path to the shortcut target and add the description. \r
+      psl->SetPath(i_pathObj);\r
+      psl->SetDescription(i_desc);\r
+      if (i_workingDirectory)\r
+       psl->SetWorkingDirectory(i_workingDirectory);\r
\r
+      // Query IShellLink for the IPersistFile interface for saving the \r
+      // shortcut in persistent storage. \r
+      IPersistFile* ppf; \r
+      hres = psl->QueryInterface(IID_IPersistFile, (void **)&ppf);\r
\r
+      if (SUCCEEDED(hres))\r
+      {\r
+#ifdef UNICODE\r
+       // Save the link by calling IPersistFile::Save. \r
+       hres = ppf->Save(i_pathLink, TRUE); \r
+#else\r
+       wchar_t wsz[MAX_PATH];\r
+       // Ensure that the string is ANSI. \r
+       MultiByteToWideChar(CP_ACP, 0, i_pathLink, -1, wsz, MAX_PATH);\r
+       // Save the link by calling IPersistFile::Save. \r
+       hres = ppf->Save(wsz, TRUE); \r
+#endif\r
+       ppf->Release();\r
+      }\r
+      psl->Release();\r
+    } \r
+    return hres; \r
+  }\r
+\r
+\r
+  // create file extension information\r
+  void createFileExtension(const tstringi &i_ext, const tstring &i_contentType,\r
+                          const tstringi &i_fileType,\r
+                          const tstring &i_fileTypeName,\r
+                          const tstringi &i_iconPath,\r
+                          const tstring &i_command)\r
+  {\r
+    tstring dummy;\r
+\r
+    Registry regExt(HKEY_CLASSES_ROOT, i_ext);\r
+    if (!         regExt.read (_T(""), &dummy))\r
+      CHECK_TRUE( regExt.write(_T(""), i_fileType) );\r
+    if (!         regExt.read (_T("Content Type"), &dummy))\r
+      CHECK_TRUE( regExt.write(_T("Content Type"), i_contentType) );\r
+\r
+    Registry      regFileType(HKEY_CLASSES_ROOT, i_fileType);\r
+    if (!         regFileType.read (_T(""), &dummy))\r
+      CHECK_TRUE( regFileType.write(_T(""), i_fileTypeName) );\r
+\r
+    Registry      regFileTypeIcon(HKEY_CLASSES_ROOT,\r
+                                 i_fileType + _T("\\DefaultIcon"));\r
+    if (!         regFileTypeIcon.read (_T(""), &dummy))\r
+      CHECK_TRUE( regFileTypeIcon.write(_T(""), i_iconPath) );\r
+\r
+    Registry      regFileTypeComand(HKEY_CLASSES_ROOT,\r
+                                   i_fileType + _T("\\shell\\open\\command"));\r
+    if (!         regFileTypeComand.read (_T(""), &dummy))\r
+      CHECK_TRUE( regFileTypeComand.write(_T(""), i_command) );\r
+  }\r
+\r
+\r
+  // remove file extension information\r
+  void removeFileExtension(const tstringi &i_ext, const tstringi &i_fileType)\r
+  {\r
+    Registry::remove(HKEY_CLASSES_ROOT, i_ext);\r
+    Registry::remove(HKEY_CLASSES_ROOT,\r
+                    i_fileType + _T("\\shell\\open\\command"));\r
+    Registry::remove(HKEY_CLASSES_ROOT, i_fileType + _T("\\shell\\open"));\r
+    Registry::remove(HKEY_CLASSES_ROOT, i_fileType + _T("\\shell"));\r
+    Registry::remove(HKEY_CLASSES_ROOT, i_fileType);\r
+  }\r
+\r
+  \r
+  // create uninstallation information\r
+  void createUninstallInformation(const tstringi &i_name,\r
+                                 const tstring &i_displayName,\r
+                                 const tstring &i_commandLine)\r
+  {\r
+    Registry reg(\r
+      HKEY_LOCAL_MACHINE,\r
+      _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\")\r
+      + i_name);\r
+\r
+    CHECK_TRUE( reg.write(_T("DisplayName"), i_displayName) );\r
+    CHECK_TRUE( reg.write(_T("UninstallString"), i_commandLine) );\r
+  }\r
+\r
+  \r
+  // remove uninstallation information\r
+  void removeUninstallInformation(const tstringi &i_name)\r
+  {\r
+    Registry::\r
+      remove(HKEY_LOCAL_MACHINE,\r
+            _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\")\r
+            + i_name);\r
+  }\r
+  \r
+  \r
+  // normalize path\r
+  tstringi normalizePath(tstringi i_path)\r
+  {\r
+    tregex regSlash(_T("^(.*)/(.*)$"));\r
+    tsmatch what;\r
+    while (boost::regex_search(i_path, what, regSlash))\r
+      i_path = what.str(1) + _T("\\") + what.str(2);\r
+\r
+    tregex regTailBackSlash(_T("^(.*)\\\\$"));\r
+    while (boost::regex_search(i_path, what, regTailBackSlash))\r
+      i_path = what.str(1);\r
+    \r
+    return i_path;\r
+  }\r
+  \r
+  \r
+  // create deep directory\r
+  bool createDirectories(const _TCHAR *i_folder)\r
+  {\r
+    const _TCHAR *s = _tcschr(i_folder, _T('\\')); // TODO: '/'\r
+    if (s && s - i_folder == 2 && i_folder[1] == _T(':'))\r
+      s = _tcschr(s + 1, _T('\\'));\r
+    \r
+    struct _stat sbuf;\r
+    while (s)\r
+    {\r
+      tstringi f(i_folder, 0, s - i_folder);\r
+      if (_tstat(f.c_str(), &sbuf) < 0)\r
+       if (!CreateDirectory(f.c_str(), NULL))\r
+         return false;\r
+      s = _tcschr(s + 1, _T('\\'));\r
+    }\r
+    if (_tstat(i_folder, &sbuf) < 0)\r
+      if (!CreateDirectory(i_folder, NULL))\r
+       return false;\r
+    return true;\r
+  }\r
+\r
+\r
+  // get driver directory\r
+  tstringi getDriverDirectory()\r
+  {\r
+    _TCHAR buf[GANA_MAX_PATH];\r
+    CHECK_TRUE( GetSystemDirectory(buf, NUMBER_OF(buf)) );\r
+    return tstringi(buf) + _T("\\drivers");\r
+  }\r
+\r
+  \r
+  // get current directory\r
+  tstringi getModuleDirectory()\r
+  {\r
+    _TCHAR buf[GANA_MAX_PATH];\r
+    CHECK_TRUE( GetModuleFileName(g_hInst, buf, NUMBER_OF(buf)) );\r
+    tregex reg(_T("^(.*)\\\\[^\\\\]*$"));\r
+    tsmatch what;\r
+    tstringi path(buf);\r
+    if (boost::regex_search(path, what, reg))\r
+      return what.str(1);\r
+    else\r
+      return path;\r
+  }\r
+\r
+\r
+  // get start menu name\r
+  tstringi getStartMenuName(const tstringi &i_shortcutName)\r
+  {\r
+#if 0\r
+    char programDir[GANA_MAX_PATH];\r
+    if (SUCCEEDED(SHGetSpecialFolderPath(NULL, programDir,\r
+                                        CSIDL_COMMON_PROGRAMS, FALSE)))\r
+      return tstringi(programDir) + "\\" + shortcutName + ".lnk";\r
+#else\r
+    tstringi programDir;\r
+    if (Registry::read(HKEY_LOCAL_MACHINE,\r
+                      _T("Software\\Microsoft\\Windows\\CurrentVersion\\")\r
+                      _T("Explorer\\Shell Folders"), _T("Common Programs"),\r
+                      &programDir))\r
+      return programDir + _T("\\") + i_shortcutName + _T(".lnk");\r
+#endif\r
+    return _T("");\r
+  }\r
+\r
+\r
+  // get start up name\r
+  tstringi getStartUpName(const tstringi &i_shortcutName)\r
+  {\r
+    tstringi startupDir;\r
+    if (Registry::read(HKEY_CURRENT_USER,\r
+                      _T("Software\\Microsoft\\Windows\\CurrentVersion\\")\r
+                      _T("Explorer\\Shell Folders"), _T("Startup"),\r
+                      &startupDir))\r
+      return startupDir + _T("\\") + i_shortcutName + _T(".lnk");\r
+    return _T("");\r
+  }\r
+\r
+\r
+#if defined(_WINNT)\r
+\r
+#  define MAYUD_FILTER_KEY _T("System\\CurrentControlSet\\Control\\Class\\{4D36E96B-E325-11CE-BFC1-08002BE10318}")\r
+\r
+  // create driver service\r
+  DWORD createDriverService(const tstringi &i_serviceName,\r
+                           const tstring &i_serviceDescription,\r
+                           const tstringi &i_driverPath,\r
+                           const _TCHAR *i_preloadedGroups,\r
+                           bool forUsb)\r
+  {\r
+    SC_HANDLE hscm =\r
+      OpenSCManager(NULL, NULL,\r
+                   SC_MANAGER_CREATE_SERVICE | SC_MANAGER_CONNECT);\r
+    if (!hscm)\r
+      return false;\r
+\r
+    SC_HANDLE hs =\r
+      CreateService(hscm, i_serviceName.c_str(), i_serviceDescription.c_str(),\r
+                   SERVICE_START | SERVICE_STOP, SERVICE_KERNEL_DRIVER,\r
+                   forUsb == true ? SERVICE_DEMAND_START : SERVICE_AUTO_START,\r
+                   SERVICE_ERROR_IGNORE,\r
+                   i_driverPath.c_str(), NULL, NULL,\r
+                   i_preloadedGroups, NULL, NULL);\r
+    DWORD err = GetLastError();\r
+    if (hs == NULL)\r
+    {\r
+      switch (err)\r
+      {\r
+       case ERROR_SERVICE_EXISTS:\r
+       {\r
+#if 0\r
+         hs = OpenService(hscm, i_serviceName.c_str(), SERVICE_CHANGE_CONFIG);\r
+         if (hs == NULL) {\r
+           CloseServiceHandle(hscm);\r
+           return GetLastError();\r
+         }\r
+         if (!ChangeServiceConfig(\r
+               hscm, SERVICE_KERNEL_DRIVER,\r
+               forUsb == true ? SERVICE_DEMAND_START : SERVICE_AUTO_START,\r
+               SERVICE_ERROR_IGNORE,\r
+               i_driverPath.c_str(), NULL, NULL,\r
+               i_preloadedGroups, NULL, NULL,\r
+               i_serviceDescription.c_str())) {\r
+           CloseServiceHandle(hs);\r
+           CloseServiceHandle(hscm);\r
+           return GetLastError();              // ERROR_IO_PENDING!\r
+           // this code always reaches here. why?\r
+         }\r
+#else\r
+         Registry reg(HKEY_LOCAL_MACHINE,\r
+                      _T("SYSTEM\\CurrentControlSet\\Services\\mayud"));\r
+         reg.write(_T("Start"),\r
+                   forUsb ? SERVICE_DEMAND_START : SERVICE_AUTO_START);\r
+#endif\r
+         break;\r
+       }\r
+       default:\r
+       {\r
+         CloseServiceHandle(hscm);\r
+         return err;\r
+       }\r
+      }\r
+    }\r
+    CloseServiceHandle(hs);\r
+    CloseServiceHandle(hscm);\r
+\r
+    if (forUsb == true) {\r
+      Registry reg(HKEY_LOCAL_MACHINE, MAYUD_FILTER_KEY);\r
+      typedef std::list<tstring> Filters;\r
+      Filters filters;\r
+      if (!reg.read(_T("UpperFilters"), &filters))\r
+       return false;\r
+      for (Filters::iterator i = filters.begin(); i != filters.end(); ) {\r
+         Filters::iterator next = i;\r
+         ++ next;\r
+         if (*i == _T("mayud")) {\r
+             filters.erase(i);\r
+         }\r
+         i = next;\r
+      }\r
+      filters.push_back(_T("mayud"));\r
+      if (!reg.write(_T("UpperFilters"), filters))\r
+       return false;\r
+    }\r
+\r
+    return ERROR_SUCCESS;\r
+  }\r
+#endif // _WINNT\r
+\r
+\r
+#if defined(_WINNT)\r
+  // remove driver service\r
+  DWORD removeDriverService(const tstringi &i_serviceName)\r
+  {\r
+    DWORD err = ERROR_SUCCESS;\r
+    \r
+    Registry reg(HKEY_LOCAL_MACHINE, MAYUD_FILTER_KEY);\r
+    std::list<tstring> filters;\r
+    if (reg.read(_T("UpperFilters"), &filters))\r
+    {\r
+      filters.remove(_T("mayud"));\r
+      reg.write(_T("UpperFilters"), filters);\r
+    }\r
+\r
+    SC_HANDLE hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);\r
+    SC_HANDLE hs =\r
+      OpenService(hscm, i_serviceName.c_str(),\r
+                 SERVICE_START | SERVICE_STOP | DELETE);\r
+    if (!hs)\r
+    {\r
+      err = GetLastError();\r
+      goto error;\r
+    }\r
+\r
+    SERVICE_STATUS ss;\r
+    ControlService(hs, SERVICE_CONTROL_STOP, &ss);\r
+  \r
+    if (!DeleteService(hs))\r
+    {\r
+      err = GetLastError();\r
+      goto error;\r
+    }\r
+    error:\r
+    CloseServiceHandle(hs);\r
+    CloseServiceHandle(hscm);\r
+    return err;\r
+  }\r
+#endif // _WINNT\r
+\r
+\r
+  // check operating system\r
+  bool checkOs(SetupFile::OS os)\r
+  {\r
+    OSVERSIONINFO ver;\r
+    ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);\r
+    GetVersionEx(&ver);\r
+    \r
+    switch (os)\r
+    {\r
+      default:\r
+      case SetupFile::ALL:\r
+       return true;\r
+      case SetupFile::W9x:\r
+       return (ver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS &&\r
+               4 <= ver.dwMajorVersion);\r
+      case SetupFile::NT :\r
+       return (ver.dwPlatformId == VER_PLATFORM_WIN32_NT &&\r
+               4 <= ver.dwMajorVersion);\r
+      case SetupFile::NT4:\r
+       return (ver.dwPlatformId == VER_PLATFORM_WIN32_NT &&\r
+               ver.dwMajorVersion == 4);\r
+      case SetupFile::W2k:                     // W2k, XP, ...\r
+       return (ver.dwPlatformId == VER_PLATFORM_WIN32_NT &&\r
+               5 <= ver.dwMajorVersion);\r
+    }\r
+  }\r
+\r
+  \r
+  // install files\r
+  bool installFiles(const SetupFile::Data *i_setupFiles,\r
+                   size_t i_setupFilesSize, u_int32 i_flags,\r
+                   const tstringi &i_srcDir, const tstringi &i_destDir)\r
+  {\r
+    tstringi to, from;\r
+    tstringi destDriverDir = getDriverDirectory();\r
+\r
+    for (size_t i = 0; i < i_setupFilesSize; ++ i)\r
+    {\r
+      const SetupFile::Data &s = i_setupFiles[i];\r
+      const tstringi &fromDir = i_srcDir;\r
+      const tstringi &toDir =\r
+       (s.m_destination == SetupFile::ToDriver) ? destDriverDir : i_destDir;\r
+\r
+      if (!s.m_from)\r
+       continue;                               // remove only\r
+\r
+      if (fromDir == toDir)\r
+       continue;                               // same directory\r
+\r
+      if (!checkOs(s.m_os))                    // check operating system\r
+       continue;\r
+\r
+      if ((s.m_flags & i_flags) != i_flags)    // check flags\r
+       continue;\r
+      \r
+      // type\r
+      switch (s.m_kind)\r
+      {\r
+       case SetupFile::Dll:\r
+       {\r
+         // rename driver\r
+         tstringi from_ = toDir + _T("\\") + s.m_to;\r
+         tstringi to_ = toDir + _T("\\deleted.") + s.m_to;\r
+         DeleteFile(to_.c_str());\r
+         MoveFile(from_.c_str(), to_.c_str());\r
+         DeleteFile(to_.c_str());\r
+       }\r
+       // fall through\r
+       default:\r
+       case SetupFile::File:\r
+       {\r
+         from += fromDir + _T('\\') + s.m_from + _T('\0');\r
+         to   += toDir   + _T('\\') + s.m_to   + _T('\0');\r
+         break;\r
+       }\r
+       case SetupFile::Dir:\r
+       {\r
+         createDirectories((toDir + _T('\\') + s.m_to).c_str());\r
+         break;\r
+       }\r
+      }\r
+    }\r
+#if 0\r
+    {\r
+      tstringi to_(to), from_(from);\r
+      for (size_t i = 0; i < to_.size(); ++ i)\r
+       if (!to_[i])\r
+         to_[i] = ' ';\r
+      for (size_t i = 0; i < from_.size(); ++ i)\r
+       if (!from_[i])\r
+         from_[i] = ' ';\r
+      MessageBox(NULL, to_.c_str(), from_.c_str(), MB_OK);\r
+    }\r
+#endif\r
+\r
+    SHFILEOPSTRUCT fo;\r
+    ::ZeroMemory(&fo, sizeof(fo));\r
+    fo.wFunc = FO_COPY;\r
+    fo.fFlags = FOF_MULTIDESTFILES;\r
+    fo.pFrom = from.c_str();\r
+    fo.pTo   = to.c_str();\r
+    if (SHFileOperation(&fo) || fo.fAnyOperationsAborted)\r
+      return false;\r
+    return true;\r
+  }\r
+  \r
+\r
+  // remove files from src\r
+  bool removeSrcFiles(const SetupFile::Data *i_setupFiles, \r
+                     size_t i_setupFilesSize, u_int32 i_flags,\r
+                     const tstringi &i_srcDir)\r
+  {\r
+    tstringi destDriverDir = getDriverDirectory();\r
+\r
+    for (size_t i = 0; i < i_setupFilesSize; ++ i)\r
+    {\r
+      const SetupFile::Data &s = i_setupFiles[i_setupFilesSize - i - 1];\r
+      const tstringi &fromDir = i_srcDir;\r
+      \r
+      if (!s.m_from)\r
+       continue;       // remove only\r
+\r
+      if (!checkOs(s.m_os))    // check operating system\r
+       continue;\r
+      \r
+      if ((s.m_flags & i_flags) != i_flags)    // check flags\r
+       continue;\r
+\r
+      // type\r
+      switch (s.m_kind)\r
+      {\r
+       default:\r
+       case SetupFile::Dll:\r
+       case SetupFile::File:\r
+         DeleteFile((fromDir + _T('\\') + s.m_from).c_str());\r
+         break;\r
+       case SetupFile::Dir:\r
+         RemoveDirectory((fromDir + _T('\\') + s.m_from).c_str());\r
+         break;\r
+      }\r
+    }\r
+    RemoveDirectory(i_srcDir.c_str());\r
+    return true;\r
+  }\r
+\r
+  \r
+  // remove files\r
+  void removeFiles(const SetupFile::Data *i_setupFiles,\r
+                  size_t i_setupFilesSize, u_int32 i_flags,\r
+                  const tstringi &i_destDir)\r
+  {\r
+    tstringi destDriverDir = getDriverDirectory();\r
+\r
+    for (size_t i = 0; i < i_setupFilesSize; ++ i)\r
+    {\r
+      const SetupFile::Data &s = i_setupFiles[i_setupFilesSize - i - 1];\r
+      const tstringi &toDir =\r
+       (s.m_destination == SetupFile::ToDriver) ? destDriverDir : i_destDir;\r
+\r
+      if (!checkOs(s.m_os))    // check operating system\r
+       continue;\r
+\r
+      if ((s.m_flags & i_flags) != i_flags)    // check flags\r
+       continue;\r
+      \r
+      // type\r
+      switch (s.m_kind)\r
+      {\r
+       case SetupFile::Dll:\r
+         DeleteFile((toDir + _T("\\deleted.") + s.m_to).c_str());\r
+         // fall through\r
+       default:\r
+       case SetupFile::File:\r
+         DeleteFile((toDir + _T('\\') + s.m_to).c_str());\r
+         break;\r
+       case SetupFile::Dir:\r
+         RemoveDirectory((toDir + _T('\\') + s.m_to).c_str());\r
+         break;\r
+      }\r
+    }\r
+    RemoveDirectory(i_destDir.c_str());\r
+  }\r
+  \r
+  \r
+  // uninstall step1\r
+  int uninstallStep1(const _TCHAR *i_uninstallOption)\r
+  {\r
+    // copy this EXEcutable image into the user's temp directory\r
+    _TCHAR setup_exe[GANA_MAX_PATH], tmp_setup_exe[GANA_MAX_PATH];\r
+    GetModuleFileName(NULL, setup_exe, NUMBER_OF(setup_exe));\r
+    GetTempPath(NUMBER_OF(tmp_setup_exe), tmp_setup_exe);\r
+    GetTempFileName(tmp_setup_exe, _T("del"), 0, tmp_setup_exe);\r
+    CopyFile(setup_exe, tmp_setup_exe, FALSE);\r
+    \r
+    // open the clone EXE using FILE_FLAG_DELETE_ON_CLOSE\r
+    HANDLE hfile = CreateFile(tmp_setup_exe, 0, FILE_SHARE_READ, NULL,\r
+                             OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL);\r
+    \r
+    // spawn the clone EXE passing it our EXE's process handle\r
+    // and the full path name to the original EXE file.\r
+    _TCHAR commandLine[512];\r
+    HANDLE hProcessOrig =\r
+      OpenProcess(SYNCHRONIZE, TRUE, GetCurrentProcessId());\r
+    _sntprintf(commandLine, NUMBER_OF(commandLine), _T("%s %s %d"),\r
+              tmp_setup_exe, i_uninstallOption, hProcessOrig);\r
+    STARTUPINFO si;\r
+    ::ZeroMemory(&si, sizeof(si));\r
+    si.cb = sizeof(si);\r
+    PROCESS_INFORMATION pi;\r
+    CreateProcess(NULL, commandLine, NULL, NULL, TRUE, 0, NULL, NULL, &si,&pi);\r
+    Sleep(2000); // important\r
+    CloseHandle(hProcessOrig);\r
+    CloseHandle(hfile);\r
+    \r
+    return 0;\r
+  }\r
+\r
+  // uninstall step2\r
+  // (after this function, we cannot use any resource)\r
+  void uninstallStep2(const _TCHAR *argByStep1)\r
+  {\r
+    // clone EXE: When original EXE terminates, delete it\r
+    HANDLE hProcessOrig = (HANDLE)_ttoi(argByStep1);\r
+    WaitForSingleObject(hProcessOrig, INFINITE);\r
+    CloseHandle(hProcessOrig);\r
+  }\r
+  \r
+  \r
+  /////////////////////////////////////////////////////////////////////////////\r
+  // Locale / StringResource\r
+\r
+\r
+  // constructor\r
+  Resource::Resource(const StringResource *i_stringResources)\r
+    : m_stringResources(i_stringResources),\r
+      m_locale(LOCALE_C)\r
+  {\r
+    struct LocaleInformaton\r
+    {\r
+      const _TCHAR *m_localeString;\r
+      Locale m_locale;\r
+    };\r
+\r
+    // set locale information\r
+    const _TCHAR *localeString = ::_tsetlocale(LC_ALL, _T(""));\r
+    \r
+    static const LocaleInformaton locales[] =\r
+    {\r
+      { _T("Japanese_Japan.932"), LOCALE_Japanese_Japan_932 },\r
+    };\r
+\r
+    for (size_t i = 0; i < NUMBER_OF(locales); ++ i)\r
+      if (_tcsicmp(localeString, locales[i].m_localeString) == 0)\r
+      {\r
+       m_locale = locales[i].m_locale;\r
+       break;\r
+      }\r
+  }\r
+  \r
+  \r
+  // get resource string\r
+  const _TCHAR *Resource::loadString(UINT i_id)\r
+  {\r
+    int n = static_cast<int>(m_locale);\r
+    int index = -1;\r
+    for (int i = 0; m_stringResources[i].m_str; ++ i)\r
+      if (m_stringResources[i].m_id == i_id)\r
+      {\r
+       if (n == 0)\r
+         return m_stringResources[i].m_str;\r
+       index = i;\r
+       n --;\r
+      }\r
+    if (0 <= index)\r
+      return m_stringResources[index].m_str;\r
+    else\r
+      return _T("");\r
+  }\r
+}\r
index 753c2fe..5d48bb2 100644 (file)
-///////////////////////////////////////////////////////////////////////////////
-// installer.h
-
-
-#ifndef _INSTALLER_H
-#  define _INSTALLER_H
-
-
-namespace Installer
-{
-  /////////////////////////////////////////////////////////////////////////////
-  // SetupFile
-  
-  // files to copy
-  namespace SetupFile
-  {
-    enum Kind
-    {
-      File,
-      Dir,
-      Dll,
-    };
-    
-    enum OS
-    {
-      ALL,
-      W9x, // W95, W98,
-      NT,  NT4, W2k,                           // W2k includes XP
-    };
-    
-    enum Destination
-    {
-      ToDest,
-      ToDriver,
-    };
-
-    enum Flag
-    {
-      Normal = 1,
-    };
-    
-    struct Data
-    {
-      Kind m_kind;
-      OS m_os;
-      u_int32 m_flags;                         /// user defined flags
-      const _TCHAR *m_from;
-      Destination m_destination;
-      const _TCHAR *m_to;
-    };
-  }
-
-  
-  /////////////////////////////////////////////////////////////////////////////
-  // Locale / StringResource
-  
-  enum Locale
-  {
-    LOCALE_Japanese_Japan_932 = 0,
-    LOCALE_C = 1,
-  };
-
-  struct StringResource
-  {
-    UINT m_id;
-    _TCHAR *m_str;
-  };
-
-  class Resource
-  {
-    const StringResource *m_stringResources;
-    
-    Locale m_locale;
-    
-  public:
-    // constructor
-    Resource(const StringResource *i_stringResources);
-    Resource(const StringResource *i_stringResources, Locale i_locale)
-      : m_stringResources(i_stringResources), m_locale(i_locale) { }
-    
-    // get resource string
-    const _TCHAR *loadString(UINT i_id);
-
-    // locale
-    Locale getLocale() const { return m_locale; }
-  };
-
-  
-  /////////////////////////////////////////////////////////////////////////////
-  // Utility Functions
-
-  // createLink - uses the shell's IShellLink and IPersistFile interfaces 
-  //   to create and store a shortcut to the specified object. 
-  HRESULT createLink(LPCTSTR i_pathObj, LPCTSTR i_pathLink, LPCTSTR i_desc,
-                    LPCTSTR i_workingDirectory = NULL);
-  
-  // create file extension information
-  void createFileExtension(const tstringi &i_ext, const tstring &i_contentType,
-                          const tstringi &i_fileType,
-                          const tstring &i_fileTypeName,
-                          const tstringi &i_iconPath,
-                          const tstring &i_command);
-  
-  // remove file extension information
-  void removeFileExtension(const tstringi &i_ext, const tstringi &i_fileType);
-  
-  // create uninstallation information
-  void createUninstallInformation(const tstringi &i_name,
-                                 const tstring &i_displayName,
-                                 const tstring &i_commandLine);
-  
-  // remove uninstallation information
-  void removeUninstallInformation(const tstringi &i_name);
-
-  // normalize path
-  tstringi normalizePath(tstringi i_path);
-  
-  // create deep directory
-  bool createDirectories(const _TCHAR *i_folder);
-
-  // get driver directory
-  tstringi getDriverDirectory();
-
-  // get current directory
-  tstringi getModuleDirectory();
-
-  // get start menu name
-  tstringi getStartMenuName(const tstringi &i_shortcutName);
-
-  // get start up name
-  tstringi getStartUpName(const tstringi &i_shortcutName);
-
-  // create driver service
-  DWORD createDriverService(const tstringi &i_serviceName,
-                           const tstring &i_serviceDescription,
-                           const tstringi &i_driverPath,
-                           const _TCHAR *i_preloadedGroups,
-                           bool forUsb);
-
-  // remove driver service
-  DWORD removeDriverService(const tstringi &i_serviceName);
-
-  // check operating system
-  bool checkOs(SetupFile::OS i_os);
-  
-  // install files
-  bool installFiles(const SetupFile::Data *i_setupFiles,
-                   size_t i_setupFilesSize, u_int32 i_flags,
-                   const tstringi &i_srcDir, const tstringi &i_destDir);
-  
-  // remove files from src
-  bool removeSrcFiles(const SetupFile::Data *i_setupFiles,
-                     size_t i_setupFilesSize, u_int32 i_flags,
-                     const tstringi &i_srcDir);
-  
-  // remove files
-  void removeFiles(const SetupFile::Data *i_setupFiles,
-                  size_t i_setupFilesSize, u_int32 i_flags,
-                  const tstringi &i_destDir);
-  
-  // uninstall step1
-  int uninstallStep1(const _TCHAR *i_uninstallOption);
-  
-  // uninstall step2
-  // (after this function, we cannot use any resource)
-  void uninstallStep2(const _TCHAR *i_argByStep1);
-}
-
-
-#endif // _INSTALLER_H
+///////////////////////////////////////////////////////////////////////////////\r
+// installer.h\r
+\r
+\r
+#ifndef _INSTALLER_H\r
+#  define _INSTALLER_H\r
+\r
+\r
+namespace Installer\r
+{\r
+  /////////////////////////////////////////////////////////////////////////////\r
+  // SetupFile\r
+  \r
+  // files to copy\r
+  namespace SetupFile\r
+  {\r
+    enum Kind\r
+    {\r
+      File,\r
+      Dir,\r
+      Dll,\r
+    };\r
+    \r
+    enum OS\r
+    {\r
+      ALL,\r
+      W9x, // W95, W98,\r
+      NT,  NT4, W2k,                           // W2k includes XP\r
+    };\r
+    \r
+    enum Destination\r
+    {\r
+      ToDest,\r
+      ToDriver,\r
+    };\r
+\r
+    enum Flag\r
+    {\r
+      Normal = 1,\r
+    };\r
+    \r
+    struct Data\r
+    {\r
+      Kind m_kind;\r
+      OS m_os;\r
+      u_int32 m_flags;                         /// user defined flags\r
+      const _TCHAR *m_from;\r
+      Destination m_destination;\r
+      const _TCHAR *m_to;\r
+    };\r
+  }\r
+\r
+  \r
+  /////////////////////////////////////////////////////////////////////////////\r
+  // Locale / StringResource\r
+  \r
+  enum Locale\r
+  {\r
+    LOCALE_Japanese_Japan_932 = 0,\r
+    LOCALE_C = 1,\r
+  };\r
+\r
+  struct StringResource\r
+  {\r
+    UINT m_id;\r
+    _TCHAR *m_str;\r
+  };\r
+\r
+  class Resource\r
+  {\r
+    const StringResource *m_stringResources;\r
+    \r
+    Locale m_locale;\r
+    \r
+  public:\r
+    // constructor\r
+    Resource(const StringResource *i_stringResources);\r
+    Resource(const StringResource *i_stringResources, Locale i_locale)\r
+      : m_stringResources(i_stringResources), m_locale(i_locale) { }\r
+    \r
+    // get resource string\r
+    const _TCHAR *loadString(UINT i_id);\r
+\r
+    // locale\r
+    Locale getLocale() const { return m_locale; }\r
+  };\r
+\r
+  \r
+  /////////////////////////////////////////////////////////////////////////////\r
+  // Utility Functions\r
+\r
+  // createLink - uses the shell's IShellLink and IPersistFile interfaces \r
+  //   to create and store a shortcut to the specified object. \r
+  HRESULT createLink(LPCTSTR i_pathObj, LPCTSTR i_pathLink, LPCTSTR i_desc,\r
+                    LPCTSTR i_workingDirectory = NULL);\r
+  \r
+  // create file extension information\r
+  void createFileExtension(const tstringi &i_ext, const tstring &i_contentType,\r
+                          const tstringi &i_fileType,\r
+                          const tstring &i_fileTypeName,\r
+                          const tstringi &i_iconPath,\r
+                          const tstring &i_command);\r
+  \r
+  // remove file extension information\r
+  void removeFileExtension(const tstringi &i_ext, const tstringi &i_fileType);\r
+  \r
+  // create uninstallation information\r
+  void createUninstallInformation(const tstringi &i_name,\r
+                                 const tstring &i_displayName,\r
+                                 const tstring &i_commandLine);\r
+  \r
+  // remove uninstallation information\r
+  void removeUninstallInformation(const tstringi &i_name);\r
+\r
+  // normalize path\r
+  tstringi normalizePath(tstringi i_path);\r
+  \r
+  // create deep directory\r
+  bool createDirectories(const _TCHAR *i_folder);\r
+\r
+  // get driver directory\r
+  tstringi getDriverDirectory();\r
+\r
+  // get current directory\r
+  tstringi getModuleDirectory();\r
+\r
+  // get start menu name\r
+  tstringi getStartMenuName(const tstringi &i_shortcutName);\r
+\r
+  // get start up name\r
+  tstringi getStartUpName(const tstringi &i_shortcutName);\r
+\r
+  // create driver service\r
+  DWORD createDriverService(const tstringi &i_serviceName,\r
+                           const tstring &i_serviceDescription,\r
+                           const tstringi &i_driverPath,\r
+                           const _TCHAR *i_preloadedGroups,\r
+                           bool forUsb);\r
+\r
+  // remove driver service\r
+  DWORD removeDriverService(const tstringi &i_serviceName);\r
+\r
+  // check operating system\r
+  bool checkOs(SetupFile::OS i_os);\r
+  \r
+  // install files\r
+  bool installFiles(const SetupFile::Data *i_setupFiles,\r
+                   size_t i_setupFilesSize, u_int32 i_flags,\r
+                   const tstringi &i_srcDir, const tstringi &i_destDir);\r
+  \r
+  // remove files from src\r
+  bool removeSrcFiles(const SetupFile::Data *i_setupFiles,\r
+                     size_t i_setupFilesSize, u_int32 i_flags,\r
+                     const tstringi &i_srcDir);\r
+  \r
+  // remove files\r
+  void removeFiles(const SetupFile::Data *i_setupFiles,\r
+                  size_t i_setupFilesSize, u_int32 i_flags,\r
+                  const tstringi &i_destDir);\r
+  \r
+  // uninstall step1\r
+  int uninstallStep1(const _TCHAR *i_uninstallOption);\r
+  \r
+  // uninstall step2\r
+  // (after this function, we cannot use any resource)\r
+  void uninstallStep2(const _TCHAR *i_argByStep1);\r
+}\r
+\r
+\r
+#endif // _INSTALLER_H\r
index 53b4838..846bdec 100644 (file)
-///////////////////////////////////////////////////////////////////////////////
-// setup.cpp
-
-
-#include "../misc.h"
-#include "../registry.h"
-#include "../stringtool.h"
-#include "../windowstool.h"
-#include "../mayu.h"
-#include "setuprc.h"
-#include "installer.h"
-
-#include <windowsx.h>
-#include <shlobj.h>
-
-
-using namespace Installer;
-
-
-///////////////////////////////////////////////////////////////////////////////
-// Registry
-
-
-#define DIR_REGISTRY_ROOT                      \
-       HKEY_LOCAL_MACHINE,                     \
-       _T("Software\\GANAware\\mayu")
-
-
-///////////////////////////////////////////////////////////////////////////////
-// Globals
-
-
-enum
-{
-  Flag_Usb = 1 << 1,
-};
-u_int32 g_flags = SetupFile::Normal;
-
-
-using namespace SetupFile;
-const SetupFile::Data g_setupFiles[] =
-{
-  // same name
-#define SN(i_kind, i_os, i_from, i_destination)                        \
-  { i_kind, i_os, Normal|Flag_Usb, _T(i_from), i_destination, _T(i_from) }
-  // different name
-#define DN(i_kind, i_os, i_from, i_destination, i_to)  \
-  { i_kind, i_os, Normal|Flag_Usb, _T(i_from), i_destination, _T(i_to) }
-  
-  // executables
-  SN(Dll , ALL, "mayu.dll"          , ToDest),
-  SN(File, ALL, "mayu.exe"          , ToDest),
-  SN(File, ALL, "setup.exe"         , ToDest),
-                                   
-  // drivers
-#if defined(_WINNT)
-  SN(File, NT , "mayud.sys"         , ToDest),
-  SN(File, NT , "mayudnt4.sys"      , ToDest),
-  SN(File, W2k, "mayudrsc.sys"    , ToDest),
-  SN(File, W2k, "mayud.sys"         , ToDriver),
-  DN(File, NT4, "mayudnt4.sys"      , ToDriver, "mayud.sys"),
-  SN(File, W2k, "mayudrsc.sys"    , ToDriver),
-#elif defined(_WIN95)
-  SN(File, W9x, "mayud.vxd"         , ToDest),
-#else
-#  error
-#endif
-
-  // setting files                 
-  SN(File, ALL, "104.mayu"          , ToDest),
-  SN(File, ALL, "104on109.mayu"             , ToDest),
-  SN(File, ALL, "109.mayu"          , ToDest),
-  SN(File, ALL, "109on104.mayu"             , ToDest),
-  SN(File, ALL, "default.mayu"      , ToDest),
-  SN(File, ALL, "dot.mayu"          , ToDest),
-  SN(File, ALL, "emacsedit.mayu"     , ToDest),
-                                   
-  // documents                             
-  SN(Dir , ALL, "doc"               , ToDest), // mkdir
-  DN(File, ALL, "banner-ja.gif"             , ToDest, "doc\\banner-ja.gif"      ),
-  DN(File, ALL, "edit-setting-ja.png", ToDest, "doc\\edit-setting-ja.png"),
-  DN(File, ALL, "investigate-ja.png" , ToDest, "doc\\investigate-ja.png" ),
-  DN(File, ALL, "log-ja.png"        , ToDest, "doc\\log-ja.png"         ),
-  DN(File, ALL, "menu-ja.png"       , ToDest, "doc\\menu-ja.png"        ),
-  DN(File, ALL, "pause-ja.png"      , ToDest, "doc\\pause-ja.png"       ),
-  DN(File, ALL, "setting-ja.png"     , ToDest, "doc\\setting-ja.png"    ),
-  DN(File, ALL, "target.png"        , ToDest, "doc\\target.png"         ),
-  DN(File, ALL, "version-ja.png"     , ToDest, "doc\\version-ja.png"    ),
-  DN(File, ALL, "CONTENTS-ja.html"   , ToDest, "doc\\CONTENTS-ja.html"  ),
-  DN(File, ALL, "CUSTOMIZE-ja.html"  , ToDest, "doc\\CUSTOMIZE-ja.html"         ),
-  DN(File, ALL, "MANUAL-ja.html"     , ToDest, "doc\\MANUAL-ja.html"    ),
-  DN(File, ALL, "README-ja.html"     , ToDest, "doc\\README-ja.html"    ),
-  DN(File, ALL, "README.css"        , ToDest, "doc\\README.css"         ),
-  DN(File, ALL, "syntax.txt"        , ToDest, "doc\\syntax.txt"         ),
-  
-  SN(File, ALL, "mayu-mode.el"      , ToDest),
-                                   
-  SN(Dir , ALL, "contrib"           , ToDest), // mkdir
-  DN(File, ALL, "mayu-settings.txt"  , ToDest, "contrib\\mayu-settings.txt"),
-  DN(File, ALL, "dvorak.mayu"       , ToDest, "contrib\\dvorak.mayu"      ),
-  DN(File, ALL, "DVORAKon109.mayu"   , ToDest, "contrib\\DVORAKon109.mayu" ),
-  DN(File, ALL, "keitai.mayu"       , ToDest, "contrib\\keitai.mayu"      ),
-  DN(File, ALL, "ax.mayu"           , ToDest, "contrib\\ax.mayu"          ),
-  DN(File, ALL, "98x1.mayu"         , ToDest, "contrib\\98x1.mayu"        ),
-  DN(File, ALL, "109onAX.mayu"      , ToDest, "contrib\\109onAX.mayu"     ),
-
-  SN(Dir , ALL, "Plugins"           , ToDest), // mkdir
-};
-
-
-enum KeyboardKind
-{
-  KEYBOARD_KIND_109,
-  KEYBOARD_KIND_104,
-} g_keyboardKind;
-
-
-static const StringResource g_strres[] =
-{
-#include "strres.h"
-};
-
-
-bool g_wasExecutedBySFX = false;       // Was setup executed by cab32 SFX ?
-Resource *g_resource;                  // resource information
-tstringi g_destDir;                    // destination directory
-
-
-///////////////////////////////////////////////////////////////////////////////
-// functions
-
-
-// show message
-int message(int i_id, int i_flag, HWND i_hwnd = NULL)
-{
-  return MessageBox(i_hwnd, g_resource->loadString(i_id),
-                   g_resource->loadString(IDS_mayuSetup), i_flag);
-}
-
-
-// driver service error
-void driverServiceError(DWORD i_err)
-{
-  switch (i_err)
-  {
-    case ERROR_ACCESS_DENIED:
-      message(IDS_notAdministrator, MB_OK | MB_ICONSTOP);
-      break;
-    case ERROR_SERVICE_MARKED_FOR_DELETE:
-      message(IDS_alreadyUninstalled, MB_OK | MB_ICONSTOP);
-      break;
-    default:
-    {
-      TCHAR *errmsg;
-      int err = int(i_err);
-      if (err < 0) {
-       i_err = -err;
-      }
-      if (FormatMessage(
-           FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
-           NULL, i_err, 0, (LPTSTR)&errmsg, 0, NULL)) {
-       TCHAR buf[1024];
-       _sntprintf(buf, NUMBER_OF(buf), _T("%s: %d: %s\n"),
-                  g_resource->loadString(IDS_error),
-                  err, errmsg);
-       LocalFree(errmsg);
-       MessageBox(NULL, buf, g_resource->loadString(IDS_mayuSetup),
-                  MB_OK | MB_ICONSTOP);
-      } else {
-       message(IDS_error, MB_OK | MB_ICONSTOP);
-      }
-      break;
-    }
-  }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// dialogue
-
-
-// dialog box
-class DlgMain
-{
-  HWND m_hwnd;
-  bool m_doRegisterToStartMenu;        // if register to the start menu
-  bool m_doRegisterToStartUp;  // if register to the start up
-
-private:
-  // install
-  int install()
-  {
-    Registry reg(DIR_REGISTRY_ROOT);
-    CHECK_TRUE( reg.write(_T("dir"), g_destDir) );
-    tstringi srcDir = getModuleDirectory();
-
-    if (!installFiles(g_setupFiles, NUMBER_OF(g_setupFiles), g_flags, srcDir,
-                     g_destDir))
-    {
-      removeFiles(g_setupFiles, NUMBER_OF(g_setupFiles), g_flags, g_destDir);
-      if (g_wasExecutedBySFX)
-       removeSrcFiles(g_setupFiles, NUMBER_OF(g_setupFiles), g_flags, srcDir);
-      return 1;
-    }
-    if (g_wasExecutedBySFX)
-      removeSrcFiles(g_setupFiles, NUMBER_OF(g_setupFiles), g_flags, srcDir);
-
-#if defined(_WINNT)
-    DWORD err =
-      createDriverService(_T("mayud"),
-                         g_resource->loadString(IDS_mayud),
-                         getDriverDirectory() + _T("\\mayud.sys"),
-                         _T("+Keyboard Class\0"),
-                         g_flags & Flag_Usb ? true : false);
-
-    if (err != ERROR_SUCCESS)
-    {
-      driverServiceError(err);
-      removeFiles(g_setupFiles, NUMBER_OF(g_setupFiles), g_flags, g_destDir);
-      return 1;
-    }
-
-    if (g_flags == Flag_Usb)
-      CHECK_TRUE( reg.write(_T("isUsbDriver"), DWORD(1)) );
-#endif // _WINNT
-    
-    // create shortcut
-    if (m_doRegisterToStartMenu)
-    {
-      tstringi shortcut = getStartMenuName(loadString(IDS_shortcutName));
-      if (!shortcut.empty())
-       createLink((g_destDir + _T("\\mayu.exe")).c_str(), shortcut.c_str(),
-                  g_resource->loadString(IDS_shortcutName),
-                  g_destDir.c_str());
-    }
-    if (m_doRegisterToStartUp)
-    {
-      tstringi shortcut = getStartUpName(loadString(IDS_shortcutName));
-      if (!shortcut.empty())
-       createLink((g_destDir + _T("\\mayu.exe")).c_str(), shortcut.c_str(),
-                  g_resource->loadString(IDS_shortcutName),
-                  g_destDir.c_str());
-    }
-
-    // set registry
-    reg.write(_T("layout"),
-             (g_keyboardKind == KEYBOARD_KIND_109) ? _T("109") : _T("104"));
-
-    // file extension
-    createFileExtension(_T(".mayu"), _T("text/plain"),
-                       _T("mayu file"), g_resource->loadString(IDS_mayuFile),
-                       g_destDir + _T("\\mayu.exe,1"),
-                       g_resource->loadString(IDS_mayuShellOpen));
-    
-    // uninstall
-    createUninstallInformation(_T("mayu"), g_resource->loadString(IDS_mayu),
-                              g_destDir + _T("\\setup.exe -u"));
-
-    if (g_flags == Flag_Usb)
-    {
-      if (message(IDS_copyFinishUsb, MB_YESNO | MB_ICONQUESTION, m_hwnd)
-         == IDYES)
-      {
-       // reboot ...
-       HANDLE hToken; 
-       // Get a token for this process. 
-       if (!OpenProcessToken(GetCurrentProcess(), 
-                             TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
-       {
-         message(IDS_failedToReboot, MB_OK | MB_ICONSTOP);
-         return 0;
-       }
-       // Get the LUID for the shutdown privilege.
-       TOKEN_PRIVILEGES tkp;
-       LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
-       tkp.PrivilegeCount = 1;  // one privilege to set
-       tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
-       // Get the shutdown privilege for this process. 
-       AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
-                             (PTOKEN_PRIVILEGES)NULL, 0);
-       // Cannot test the return value of AdjustTokenPrivileges. 
-       if (GetLastError() != ERROR_SUCCESS)
-       {
-         message(IDS_failedToReboot, MB_OK | MB_ICONSTOP);
-         return 0;
-       }
-       // Shut down the system and force all applications to close. 
-       if (!ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
-       {
-         message(IDS_failedToReboot, MB_OK | MB_ICONSTOP);
-         return 0;
-       }
-      }
-    }
-    else
-    {
-      if (message(IDS_copyFinish, MB_YESNO | MB_ICONQUESTION, m_hwnd)
-         == IDYES)
-       ExitWindows(0, 0);                      // logoff
-    }
-    return 0;
-  }
-  
-private:
-  // WM_INITDIALOG
-  BOOL wmInitDialog(HWND /* focus */, LPARAM /* lParam */)
-  {
-    setSmallIcon(m_hwnd, IDI_ICON_mayu);
-    setBigIcon(m_hwnd, IDI_ICON_mayu);
-    Edit_SetText(GetDlgItem(m_hwnd, IDC_EDIT_path), g_destDir.c_str());
-    HWND hwndCombo = GetDlgItem(m_hwnd, IDC_COMBO_keyboard);
-#if 0
-    if (checkOs(SetupFile::W2k))
-#endif
-    {
-      ComboBox_AddString(hwndCombo,
-                        g_resource->loadString(IDS_keyboard109usb));
-      ComboBox_AddString(hwndCombo,
-                        g_resource->loadString(IDS_keyboard104usb));
-    }
-#if 0
-    ComboBox_AddString(hwndCombo, g_resource->loadString(IDS_keyboard109));
-    ComboBox_AddString(hwndCombo, g_resource->loadString(IDS_keyboard104));
-#endif
-    ComboBox_SetCurSel(hwndCombo,
-                      (g_keyboardKind == KEYBOARD_KIND_109) ? 0 : 1);
-    tstring note;
-    for (int i = IDS_note01; i <= IDS_note13; ++ i) {
-      note += g_resource->loadString(i);
-    }
-    Edit_SetText(GetDlgItem(m_hwnd, IDC_EDIT_note), note.c_str());
-    return TRUE;
-  }
-  
-  // WM_CLOSE
-  BOOL wmClose()
-  {
-    EndDialog(m_hwnd, 0);
-    return TRUE;
-  }
-  
-  // WM_COMMAND
-  BOOL wmCommand(int /* notify_code */, int i_id, HWND /* hwnd_control */)
-  {
-    switch (i_id)
-    {
-      case IDC_BUTTON_browse:
-      {
-       _TCHAR folder[GANA_MAX_PATH];
-       
-       BROWSEINFO bi;
-       ZeroMemory(&bi, sizeof(bi));
-       bi.hwndOwner      = m_hwnd;
-       bi.pidlRoot       = NULL;
-       bi.pszDisplayName = folder;
-       bi.lpszTitle      = g_resource->loadString(IDS_selectDir);
-       ITEMIDLIST *browse = SHBrowseForFolder(&bi);
-       if (browse != NULL)
-       {
-         if (SHGetPathFromIDList(browse, folder))
-         {
-           if (createDirectories(folder))
-             Edit_SetText(GetDlgItem(m_hwnd, IDC_EDIT_path), folder);
-         }
-         IMalloc *imalloc = NULL;
-         if (SHGetMalloc(&imalloc) == NOERROR)
-           imalloc->Free((void *)browse);
-       }
-       return TRUE;
-      }
-      
-      case IDOK:
-      {
-       _TCHAR buf[GANA_MAX_PATH];
-       Edit_GetText(GetDlgItem(m_hwnd, IDC_EDIT_path), buf, NUMBER_OF(buf));
-       if (buf[0])
-       {
-         g_destDir = normalizePath(buf);
-         m_doRegisterToStartMenu =
-           (IsDlgButtonChecked(m_hwnd, IDC_CHECK_registerStartMenu) ==
-            BST_CHECKED);
-         m_doRegisterToStartUp =
-           (IsDlgButtonChecked(m_hwnd, IDC_CHECK_registerStartUp) ==
-            BST_CHECKED);
-
-         int curSel =
-           ComboBox_GetCurSel(GetDlgItem(m_hwnd, IDC_COMBO_keyboard));
-         g_flags = SetupFile::Normal;
-#if 0
-         if (checkOs(SetupFile::W2k))
-#endif
-         {
-           switch (curSel)
-           {
-             case 0:
-               g_keyboardKind = KEYBOARD_KIND_109;
-               g_flags = Flag_Usb;
-               break;
-             case 1:
-               g_keyboardKind = KEYBOARD_KIND_104;
-               g_flags = Flag_Usb;
-               break;
-#if 0
-             case 2: g_keyboardKind = KEYBOARD_KIND_109; break;
-             case 3: g_keyboardKind = KEYBOARD_KIND_104; break;
-#endif
-           };
-         }
-#if 0
-         else
-         {
-           switch (curSel)
-           {
-             case 0: g_keyboardKind = KEYBOARD_KIND_109; break;
-             case 1: g_keyboardKind = KEYBOARD_KIND_104; break;
-           };
-         }
-#endif
-
-#if 0
-         if (g_flags == Flag_Usb)
-           if (message(IDS_usbWarning, MB_OKCANCEL | MB_ICONWARNING, m_hwnd)
-               == IDCANCEL)
-             return TRUE;
-#endif
-         
-         if (createDirectories(g_destDir.c_str()))
-           EndDialog(m_hwnd, install());
-         else
-           message(IDS_invalidDirectory, MB_OK | MB_ICONSTOP, m_hwnd);
-       }
-       else
-         message(IDS_mayuEmpty, MB_OK, m_hwnd);
-       return TRUE;
-      }
-      
-      case IDCANCEL:
-      {
-       CHECK_TRUE( EndDialog(m_hwnd, 0) );
-       return TRUE;
-      }
-    }
-    return FALSE;
-  }
-
-public:
-  DlgMain(HWND i_hwnd)
-    : m_hwnd(i_hwnd),
-      m_doRegisterToStartMenu(false),
-      m_doRegisterToStartUp(false)
-  {
-  }
-
-  static BOOL CALLBACK dlgProc(HWND i_hwnd, UINT i_message,
-                              WPARAM i_wParam, LPARAM i_lParam)
-  {
-    DlgMain *wc;
-    getUserData(i_hwnd, &wc);
-    if (!wc)
-      switch (i_message)
-      {
-       case WM_INITDIALOG:
-         wc = setUserData(i_hwnd, new DlgMain(i_hwnd));
-         return wc->wmInitDialog(reinterpret_cast<HWND>(i_wParam), i_lParam);
-      }
-    else
-      switch (i_message)
-      {
-       case WM_COMMAND:
-         return wc->wmCommand(HIWORD(i_wParam), LOWORD(i_wParam),
-                              reinterpret_cast<HWND>(i_lParam));
-       case WM_CLOSE:
-         return wc->wmClose();
-       case WM_NCDESTROY:
-         delete wc;
-         return TRUE;
-      }
-    return FALSE;
-  }
-};
-
-
-// uninstall
-// (in this function, we cannot use any resource, so we use strres[])
-int uninstall()
-{
-  if (IDYES != message(IDS_removeOk, MB_YESNO | MB_ICONQUESTION))
-    return 1;
-
-#if defined(_WINNT)
-  DWORD err = removeDriverService(_T("mayud"));
-  if (err != ERROR_SUCCESS)
-  {
-    driverServiceError(err);
-    return 1;
-  }
-#endif // _WINNT
-
-  DeleteFile(getStartMenuName(
-    g_resource->loadString(IDS_shortcutName)).c_str());
-  DeleteFile(getStartUpName(
-    g_resource->loadString(IDS_shortcutName)).c_str());
-
-  removeFiles(g_setupFiles, NUMBER_OF(g_setupFiles), g_flags, g_destDir);
-  removeFileExtension(_T(".mayu"), _T("mayu file"));
-  removeUninstallInformation(_T("mayu"));
-  
-  Registry::remove(DIR_REGISTRY_ROOT);
-  Registry::remove(HKEY_CURRENT_USER, _T("Software\\GANAware\\mayu"));
-  
-  message(IDS_removeFinish, MB_OK | MB_ICONINFORMATION);
-  return 0;
-}
-
-
-int WINAPI _tWinMain(HINSTANCE i_hInstance, HINSTANCE /* hPrevInstance */,
-                    LPTSTR /* lpszCmdLine */, int /* nCmdShow */)
-{
-  CoInitialize(NULL);
-  
-  g_hInst = i_hInstance;
-  Resource resource(g_strres);
-  g_resource = &resource;
-
-  // check OS
-  if (
-#if defined(_WINNT)
-      !checkOs(SetupFile::NT)
-#elif defined(_WIN95)
-      !checkOs(SetupFile::W9x)
-#else
-#  error
-#endif
-    )
-  {
-    message(IDS_invalidOS, MB_OK | MB_ICONSTOP);
-    return 1;
-  }
-
-  // keyboard kind
-  g_keyboardKind =
-    (resource.getLocale() == LOCALE_Japanese_Japan_932) ?
-    KEYBOARD_KIND_109 : KEYBOARD_KIND_104;
-
-  // read registry
-  tstringi programFiles;                       // "Program Files" directory
-  Registry::read(HKEY_LOCAL_MACHINE,
-                _T("Software\\Microsoft\\Windows\\CurrentVersion"),
-                _T("ProgramFilesDir"), &programFiles);
-  Registry::read(DIR_REGISTRY_ROOT, _T("dir"), &g_destDir,
-                programFiles + _T("\\mayu"));
-
-  int retval = 1;
-  
-  if (__argc == 2 && _tcsicmp(__targv[1], _T("-u")) == 0)
-    retval = uninstallStep1(_T("-u"));
-  else
-  {
-    HANDLE mutexPrevVer = CreateMutex(
-      (SECURITY_ATTRIBUTES *)NULL, TRUE,
-      MUTEX_MAYU_EXCLUSIVE_RUNNING);
-    if (GetLastError() == ERROR_ALREADY_EXISTS) { // mayu is running
-      message(IDS_mayuRunning, MB_OK | MB_ICONSTOP);
-    } else {
-      // is mayu running ?
-      HANDLE mutex = CreateMutex(
-       (SECURITY_ATTRIBUTES *)NULL, TRUE,
-       addSessionId(MUTEX_MAYU_EXCLUSIVE_RUNNING).c_str());
-      if (GetLastError() == ERROR_ALREADY_EXISTS) { // mayu is running
-       message(IDS_mayuRunning, MB_OK | MB_ICONSTOP);
-      } else if (__argc == 3 && _tcsicmp(__targv[1], _T("-u")) == 0) {
-       uninstallStep2(__targv[2]);
-       retval = uninstall();
-      } else if (__argc == 2 && _tcsicmp(__targv[1], _T("-s")) == 0) {
-       g_wasExecutedBySFX = true;
-       retval = DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_main), NULL,
-                          DlgMain::dlgProc);
-      } else if (__argc == 1) {
-       retval = DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_main), NULL,
-                          DlgMain::dlgProc);
-      }
-      CloseHandle(mutex);
-    }
-    CloseHandle(mutexPrevVer);
-  }
-  
-  return retval;
-}
+///////////////////////////////////////////////////////////////////////////////\r
+// setup.cpp\r
+\r
+\r
+#include "../misc.h"\r
+#include "../registry.h"\r
+#include "../stringtool.h"\r
+#include "../windowstool.h"\r
+#include "../mayu.h"\r
+#include "setuprc.h"\r
+#include "installer.h"\r
+\r
+#include <windowsx.h>\r
+#include <shlobj.h>\r
+\r
+\r
+using namespace Installer;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Registry\r
+\r
+\r
+#define DIR_REGISTRY_ROOT                      \\r
+       HKEY_LOCAL_MACHINE,                     \\r
+       _T("Software\\GANAware\\mayu")\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Globals\r
+\r
+\r
+enum\r
+{\r
+  Flag_Usb = 1 << 1,\r
+};\r
+u_int32 g_flags = SetupFile::Normal;\r
+\r
+\r
+using namespace SetupFile;\r
+const SetupFile::Data g_setupFiles[] =\r
+{\r
+  // same name\r
+#define SN(i_kind, i_os, i_from, i_destination)                        \\r
+  { i_kind, i_os, Normal|Flag_Usb, _T(i_from), i_destination, _T(i_from) }\r
+  // different name\r
+#define DN(i_kind, i_os, i_from, i_destination, i_to)  \\r
+  { i_kind, i_os, Normal|Flag_Usb, _T(i_from), i_destination, _T(i_to) }\r
+  \r
+  // executables\r
+  SN(Dll , ALL, "mayu.dll"          , ToDest),\r
+  SN(File, ALL, "mayu.exe"          , ToDest),\r
+  SN(File, ALL, "setup.exe"         , ToDest),\r
+                                   \r
+  // drivers\r
+#if defined(_WINNT)\r
+  SN(File, NT , "mayud.sys"         , ToDest),\r
+  SN(File, NT , "mayudnt4.sys"      , ToDest),\r
+  SN(File, W2k, "mayudrsc.sys"    , ToDest),\r
+  SN(File, W2k, "mayud.sys"         , ToDriver),\r
+  DN(File, NT4, "mayudnt4.sys"      , ToDriver, "mayud.sys"),\r
+  SN(File, W2k, "mayudrsc.sys"    , ToDriver),\r
+#elif defined(_WIN95)\r
+  SN(File, W9x, "mayud.vxd"         , ToDest),\r
+#else\r
+#  error\r
+#endif\r
+\r
+  // setting files                 \r
+  SN(File, ALL, "104.mayu"          , ToDest),\r
+  SN(File, ALL, "104on109.mayu"             , ToDest),\r
+  SN(File, ALL, "109.mayu"          , ToDest),\r
+  SN(File, ALL, "109on104.mayu"             , ToDest),\r
+  SN(File, ALL, "default.mayu"      , ToDest),\r
+  SN(File, ALL, "dot.mayu"          , ToDest),\r
+  SN(File, ALL, "emacsedit.mayu"     , ToDest),\r
+                                   \r
+  // documents                             \r
+  SN(Dir , ALL, "doc"               , ToDest), // mkdir\r
+  DN(File, ALL, "banner-ja.gif"             , ToDest, "doc\\banner-ja.gif"      ),\r
+  DN(File, ALL, "edit-setting-ja.png", ToDest, "doc\\edit-setting-ja.png"),\r
+  DN(File, ALL, "investigate-ja.png" , ToDest, "doc\\investigate-ja.png" ),\r
+  DN(File, ALL, "log-ja.png"        , ToDest, "doc\\log-ja.png"         ),\r
+  DN(File, ALL, "menu-ja.png"       , ToDest, "doc\\menu-ja.png"        ),\r
+  DN(File, ALL, "pause-ja.png"      , ToDest, "doc\\pause-ja.png"       ),\r
+  DN(File, ALL, "setting-ja.png"     , ToDest, "doc\\setting-ja.png"    ),\r
+  DN(File, ALL, "target.png"        , ToDest, "doc\\target.png"         ),\r
+  DN(File, ALL, "version-ja.png"     , ToDest, "doc\\version-ja.png"    ),\r
+  DN(File, ALL, "CONTENTS-ja.html"   , ToDest, "doc\\CONTENTS-ja.html"  ),\r
+  DN(File, ALL, "CUSTOMIZE-ja.html"  , ToDest, "doc\\CUSTOMIZE-ja.html"         ),\r
+  DN(File, ALL, "MANUAL-ja.html"     , ToDest, "doc\\MANUAL-ja.html"    ),\r
+  DN(File, ALL, "README-ja.html"     , ToDest, "doc\\README-ja.html"    ),\r
+  DN(File, ALL, "README.css"        , ToDest, "doc\\README.css"         ),\r
+  DN(File, ALL, "syntax.txt"        , ToDest, "doc\\syntax.txt"         ),\r
+  \r
+  SN(File, ALL, "mayu-mode.el"      , ToDest),\r
+                                   \r
+  SN(Dir , ALL, "contrib"           , ToDest), // mkdir\r
+  DN(File, ALL, "mayu-settings.txt"  , ToDest, "contrib\\mayu-settings.txt"),\r
+  DN(File, ALL, "dvorak.mayu"       , ToDest, "contrib\\dvorak.mayu"      ),\r
+  DN(File, ALL, "DVORAKon109.mayu"   , ToDest, "contrib\\DVORAKon109.mayu" ),\r
+  DN(File, ALL, "keitai.mayu"       , ToDest, "contrib\\keitai.mayu"      ),\r
+  DN(File, ALL, "ax.mayu"           , ToDest, "contrib\\ax.mayu"          ),\r
+  DN(File, ALL, "98x1.mayu"         , ToDest, "contrib\\98x1.mayu"        ),\r
+  DN(File, ALL, "109onAX.mayu"      , ToDest, "contrib\\109onAX.mayu"     ),\r
+\r
+  SN(Dir , ALL, "Plugins"           , ToDest), // mkdir\r
+};\r
+\r
+\r
+enum KeyboardKind\r
+{\r
+  KEYBOARD_KIND_109,\r
+  KEYBOARD_KIND_104,\r
+} g_keyboardKind;\r
+\r
+\r
+static const StringResource g_strres[] =\r
+{\r
+#include "strres.h"\r
+};\r
+\r
+\r
+bool g_wasExecutedBySFX = false;       // Was setup executed by cab32 SFX ?\r
+Resource *g_resource;                  // resource information\r
+tstringi g_destDir;                    // destination directory\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// functions\r
+\r
+\r
+// show message\r
+int message(int i_id, int i_flag, HWND i_hwnd = NULL)\r
+{\r
+  return MessageBox(i_hwnd, g_resource->loadString(i_id),\r
+                   g_resource->loadString(IDS_mayuSetup), i_flag);\r
+}\r
+\r
+\r
+// driver service error\r
+void driverServiceError(DWORD i_err)\r
+{\r
+  switch (i_err)\r
+  {\r
+    case ERROR_ACCESS_DENIED:\r
+      message(IDS_notAdministrator, MB_OK | MB_ICONSTOP);\r
+      break;\r
+    case ERROR_SERVICE_MARKED_FOR_DELETE:\r
+      message(IDS_alreadyUninstalled, MB_OK | MB_ICONSTOP);\r
+      break;\r
+    default:\r
+    {\r
+      TCHAR *errmsg;\r
+      int err = int(i_err);\r
+      if (err < 0) {\r
+       i_err = -err;\r
+      }\r
+      if (FormatMessage(\r
+           FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,\r
+           NULL, i_err, 0, (LPTSTR)&errmsg, 0, NULL)) {\r
+       TCHAR buf[1024];\r
+       _sntprintf(buf, NUMBER_OF(buf), _T("%s: %d: %s\n"),\r
+                  g_resource->loadString(IDS_error),\r
+                  err, errmsg);\r
+       LocalFree(errmsg);\r
+       MessageBox(NULL, buf, g_resource->loadString(IDS_mayuSetup),\r
+                  MB_OK | MB_ICONSTOP);\r
+      } else {\r
+       message(IDS_error, MB_OK | MB_ICONSTOP);\r
+      }\r
+      break;\r
+    }\r
+  }\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// dialogue\r
+\r
+\r
+// dialog box\r
+class DlgMain\r
+{\r
+  HWND m_hwnd;\r
+  bool m_doRegisterToStartMenu;        // if register to the start menu\r
+  bool m_doRegisterToStartUp;  // if register to the start up\r
+\r
+private:\r
+  // install\r
+  int install()\r
+  {\r
+    Registry reg(DIR_REGISTRY_ROOT);\r
+    CHECK_TRUE( reg.write(_T("dir"), g_destDir) );\r
+    tstringi srcDir = getModuleDirectory();\r
+\r
+    if (!installFiles(g_setupFiles, NUMBER_OF(g_setupFiles), g_flags, srcDir,\r
+                     g_destDir))\r
+    {\r
+      removeFiles(g_setupFiles, NUMBER_OF(g_setupFiles), g_flags, g_destDir);\r
+      if (g_wasExecutedBySFX)\r
+       removeSrcFiles(g_setupFiles, NUMBER_OF(g_setupFiles), g_flags, srcDir);\r
+      return 1;\r
+    }\r
+    if (g_wasExecutedBySFX)\r
+      removeSrcFiles(g_setupFiles, NUMBER_OF(g_setupFiles), g_flags, srcDir);\r
+\r
+#if defined(_WINNT)\r
+    DWORD err =\r
+      createDriverService(_T("mayud"),\r
+                         g_resource->loadString(IDS_mayud),\r
+                         getDriverDirectory() + _T("\\mayud.sys"),\r
+                         _T("+Keyboard Class\0"),\r
+                         g_flags & Flag_Usb ? true : false);\r
+\r
+    if (err != ERROR_SUCCESS)\r
+    {\r
+      driverServiceError(err);\r
+      removeFiles(g_setupFiles, NUMBER_OF(g_setupFiles), g_flags, g_destDir);\r
+      return 1;\r
+    }\r
+\r
+    if (g_flags == Flag_Usb)\r
+      CHECK_TRUE( reg.write(_T("isUsbDriver"), DWORD(1)) );\r
+#endif // _WINNT\r
+    \r
+    // create shortcut\r
+    if (m_doRegisterToStartMenu)\r
+    {\r
+      tstringi shortcut = getStartMenuName(loadString(IDS_shortcutName));\r
+      if (!shortcut.empty())\r
+       createLink((g_destDir + _T("\\mayu.exe")).c_str(), shortcut.c_str(),\r
+                  g_resource->loadString(IDS_shortcutName),\r
+                  g_destDir.c_str());\r
+    }\r
+    if (m_doRegisterToStartUp)\r
+    {\r
+      tstringi shortcut = getStartUpName(loadString(IDS_shortcutName));\r
+      if (!shortcut.empty())\r
+       createLink((g_destDir + _T("\\mayu.exe")).c_str(), shortcut.c_str(),\r
+                  g_resource->loadString(IDS_shortcutName),\r
+                  g_destDir.c_str());\r
+    }\r
+\r
+    // set registry\r
+    reg.write(_T("layout"),\r
+             (g_keyboardKind == KEYBOARD_KIND_109) ? _T("109") : _T("104"));\r
+\r
+    // file extension\r
+    createFileExtension(_T(".mayu"), _T("text/plain"),\r
+                       _T("mayu file"), g_resource->loadString(IDS_mayuFile),\r
+                       g_destDir + _T("\\mayu.exe,1"),\r
+                       g_resource->loadString(IDS_mayuShellOpen));\r
+    \r
+    // uninstall\r
+    createUninstallInformation(_T("mayu"), g_resource->loadString(IDS_mayu),\r
+                              g_destDir + _T("\\setup.exe -u"));\r
+\r
+    if (g_flags == Flag_Usb)\r
+    {\r
+      if (message(IDS_copyFinishUsb, MB_YESNO | MB_ICONQUESTION, m_hwnd)\r
+         == IDYES)\r
+      {\r
+       // reboot ...\r
+       HANDLE hToken; \r
+       // Get a token for this process. \r
+       if (!OpenProcessToken(GetCurrentProcess(), \r
+                             TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))\r
+       {\r
+         message(IDS_failedToReboot, MB_OK | MB_ICONSTOP);\r
+         return 0;\r
+       }\r
+       // Get the LUID for the shutdown privilege.\r
+       TOKEN_PRIVILEGES tkp;\r
+       LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);\r
+       tkp.PrivilegeCount = 1;  // one privilege to set\r
+       tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;\r
+       // Get the shutdown privilege for this process. \r
+       AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,\r
+                             (PTOKEN_PRIVILEGES)NULL, 0);\r
+       // Cannot test the return value of AdjustTokenPrivileges. \r
+       if (GetLastError() != ERROR_SUCCESS)\r
+       {\r
+         message(IDS_failedToReboot, MB_OK | MB_ICONSTOP);\r
+         return 0;\r
+       }\r
+       // Shut down the system and force all applications to close. \r
+       if (!ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))\r
+       {\r
+         message(IDS_failedToReboot, MB_OK | MB_ICONSTOP);\r
+         return 0;\r
+       }\r
+      }\r
+    }\r
+    else\r
+    {\r
+      if (message(IDS_copyFinish, MB_YESNO | MB_ICONQUESTION, m_hwnd)\r
+         == IDYES)\r
+       ExitWindows(0, 0);                      // logoff\r
+    }\r
+    return 0;\r
+  }\r
+  \r
+private:\r
+  // WM_INITDIALOG\r
+  BOOL wmInitDialog(HWND /* focus */, LPARAM /* lParam */)\r
+  {\r
+    setSmallIcon(m_hwnd, IDI_ICON_mayu);\r
+    setBigIcon(m_hwnd, IDI_ICON_mayu);\r
+    Edit_SetText(GetDlgItem(m_hwnd, IDC_EDIT_path), g_destDir.c_str());\r
+    HWND hwndCombo = GetDlgItem(m_hwnd, IDC_COMBO_keyboard);\r
+#if 0\r
+    if (checkOs(SetupFile::W2k))\r
+#endif\r
+    {\r
+      ComboBox_AddString(hwndCombo,\r
+                        g_resource->loadString(IDS_keyboard109usb));\r
+      ComboBox_AddString(hwndCombo,\r
+                        g_resource->loadString(IDS_keyboard104usb));\r
+    }\r
+#if 0\r
+    ComboBox_AddString(hwndCombo, g_resource->loadString(IDS_keyboard109));\r
+    ComboBox_AddString(hwndCombo, g_resource->loadString(IDS_keyboard104));\r
+#endif\r
+    ComboBox_SetCurSel(hwndCombo,\r
+                      (g_keyboardKind == KEYBOARD_KIND_109) ? 0 : 1);\r
+    tstring note;\r
+    for (int i = IDS_note01; i <= IDS_note13; ++ i) {\r
+      note += g_resource->loadString(i);\r
+    }\r
+    Edit_SetText(GetDlgItem(m_hwnd, IDC_EDIT_note), note.c_str());\r
+    return TRUE;\r
+  }\r
+  \r
+  // WM_CLOSE\r
+  BOOL wmClose()\r
+  {\r
+    EndDialog(m_hwnd, 0);\r
+    return TRUE;\r
+  }\r
+  \r
+  // WM_COMMAND\r
+  BOOL wmCommand(int /* notify_code */, int i_id, HWND /* hwnd_control */)\r
+  {\r
+    switch (i_id)\r
+    {\r
+      case IDC_BUTTON_browse:\r
+      {\r
+       _TCHAR folder[GANA_MAX_PATH];\r
+       \r
+       BROWSEINFO bi;\r
+       ZeroMemory(&bi, sizeof(bi));\r
+       bi.hwndOwner      = m_hwnd;\r
+       bi.pidlRoot       = NULL;\r
+       bi.pszDisplayName = folder;\r
+       bi.lpszTitle      = g_resource->loadString(IDS_selectDir);\r
+       ITEMIDLIST *browse = SHBrowseForFolder(&bi);\r
+       if (browse != NULL)\r
+       {\r
+         if (SHGetPathFromIDList(browse, folder))\r
+         {\r
+           if (createDirectories(folder))\r
+             Edit_SetText(GetDlgItem(m_hwnd, IDC_EDIT_path), folder);\r
+         }\r
+         IMalloc *imalloc = NULL;\r
+         if (SHGetMalloc(&imalloc) == NOERROR)\r
+           imalloc->Free((void *)browse);\r
+       }\r
+       return TRUE;\r
+      }\r
+      \r
+      case IDOK:\r
+      {\r
+       _TCHAR buf[GANA_MAX_PATH];\r
+       Edit_GetText(GetDlgItem(m_hwnd, IDC_EDIT_path), buf, NUMBER_OF(buf));\r
+       if (buf[0])\r
+       {\r
+         g_destDir = normalizePath(buf);\r
+         m_doRegisterToStartMenu =\r
+           (IsDlgButtonChecked(m_hwnd, IDC_CHECK_registerStartMenu) ==\r
+            BST_CHECKED);\r
+         m_doRegisterToStartUp =\r
+           (IsDlgButtonChecked(m_hwnd, IDC_CHECK_registerStartUp) ==\r
+            BST_CHECKED);\r
+\r
+         int curSel =\r
+           ComboBox_GetCurSel(GetDlgItem(m_hwnd, IDC_COMBO_keyboard));\r
+         g_flags = SetupFile::Normal;\r
+#if 0\r
+         if (checkOs(SetupFile::W2k))\r
+#endif\r
+         {\r
+           switch (curSel)\r
+           {\r
+             case 0:\r
+               g_keyboardKind = KEYBOARD_KIND_109;\r
+               g_flags = Flag_Usb;\r
+               break;\r
+             case 1:\r
+               g_keyboardKind = KEYBOARD_KIND_104;\r
+               g_flags = Flag_Usb;\r
+               break;\r
+#if 0\r
+             case 2: g_keyboardKind = KEYBOARD_KIND_109; break;\r
+             case 3: g_keyboardKind = KEYBOARD_KIND_104; break;\r
+#endif\r
+           };\r
+         }\r
+#if 0\r
+         else\r
+         {\r
+           switch (curSel)\r
+           {\r
+             case 0: g_keyboardKind = KEYBOARD_KIND_109; break;\r
+             case 1: g_keyboardKind = KEYBOARD_KIND_104; break;\r
+           };\r
+         }\r
+#endif\r
+\r
+#if 0\r
+         if (g_flags == Flag_Usb)\r
+           if (message(IDS_usbWarning, MB_OKCANCEL | MB_ICONWARNING, m_hwnd)\r
+               == IDCANCEL)\r
+             return TRUE;\r
+#endif\r
+         \r
+         if (createDirectories(g_destDir.c_str()))\r
+           EndDialog(m_hwnd, install());\r
+         else\r
+           message(IDS_invalidDirectory, MB_OK | MB_ICONSTOP, m_hwnd);\r
+       }\r
+       else\r
+         message(IDS_mayuEmpty, MB_OK, m_hwnd);\r
+       return TRUE;\r
+      }\r
+      \r
+      case IDCANCEL:\r
+      {\r
+       CHECK_TRUE( EndDialog(m_hwnd, 0) );\r
+       return TRUE;\r
+      }\r
+    }\r
+    return FALSE;\r
+  }\r
+\r
+public:\r
+  DlgMain(HWND i_hwnd)\r
+    : m_hwnd(i_hwnd),\r
+      m_doRegisterToStartMenu(false),\r
+      m_doRegisterToStartUp(false)\r
+  {\r
+  }\r
+\r
+  static BOOL CALLBACK dlgProc(HWND i_hwnd, UINT i_message,\r
+                              WPARAM i_wParam, LPARAM i_lParam)\r
+  {\r
+    DlgMain *wc;\r
+    getUserData(i_hwnd, &wc);\r
+    if (!wc)\r
+      switch (i_message)\r
+      {\r
+       case WM_INITDIALOG:\r
+         wc = setUserData(i_hwnd, new DlgMain(i_hwnd));\r
+         return wc->wmInitDialog(reinterpret_cast<HWND>(i_wParam), i_lParam);\r
+      }\r
+    else\r
+      switch (i_message)\r
+      {\r
+       case WM_COMMAND:\r
+         return wc->wmCommand(HIWORD(i_wParam), LOWORD(i_wParam),\r
+                              reinterpret_cast<HWND>(i_lParam));\r
+       case WM_CLOSE:\r
+         return wc->wmClose();\r
+       case WM_NCDESTROY:\r
+         delete wc;\r
+         return TRUE;\r
+      }\r
+    return FALSE;\r
+  }\r
+};\r
+\r
+\r
+// uninstall\r
+// (in this function, we cannot use any resource, so we use strres[])\r
+int uninstall()\r
+{\r
+  if (IDYES != message(IDS_removeOk, MB_YESNO | MB_ICONQUESTION))\r
+    return 1;\r
+\r
+#if defined(_WINNT)\r
+  DWORD err = removeDriverService(_T("mayud"));\r
+  if (err != ERROR_SUCCESS)\r
+  {\r
+    driverServiceError(err);\r
+    return 1;\r
+  }\r
+#endif // _WINNT\r
+\r
+  DeleteFile(getStartMenuName(\r
+    g_resource->loadString(IDS_shortcutName)).c_str());\r
+  DeleteFile(getStartUpName(\r
+    g_resource->loadString(IDS_shortcutName)).c_str());\r
+\r
+  removeFiles(g_setupFiles, NUMBER_OF(g_setupFiles), g_flags, g_destDir);\r
+  removeFileExtension(_T(".mayu"), _T("mayu file"));\r
+  removeUninstallInformation(_T("mayu"));\r
+  \r
+  Registry::remove(DIR_REGISTRY_ROOT);\r
+  Registry::remove(HKEY_CURRENT_USER, _T("Software\\GANAware\\mayu"));\r
+  \r
+  message(IDS_removeFinish, MB_OK | MB_ICONINFORMATION);\r
+  return 0;\r
+}\r
+\r
+\r
+int WINAPI _tWinMain(HINSTANCE i_hInstance, HINSTANCE /* hPrevInstance */,\r
+                    LPTSTR /* lpszCmdLine */, int /* nCmdShow */)\r
+{\r
+  CoInitialize(NULL);\r
+  \r
+  g_hInst = i_hInstance;\r
+  Resource resource(g_strres);\r
+  g_resource = &resource;\r
+\r
+  // check OS\r
+  if (\r
+#if defined(_WINNT)\r
+      !checkOs(SetupFile::NT)\r
+#elif defined(_WIN95)\r
+      !checkOs(SetupFile::W9x)\r
+#else\r
+#  error\r
+#endif\r
+    )\r
+  {\r
+    message(IDS_invalidOS, MB_OK | MB_ICONSTOP);\r
+    return 1;\r
+  }\r
+\r
+  // keyboard kind\r
+  g_keyboardKind =\r
+    (resource.getLocale() == LOCALE_Japanese_Japan_932) ?\r
+    KEYBOARD_KIND_109 : KEYBOARD_KIND_104;\r
+\r
+  // read registry\r
+  tstringi programFiles;                       // "Program Files" directory\r
+  Registry::read(HKEY_LOCAL_MACHINE,\r
+                _T("Software\\Microsoft\\Windows\\CurrentVersion"),\r
+                _T("ProgramFilesDir"), &programFiles);\r
+  Registry::read(DIR_REGISTRY_ROOT, _T("dir"), &g_destDir,\r
+                programFiles + _T("\\mayu"));\r
+\r
+  int retval = 1;\r
+  \r
+  if (__argc == 2 && _tcsicmp(__targv[1], _T("-u")) == 0)\r
+    retval = uninstallStep1(_T("-u"));\r
+  else\r
+  {\r
+    HANDLE mutexPrevVer = CreateMutex(\r
+      (SECURITY_ATTRIBUTES *)NULL, TRUE,\r
+      MUTEX_MAYU_EXCLUSIVE_RUNNING);\r
+    if (GetLastError() == ERROR_ALREADY_EXISTS) { // mayu is running\r
+      message(IDS_mayuRunning, MB_OK | MB_ICONSTOP);\r
+    } else {\r
+      // is mayu running ?\r
+      HANDLE mutex = CreateMutex(\r
+       (SECURITY_ATTRIBUTES *)NULL, TRUE,\r
+       addSessionId(MUTEX_MAYU_EXCLUSIVE_RUNNING).c_str());\r
+      if (GetLastError() == ERROR_ALREADY_EXISTS) { // mayu is running\r
+       message(IDS_mayuRunning, MB_OK | MB_ICONSTOP);\r
+      } else if (__argc == 3 && _tcsicmp(__targv[1], _T("-u")) == 0) {\r
+       uninstallStep2(__targv[2]);\r
+       retval = uninstall();\r
+      } else if (__argc == 2 && _tcsicmp(__targv[1], _T("-s")) == 0) {\r
+       g_wasExecutedBySFX = true;\r
+       retval = DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_main), NULL,\r
+                          DlgMain::dlgProc);\r
+      } else if (__argc == 1) {\r
+       retval = DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_main), NULL,\r
+                          DlgMain::dlgProc);\r
+      }\r
+      CloseHandle(mutex);\r
+    }\r
+    CloseHandle(mutexPrevVer);\r
+  }\r
+  \r
+  return retval;\r
+}\r
index 80d89c4..e33139f 100644 (file)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// setting.cpp
-
-
-#include "misc.h"
-
-#include "dlgsetting.h"
-#include "errormessage.h"
-#include "mayu.h"
-#include "mayurc.h"
-#include "registry.h"
-#include "setting.h"
-#include "windowstool.h"
-#include "vkeytable.h"
-#include "array.h"
-
-#include <algorithm>
-#include <fstream>
-#include <iomanip>
-#include <sys/stat.h>
-
-
-namespace Event
-{
-  Key prefixed(_T("prefixed"));
-  Key before_key_down(_T("before-key-down"));
-  Key after_key_up(_T("after-key-up"));
-  Key *events[] =
-  {
-    &prefixed,
-    &before_key_down,
-    &after_key_up,
-    NULL,
-  };
-}
-
-
-// get mayu filename
-static bool getFilenameFromRegistry(
-  tstringi *o_name, tstringi *o_filename, Setting::Symbols *o_symbols)
-{
-  Registry reg(MAYU_REGISTRY_ROOT);
-  int index;
-  reg.read(_T(".mayuIndex"), &index, 0);
-  _TCHAR buf[100];
-  _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), index);
-
-  tstringi entry;
-  if (!reg.read(buf, &entry))
-    return false;
-  
-  tregex getFilename(_T("^([^;]*);([^;]*);(.*)$"));
-  tsmatch getFilenameResult;
-  if (!boost::regex_match(entry, getFilenameResult, getFilename))
-    return false;
-  
-  if (o_name)
-    *o_name = getFilenameResult.str(1);
-  if (o_filename)
-    *o_filename = getFilenameResult.str(2);
-  if (o_symbols)
-  {
-    tstringi symbols = getFilenameResult.str(3);
-    tregex symbol(_T("-D([^;]*)(.*)$"));
-    tsmatch symbolResult;
-    while (boost::regex_search(symbols, symbolResult, symbol))
-    {
-      o_symbols->insert(symbolResult.str(1));
-      symbols = symbolResult.str(2);
-    }
-  }
-  return true;
-}
-
-
-// get home directory path
-void getHomeDirectories(HomeDirectories *o_pathes)
-{
-  tstringi filename;
-#ifndef USE_INI
-  if (getFilenameFromRegistry(NULL, &filename, NULL) &&
-      !filename.empty())
-  {
-    tregex getPath(_T("^(.*[/\\\\])[^/\\\\]*$"));
-    tsmatch getPathResult;
-    if (boost::regex_match(filename, getPathResult, getPath))
-      o_pathes->push_back(getPathResult.str(1));
-  }
-  
-  const _TCHAR *home = _tgetenv(_T("HOME"));
-  if (home)
-    o_pathes->push_back(home);
-
-  const _TCHAR *homedrive = _tgetenv(_T("HOMEDRIVE"));
-  const _TCHAR *homepath = _tgetenv(_T("HOMEPATH"));
-  if (homedrive && homepath)
-    o_pathes->push_back(tstringi(homedrive) + homepath);
-  
-  const _TCHAR *userprofile = _tgetenv(_T("USERPROFILE"));
-  if (userprofile)
-    o_pathes->push_back(userprofile);
-  
-  _TCHAR buf[GANA_MAX_PATH];
-  DWORD len = GetCurrentDirectory(NUMBER_OF(buf), buf);
-  if (0 < len && len < NUMBER_OF(buf))
-    o_pathes->push_back(buf);
-#else //USE_INI
-  _TCHAR buf[GANA_MAX_PATH];
-#endif //USE_INI
-
-  if (GetModuleFileName(GetModuleHandle(NULL), buf, NUMBER_OF(buf)))
-    o_pathes->push_back(pathRemoveFileSpec(buf));
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// SettingLoader
-
-
-// is there no more tokens ?
-bool SettingLoader::isEOL()
-{
-  return m_ti == m_tokens.end();
-}
-
-
-// get next token
-Token *SettingLoader::getToken()
-{
-  if (isEOL())
-    throw ErrorMessage() << _T("too few words.");
-  return &*(m_ti ++);
-}
-
-  
-// look next token
-Token *SettingLoader::lookToken()
-{
-  if (isEOL())
-    throw ErrorMessage() << _T("too few words.");
-  return &*m_ti;
-}
-
-
-// argument "("
-bool SettingLoader::getOpenParen(bool i_doesThrow, const _TCHAR *i_name)
-{
-  if (!isEOL() && lookToken()->isOpenParen())
-  {
-    getToken();
-    return true;
-  }
-  if (i_doesThrow)
-    throw ErrorMessage() << _T("there must be `(' after `&")
-                        << i_name << _T("'.");
-  return false;
-}
-
-
-// argument ")"
-bool SettingLoader::getCloseParen(bool i_doesThrow, const _TCHAR *i_name)
-{
-  if (!isEOL() && lookToken()->isCloseParen())
-  {
-    getToken();
-    return true;
-  }
-  if (i_doesThrow)
-    throw ErrorMessage() << _T("`&")  << i_name
-                        << _T("': too many arguments.");
-  return false;
-}
-
-
-// argument ","
-bool SettingLoader::getComma(bool i_doesThrow, const _TCHAR *i_name)
-{
-  if (!isEOL() && lookToken()->isComma())
-  {
-    getToken();
-    return true;
-  }
-  if (i_doesThrow)
-    throw ErrorMessage() << _T("`&")  << i_name
-                        << _T("': comma expected.");
-  return false;
-}
-
-
-// <INCLUDE>
-void SettingLoader::load_INCLUDE()
-{
-  SettingLoader loader(m_soLog, m_log);
-  loader.m_defaultAssignModifier = m_defaultAssignModifier;
-  loader.m_defaultKeySeqModifier = m_defaultKeySeqModifier;
-  if (!loader.load(m_setting, (*getToken()).getString()))
-    m_isThereAnyError = true;
-}
-
-
-// <SCAN_CODES>
-void SettingLoader::load_SCAN_CODES(Key *o_key)
-{
-  for (int j = 0; j < Key::MAX_SCAN_CODES_SIZE && !isEOL(); ++ j)
-  {
-    ScanCode sc;
-    sc.m_flags = 0;
-    while (true)
-    {
-      Token *t = getToken();
-      if (t->isNumber())
-      {
-       sc.m_scan = (u_char)t->getNumber();
-       o_key->addScanCode(sc);
-       break;
-      }
-      if      (*t == _T("E0-")) sc.m_flags |= ScanCode::E0;
-      else if (*t == _T("E1-")) sc.m_flags |= ScanCode::E1;
-      else  throw ErrorMessage() << _T("`") << *t
-                                << _T("': invalid modifier.");
-    }
-  }
-}
-
-
-// <DEFINE_KEY>
-void SettingLoader::load_DEFINE_KEY()
-{
-  Token *t = getToken();
-  Key key;
-      
-  // <KEY_NAMES>
-  if (*t == _T('('))
-  {
-    key.addName(getToken()->getString());
-    while (t = getToken(), *t != _T(')'))
-      key.addName(t->getString());
-    if (*getToken() != _T("="))
-      throw ErrorMessage() << _T("there must be `=' after `)'.");
-  }
-  else
-  {
-    key.addName(t->getString());
-    while (t = getToken(), *t != _T("="))
-      key.addName(t->getString());
-  }
-
-  load_SCAN_CODES(&key);
-  m_setting->m_keyboard.addKey(key);
-}
-
-
-// <DEFINE_MODIFIER>
-void SettingLoader::load_DEFINE_MODIFIER()
-{
-  Token *t = getToken();
-  Modifier::Type mt;
-  if      (*t == _T("shift")  ) mt = Modifier::Type_Shift;
-  else if (*t == _T("alt")     ||
-          *t == _T("meta")    ||
-          *t == _T("menu")   ) mt = Modifier::Type_Alt;
-  else if (*t == _T("control") ||
-          *t == _T("ctrl")   ) mt = Modifier::Type_Control;
-  else if (*t == _T("windows") ||
-          *t == _T("win")    ) mt = Modifier::Type_Windows;
-  else throw ErrorMessage() << _T("`") << *t
-                           << _T("': invalid modifier name.");
-    
-  if (*getToken() != _T("="))
-    throw ErrorMessage() << _T("there must be `=' after modifier name.");
-    
-  while (!isEOL())
-  {
-    t = getToken();
-    Key *key =
-      m_setting->m_keyboard.searchKeyByNonAliasName(t->getString());
-    if (!key)
-      throw ErrorMessage() << _T("`") << *t << _T("': invalid key name.");
-    m_setting->m_keyboard.addModifier(mt, key);
-  }
-}
-
-
-// <DEFINE_SYNC_KEY>
-void SettingLoader::load_DEFINE_SYNC_KEY()
-{
-  Key *key = m_setting->m_keyboard.getSyncKey();
-  key->initialize();
-  key->addName(_T("sync"));
-  
-  if (*getToken() != _T("="))
-    throw ErrorMessage() << _T("there must be `=' after `sync'.");
-  
-  load_SCAN_CODES(key);
-}
-
-
-// <DEFINE_ALIAS>
-void SettingLoader::load_DEFINE_ALIAS()
-{
-  Token *name = getToken();
-  
-  if (*getToken() != _T("="))
-    throw ErrorMessage() << _T("there must be `=' after `alias'.");
-
-  Token *t = getToken();
-  Key *key = m_setting->m_keyboard.searchKeyByNonAliasName(t->getString());
-  if (!key)
-    throw ErrorMessage() << _T("`") << *t << _T("': invalid key name.");
-  m_setting->m_keyboard.addAlias(name->getString(), key);
-}
-
-
-// <DEFINE_SUBSTITUTE>
-void SettingLoader::load_DEFINE_SUBSTITUTE()
-{
-  typedef std::list<ModifiedKey> AssignedKeys;
-  AssignedKeys assignedKeys;
-  do
-  {
-    ModifiedKey mkey;
-    mkey.m_modifier =
-      load_MODIFIER(Modifier::Type_ASSIGN, m_defaultAssignModifier);
-    mkey.m_key = load_KEY_NAME();
-    assignedKeys.push_back(mkey);
-  } while (!(*lookToken() == _T("=>") || *lookToken() == _T("=")));
-  getToken();
-  
-  KeySeq *keySeq = load_KEY_SEQUENCE(_T(""), false, Modifier::Type_ASSIGN);
-  ModifiedKey mkey = keySeq->getFirstModifiedKey();
-  if (!mkey.m_key)
-    throw ErrorMessage() << _T("no key is specified for substitute.");
-  
-  for (AssignedKeys::iterator i = assignedKeys.begin();
-       i != assignedKeys.end(); ++ i)
-    m_setting->m_keyboard.addSubstitute(*i, mkey);
-}
-
-
-// <DEFINE_OPTION>
-void SettingLoader::load_DEFINE_OPTION()
-{
-  Token *t = getToken();
-  if (*t == _T("KL-")) {
-    if (*getToken() != _T("=")) {
-      throw ErrorMessage() << _T("there must be `=' after `def option KL-'.");
-    }
-
-    load_ARGUMENT(&m_setting->m_correctKanaLockHandling);
-    
-  } else if (*t == _T("delay-of")) {
-    if (*getToken() != _T("!!!")) {
-      throw ErrorMessage()
-       << _T("there must be `!!!' after `def option delay-of'.");
-    }
-    
-    if (*getToken() != _T("=")) {
-      throw ErrorMessage()
-       << _T("there must be `=' after `def option delay-of !!!'.");
-    }
-    
-    load_ARGUMENT(&m_setting->m_oneShotRepeatableDelay);
-    
-  } else if (*t == _T("sts4mayu")) {
-    if (*getToken() != _T("=")) {
-      throw ErrorMessage()
-       << _T("there must be `=' after `def option sts4mayu'.");
-    }
-    
-    load_ARGUMENT(&m_setting->m_sts4mayu);
-    
-  } else if (*t == _T("cts4mayu")) {
-    if (*getToken() != _T("=")) {
-      throw ErrorMessage()
-       << _T("there must be `=' after `def option cts4mayu'.");
-    }
-    
-    load_ARGUMENT(&m_setting->m_cts4mayu);
-    
-  } else {
-    throw ErrorMessage() << _T("syntax error `def option ") << *t << _T("'.");
-  }
-}
-
-
-
-// <KEYBOARD_DEFINITION>
-void SettingLoader::load_KEYBOARD_DEFINITION()
-{
-  Token *t = getToken();
-    
-  // <DEFINE_KEY>
-  if (*t == _T("key")) load_DEFINE_KEY();
-
-  // <DEFINE_MODIFIER>
-  else if (*t == _T("mod")) load_DEFINE_MODIFIER();
-  
-  // <DEFINE_SYNC_KEY>
-  else if (*t == _T("sync")) load_DEFINE_SYNC_KEY();
-  
-  // <DEFINE_ALIAS>
-  else if (*t == _T("alias")) load_DEFINE_ALIAS();
-  
-  // <DEFINE_SUBSTITUTE>
-  else if (*t == _T("subst")) load_DEFINE_SUBSTITUTE();
-
-  // <DEFINE_OPTION>
-  else if (*t == _T("option")) load_DEFINE_OPTION();
-  
-  //
-  else throw ErrorMessage() << _T("syntax error `") << *t << _T("'.");
-}
-
-
-// <..._MODIFIER>
-Modifier SettingLoader::load_MODIFIER(
-  Modifier::Type i_mode, Modifier i_modifier, Modifier::Type *o_mode)
-{
-  if (o_mode)
-    *o_mode = Modifier::Type_begin;
-  
-  Modifier isModifierSpecified;
-  enum { PRESS, RELEASE, DONTCARE } flag = PRESS;
-
-  int i;
-  for (i = i_mode; i < Modifier::Type_ASSIGN; ++ i)
-  {
-    i_modifier.dontcare(Modifier::Type(i));
-    isModifierSpecified.on(Modifier::Type(i));
-  }
-  
-  Token *t = NULL;
-  
-  continue_loop:
-  while (!isEOL())
-  {
-    t = lookToken();
-
-    const static struct { const _TCHAR *m_s; Modifier::Type m_mt; } map[] =
-    {
-      // <BASIC_MODIFIER>
-      { _T("S-"),  Modifier::Type_Shift },
-      { _T("A-"),  Modifier::Type_Alt },
-      { _T("M-"),  Modifier::Type_Alt },
-      { _T("C-"),  Modifier::Type_Control },
-      { _T("W-"),  Modifier::Type_Windows },
-      // <KEYSEQ_MODIFIER>
-      { _T("U-"),  Modifier::Type_Up },
-      { _T("D-"),  Modifier::Type_Down },
-      // <ASSIGN_MODIFIER>
-      { _T("R-"),  Modifier::Type_Repeat },
-      { _T("IL-"), Modifier::Type_ImeLock },
-      { _T("IC-"), Modifier::Type_ImeComp },
-      { _T("I-"),  Modifier::Type_ImeComp },
-      { _T("NL-"), Modifier::Type_NumLock },
-      { _T("CL-"), Modifier::Type_CapsLock },
-      { _T("SL-"), Modifier::Type_ScrollLock },
-      { _T("KL-"), Modifier::Type_KanaLock },
-      { _T("MAX-"), Modifier::Type_Maximized },
-      { _T("MIN-"), Modifier::Type_Minimized },
-      { _T("MMAX-"), Modifier::Type_MdiMaximized },
-      { _T("MMIN-"), Modifier::Type_MdiMinimized },
-      { _T("T-"), Modifier::Type_Touchpad },
-      { _T("TS-"), Modifier::Type_TouchpadSticky },
-      { _T("M0-"), Modifier::Type_Mod0 },
-      { _T("M1-"), Modifier::Type_Mod1 },
-      { _T("M2-"), Modifier::Type_Mod2 },
-      { _T("M3-"), Modifier::Type_Mod3 },
-      { _T("M4-"), Modifier::Type_Mod4 },
-      { _T("M5-"), Modifier::Type_Mod5 },
-      { _T("M6-"), Modifier::Type_Mod6 },
-      { _T("M7-"), Modifier::Type_Mod7 },
-      { _T("M8-"), Modifier::Type_Mod8 },
-      { _T("M9-"), Modifier::Type_Mod9 },
-      { _T("L0-"), Modifier::Type_Lock0 },
-      { _T("L1-"), Modifier::Type_Lock1 },
-      { _T("L2-"), Modifier::Type_Lock2 },
-      { _T("L3-"), Modifier::Type_Lock3 },
-      { _T("L4-"), Modifier::Type_Lock4 },
-      { _T("L5-"), Modifier::Type_Lock5 },
-      { _T("L6-"), Modifier::Type_Lock6 },
-      { _T("L7-"), Modifier::Type_Lock7 },
-      { _T("L8-"), Modifier::Type_Lock8 },
-      { _T("L9-"), Modifier::Type_Lock9 },
-    };
-
-    for (int i = 0; i < NUMBER_OF(map); ++ i)
-      if (*t == map[i].m_s)
-      {
-       getToken();
-       Modifier::Type mt = map[i].m_mt;
-       if (static_cast<int>(i_mode) <= static_cast<int>(mt))
-         throw ErrorMessage() << _T("`") << *t
-                              << _T("': invalid modifier at this context.");
-       switch (flag)
-       {
-         case PRESS: i_modifier.press(mt); break;
-         case RELEASE: i_modifier.release(mt); break;
-         case DONTCARE: i_modifier.dontcare(mt); break;
-       }
-       isModifierSpecified.on(mt);
-       flag = PRESS;
-       
-       if (o_mode && *o_mode < mt)
-       {
-         if (mt < Modifier::Type_BASIC)
-           *o_mode = Modifier::Type_BASIC;
-         else if (mt < Modifier::Type_KEYSEQ)
-           *o_mode = Modifier::Type_KEYSEQ;
-         else if (mt < Modifier::Type_ASSIGN)
-           *o_mode = Modifier::Type_ASSIGN;
-       }
-       goto continue_loop;
-      }
-      
-    if (*t == _T("*"))
-    {
-      getToken();
-      flag = DONTCARE;
-      continue;
-    }
-      
-    if (*t == _T("~"))
-    {
-      getToken();
-      flag = RELEASE;
-      continue;
-    }
-
-    break;
-  }
-  
-  for (i = Modifier::Type_begin; i != Modifier::Type_end; ++ i)
-    if (!isModifierSpecified.isOn(Modifier::Type(i)))
-      switch (flag)
-      {
-       case PRESS: break;
-       case RELEASE: i_modifier.release(Modifier::Type(i)); break;
-       case DONTCARE: i_modifier.dontcare(Modifier::Type(i)); break;
-      }
-
-  // fix up and down
-  bool isDontcareUp   = i_modifier.isDontcare(Modifier::Type_Up);
-  bool isDontcareDown = i_modifier.isDontcare(Modifier::Type_Down);
-  bool isOnUp         = i_modifier.isOn(Modifier::Type_Up);
-  bool isOnDown       = i_modifier.isOn(Modifier::Type_Down);
-  if (isDontcareUp && isDontcareDown)
-    ;
-  else if (isDontcareUp)
-    i_modifier.on(Modifier::Type_Up, !isOnDown);
-  else if (isDontcareDown)
-    i_modifier.on(Modifier::Type_Down, !isOnUp);
-  else if (isOnUp == isOnDown)
-  {
-    i_modifier.dontcare(Modifier::Type_Up);
-    i_modifier.dontcare(Modifier::Type_Down);
-  }
-
-  // fix repeat
-  if (!isModifierSpecified.isOn(Modifier::Type_Repeat))
-    i_modifier.dontcare(Modifier::Type_Repeat);
-  return i_modifier;
-}
-
-
-// <KEY_NAME>
-Key *SettingLoader::load_KEY_NAME()
-{
-  Token *t = getToken();
-  Key *key = m_setting->m_keyboard.searchKey(t->getString());
-  if (!key)
-    throw ErrorMessage() << _T("`") << *t << _T("': invalid key name.");
-  return key;
-}
-
-
-// <KEYMAP_DEFINITION>
-void SettingLoader::load_KEYMAP_DEFINITION(const Token *i_which)
-{
-  Keymap::Type type = Keymap::Type_keymap;
-  Token *name = getToken();    // <KEYMAP_NAME>
-  tstringi windowClassName;
-  tstringi windowTitleName;
-  KeySeq *keySeq = NULL;
-  Keymap *parentKeymap = NULL;
-  bool isKeymap2 = false;
-  bool doesLoadDefaultKeySeq = false;
-
-  if (!isEOL())
-  {
-    Token *t = lookToken();
-    if (*i_which == _T("window"))      // <WINDOW>
-    {
-      if (t->isOpenParen())
-       // "(" <WINDOW_CLASS_NAME> "&&" <WINDOW_TITLE_NAME> ")"
-       // "(" <WINDOW_CLASS_NAME> "||" <WINDOW_TITLE_NAME> ")"
-      {
-       getToken();
-       windowClassName = getToken()->getRegexp();
-       t = getToken();
-       if (*t == _T("&&"))
-         type = Keymap::Type_windowAnd;
-       else if (*t == _T("||"))
-         type = Keymap::Type_windowOr;
-       else
-         throw ErrorMessage() << _T("`") << *t << _T("': unknown operator.");
-       windowTitleName = getToken()->getRegexp();
-       if (!getToken()->isCloseParen())
-         throw ErrorMessage() << _T("there must be `)'.");
-      }
-      else if (t->isRegexp())  // <WINDOW_CLASS_NAME>
-      {
-       getToken();
-       type = Keymap::Type_windowAnd;
-       windowClassName = t->getRegexp();
-      }
-    }
-    else if (*i_which == _T("keymap"))
-      ;
-    else if (*i_which == _T("keymap2"))
-      isKeymap2 = true;
-    else
-      ASSERT(false);
-    
-    if (!isEOL())
-      doesLoadDefaultKeySeq = true;
-  }
-
-  m_currentKeymap = m_setting->m_keymaps.add(
-    Keymap(type, name->getString(), windowClassName, windowTitleName,
-          NULL, NULL));
-
-  if (doesLoadDefaultKeySeq)
-  {
-    Token *t = lookToken();
-    // <KEYMAP_PARENT>
-    if (*t == _T(":"))
-    {
-      getToken();
-      t = getToken();
-      parentKeymap = m_setting->m_keymaps.searchByName(t->getString());
-      if (!parentKeymap)
-       throw ErrorMessage() << _T("`") << *t
-                            << _T("': unknown keymap name.");
-    }
-    if (!isEOL())
-    {
-      t = getToken();
-      if (!(*t == _T("=>") || *t == _T("=")))
-       throw ErrorMessage() << _T("`") << *t << _T("': syntax error.");
-      keySeq = SettingLoader::load_KEY_SEQUENCE();
-    }
-  }
-  if (keySeq == NULL)
-  {
-    FunctionData *fd;
-    if (type == Keymap::Type_keymap && !isKeymap2)
-      fd = createFunctionData(_T("KeymapParent"));
-    else if (type == Keymap::Type_keymap && !isKeymap2)
-      fd = createFunctionData(_T("Undefined"));
-    else // (type == Keymap::Type_windowAnd || type == Keymap::Type_windowOr)
-      fd = createFunctionData(_T("KeymapParent"));
-    ASSERT( fd );
-    keySeq = m_setting->m_keySeqs.add(
-      KeySeq(name->getString()).add(ActionFunction(fd)));
-  }
-
-  m_currentKeymap->setIfNotYet(keySeq, parentKeymap);
-}
-
-
-// &lt;ARGUMENT&gt;
-void SettingLoader::load_ARGUMENT(bool *o_arg)
-{
-  *o_arg = !(*getToken() == _T("false"));
-}
-
-
-// &lt;ARGUMENT&gt;
-void SettingLoader::load_ARGUMENT(int *o_arg)
-{
-  *o_arg = getToken()->getNumber();
-}
-
-
-// &lt;ARGUMENT&gt;
-void SettingLoader::load_ARGUMENT(unsigned int *o_arg)
-{
-  *o_arg = getToken()->getNumber();
-}
-
-
-// &lt;ARGUMENT&gt;
-void SettingLoader::load_ARGUMENT(long *o_arg)
-{
-  *o_arg = getToken()->getNumber();
-}
-
-
-// &lt;ARGUMENT&gt;
-void SettingLoader::load_ARGUMENT(unsigned __int64 *o_arg)
-{
-  *o_arg = getToken()->getNumber();
-}
-
-
-// &lt;ARGUMENT&gt;
-void SettingLoader::load_ARGUMENT(__int64 *o_arg)
-{
-  *o_arg = getToken()->getNumber();
-}
-
-
-// &lt;ARGUMENT&gt;
-void SettingLoader::load_ARGUMENT(tstringq *o_arg)
-{
-  *o_arg = getToken()->getString();
-}
-
-
-// &lt;ARGUMENT&gt;
-void SettingLoader::load_ARGUMENT(std::list<tstringq> *o_arg)
-{
-  while (true)
-  {
-    if (!lookToken()->isString())
-      return;
-    o_arg->push_back(getToken()->getString());
-    
-    if (!lookToken()->isComma())
-      return;
-    getToken();
-  }
-}
-
-
-// &lt;ARGUMENT&gt;
-void SettingLoader::load_ARGUMENT(tregex *o_arg)
-{
-  *o_arg = getToken()->getRegexp();
-}
-
-
-// &lt;ARGUMENT_VK&gt;
-void SettingLoader::load_ARGUMENT(VKey *o_arg)
-{
-  Token *t = getToken();
-  int vkey = 0;
-  while (true)
-  {
-    if (t->isNumber()) { vkey |= static_cast<BYTE>(t->getNumber()); break; }
-    else if (*t == _T("E-")) vkey |= VKey_extended;
-    else if (*t == _T("U-")) vkey |= VKey_released;
-    else if (*t == _T("D-")) vkey |= VKey_pressed;
-    else
-    {
-      const VKeyTable *vkt;
-      for (vkt = g_vkeyTable; vkt->m_name; ++ vkt)
-       if (*t == vkt->m_name)
-         break;
-      if (!vkt->m_name)
-       throw ErrorMessage() << _T("`") << *t
-                            << _T("': unknown virtual key name.");
-      vkey |= vkt->m_code;
-      break;
-    }
-    t = getToken();
-  }
-  if (!(vkey & VKey_released) && !(vkey & VKey_pressed))
-    vkey |= VKey_released | VKey_pressed;
-  *o_arg = static_cast<VKey>(vkey);
-}
-
-
-// &lt;ARGUMENT_WINDOW&gt;
-void SettingLoader::load_ARGUMENT(ToWindowType *o_arg)
-{
-  Token *t = getToken();
-  if (t->isNumber())
-  {
-    if (ToWindowType_toBegin <= t->getNumber())
-    {
-      *o_arg = static_cast<ToWindowType>(t->getNumber());
-      return;
-    }
-  }
-  else if (getTypeValue(o_arg, t->getString()))
-    return;
-  throw ErrorMessage() << _T("`") << *t << _T("': invalid target window.");
-}
-
-
-// &lt;ARGUMENT&gt;
-void SettingLoader::load_ARGUMENT(GravityType *o_arg)
-{
-  Token *t = getToken();
-  if (getTypeValue(o_arg, t->getString()))
-    return;
-  throw ErrorMessage() << _T("`") << *t << _T("': unknown gravity symbol.");
-}
-
-
-// &lt;ARGUMENT&gt;
-void SettingLoader::load_ARGUMENT(MouseHookType *o_arg)
-{
-  Token *t = getToken();
-  if (getTypeValue(o_arg, t->getString()))
-    return;
-  throw ErrorMessage() << _T("`") << *t << _T("': unknown MouseHookType symbol.");
-}
-
-
-// &lt;ARGUMENT&gt;
-void SettingLoader::load_ARGUMENT(MayuDialogType *o_arg)
-{
-  Token *t = getToken();
-  if (getTypeValue(o_arg, t->getString()))
-    return;
-  throw ErrorMessage() << _T("`") << *t << _T("': unknown dialog box.");
-}
-
-
-// &lt;ARGUMENT_LOCK&gt;
-void SettingLoader::load_ARGUMENT(ModifierLockType *o_arg)
-{
-  Token *t = getToken();
-  if (getTypeValue(o_arg, t->getString()))
-    return;
-  throw ErrorMessage() << _T("`") << *t << _T("': unknown lock name.");
-}
-
-
-// &lt;ARGUMENT_LOCK&gt;
-void SettingLoader::load_ARGUMENT(ToggleType *o_arg)
-{
-  Token *t = getToken();
-  if (getTypeValue(o_arg, t->getString()))
-    return;
-  throw ErrorMessage() << _T("`") << *t << _T("': unknown toggle name.");
-}
-
-
-// &lt;ARGUMENT_SHOW_WINDOW&gt;
-void SettingLoader::load_ARGUMENT(ShowCommandType *o_arg)
-{
-  Token *t = getToken();
-  if (getTypeValue(o_arg, t->getString()))
-    return;
-  throw ErrorMessage() << _T("`") << *t << _T("': unknown show command.");
-}
-
-
-// &lt;ARGUMENT_TARGET_WINDOW&gt;
-void SettingLoader::load_ARGUMENT(TargetWindowType *o_arg)
-{
-  Token *t = getToken();
-  if (getTypeValue(o_arg, t->getString()))
-    return;
-  throw ErrorMessage() << _T("`") << *t
-                      << _T("': unknown target window type.");
-}
-
-
-// &lt;bool&gt;
-void SettingLoader::load_ARGUMENT(BooleanType *o_arg)
-{
-  Token *t = getToken();
-  if (getTypeValue(o_arg, t->getString()))
-    return;
-  throw ErrorMessage() << _T("`") << *t << _T("': must be true or false.");
-}
-
-
-// &lt;ARGUMENT&gt;
-void SettingLoader::load_ARGUMENT(LogicalOperatorType *o_arg)
-{
-  Token *t = getToken();
-  if (getTypeValue(o_arg, t->getString()))
-    return;
-  throw ErrorMessage() << _T("`") << *t << _T("': must be 'or' or 'and'.");
-}
-
-
-// &lt;ARGUMENT&gt;
-void SettingLoader::load_ARGUMENT(Modifier *o_arg)
-{
-  Modifier modifier;
-  for (int i = Modifier::Type_begin; i != Modifier::Type_end; ++ i)
-    modifier.dontcare(static_cast<Modifier::Type>(i));
-  *o_arg = load_MODIFIER(Modifier::Type_ASSIGN, modifier);
-}
-
-
-// &lt;ARGUMENT&gt;
-void SettingLoader::load_ARGUMENT(const Keymap **o_arg)
-{
-  Token *t = getToken();
-  const Keymap *&keymap = *o_arg;
-  keymap = m_setting->m_keymaps.searchByName(t->getString());
-  if (!keymap)
-    throw ErrorMessage() << _T("`") << *t << _T("': unknown keymap name.");
-}
-
-
-// &lt;ARGUMENT&gt;
-void SettingLoader::load_ARGUMENT(const KeySeq **o_arg)
-{
-  Token *t = getToken();
-  const KeySeq *&keySeq = *o_arg;
-  if (t->isOpenParen())
-  {
-    keySeq = load_KEY_SEQUENCE(_T(""), true);
-    getToken(); // close paren
-  }
-  else if (*t == _T("$"))
-  {
-    t = getToken();
-    keySeq = m_setting->m_keySeqs.searchByName(t->getString());
-    if (!keySeq)
-      throw ErrorMessage() << _T("`$") << *t << _T("': unknown keyseq name.");
-  }
-  else
-    throw ErrorMessage() << _T("`") << *t << _T("': it is not keyseq.");
-}
-
-
-// &lt;ARGUMENT&gt;
-void SettingLoader::load_ARGUMENT(StrExprArg *o_arg)
-{
-  Token *t = getToken();
-  StrExprArg::Type type = StrExprArg::Literal;
-  if (*t == _T("$") && t->isQuoted() == false
-      && lookToken()->getType() == Token::Type_string)
-  {
-    type = StrExprArg::Builtin;
-    t = getToken();
-  }
-  *o_arg = StrExprArg(t->getString(), type);
-}
-
-
-// &lt;ARGUMENT&gt;
-void SettingLoader::load_ARGUMENT(WindowMonitorFromType *o_arg)
-{
-  Token *t = getToken();
-  if (getTypeValue(o_arg, t->getString()))
-    return;
-  throw ErrorMessage() << _T("`") << *t
-                      << _T("': unknown monitor from type.");
-}
-
-
-// <KEY_SEQUENCE>
-KeySeq *SettingLoader::load_KEY_SEQUENCE(
-  const tstringi &i_name, bool i_isInParen, Modifier::Type i_mode)
-{
-  KeySeq keySeq(i_name);
-  while (!isEOL())
-  {
-    Modifier::Type mode;
-    Modifier modifier = load_MODIFIER(i_mode, m_defaultKeySeqModifier, &mode);
-    keySeq.setMode(mode);
-    Token *t = lookToken();
-    if (t->isCloseParen() && i_isInParen)
-      break;
-    else if (t->isOpenParen())
-    {
-      getToken(); // open paren
-      KeySeq *ks = load_KEY_SEQUENCE(_T(""), true, i_mode);
-      getToken(); // close paren
-      keySeq.add(ActionKeySeq(ks));
-    }
-    else if (*t == _T("$")) // <KEYSEQ_NAME>
-    {
-      getToken();
-      t = getToken();
-      KeySeq *ks = m_setting->m_keySeqs.searchByName(t->getString());
-      if (ks == NULL)
-       throw ErrorMessage() << _T("`$") << *t
-                            << _T("': unknown keyseq name.");
-      if (!ks->isCorrectMode(i_mode))
-       throw ErrorMessage()
-         << _T("`$") << *t
-         << _T("': Some of R-, IL-, IC-, NL-, CL-, SL-, KL-, MAX-, MIN-, MMAX-, MMIN-, T-, TS-, M0...M9- and L0...L9- are used in the keyseq.  They are prohibited in this context.");
-      keySeq.setMode(ks->getMode());
-      keySeq.add(ActionKeySeq(ks));
-    }
-    else if (*t == _T("&")) // <FUNCTION_NAME>
-    {
-      getToken();
-      t = getToken();
-      
-      // search function
-      ActionFunction af(createFunctionData(t->getString()), modifier);
-      if (af.m_functionData == NULL)
-       throw ErrorMessage() << _T("`&") << *t
-                            << _T("': unknown function name.");
-      af.m_functionData->load(this);
-      keySeq.add(af);
-    }
-    else // <KEYSEQ_MODIFIED_KEY_NAME>
-    {
-      ModifiedKey mkey;
-      mkey.m_modifier = modifier;
-      mkey.m_key = load_KEY_NAME();
-      keySeq.add(ActionKey(mkey));
-    }
-  }
-  return m_setting->m_keySeqs.add(keySeq);
-}
-
-
-// <KEY_ASSIGN>
-void SettingLoader::load_KEY_ASSIGN()
-{
-  typedef std::list<ModifiedKey> AssignedKeys;
-  AssignedKeys assignedKeys;
-  
-  ModifiedKey mkey;
-  mkey.m_modifier =
-    load_MODIFIER(Modifier::Type_ASSIGN, m_defaultAssignModifier);
-  if (*lookToken() == _T("="))
-  {
-    getToken();
-    m_defaultKeySeqModifier = load_MODIFIER(Modifier::Type_KEYSEQ,
-                                           m_defaultKeySeqModifier);
-    m_defaultAssignModifier = mkey.m_modifier;
-    return;
-  }
-  
-  while (true)
-  {
-    mkey.m_key = load_KEY_NAME();
-    assignedKeys.push_back(mkey);
-    if (*lookToken() == _T("=>") || *lookToken() == _T("="))
-      break;
-    mkey.m_modifier =
-      load_MODIFIER(Modifier::Type_ASSIGN, m_defaultAssignModifier);
-  }
-  getToken();
-
-  ASSERT(m_currentKeymap);
-  KeySeq *keySeq = load_KEY_SEQUENCE();
-  for (AssignedKeys::iterator i = assignedKeys.begin();
-       i != assignedKeys.end(); ++ i)
-    m_currentKeymap->addAssignment(*i, keySeq);
-}
-
-
-// <EVENT_ASSIGN>
-void SettingLoader::load_EVENT_ASSIGN()
-{
-  std::list<ModifiedKey> assignedKeys;
-
-  ModifiedKey mkey;
-  mkey.m_modifier.dontcare();                  //set all modifiers to dontcare
-  
-  Token *t = getToken();
-  Key **e;
-  for (e = Event::events; *e; ++ e)
-    if (*t == (*e)->getName())
-    {
-      mkey.m_key = *e;
-      break;
-    }
-  if (!*e)
-    throw ErrorMessage() << _T("`") << *t << _T("': invalid event name.");
-
-  t = getToken();
-  if (!(*t == _T("=>") || *t == _T("=")))
-    throw ErrorMessage() << _T("`=' is expected.");
-
-  ASSERT(m_currentKeymap);
-  KeySeq *keySeq = load_KEY_SEQUENCE();
-  m_currentKeymap->addAssignment(mkey, keySeq);
-}
-
-
-// <MODIFIER_ASSIGNMENT>
-void SettingLoader::load_MODIFIER_ASSIGNMENT()
-{
-  // <MODIFIER_NAME>
-  Token *t = getToken();
-  Modifier::Type mt;
-
-  while (true)
-  {
-    Keymap::AssignMode am = Keymap::AM_notModifier;
-    if      (*t == _T("!")  ) am = Keymap::AM_true, t = getToken();
-    else if (*t == _T("!!") ) am = Keymap::AM_oneShot, t = getToken();
-    else if (*t == _T("!!!")) am = Keymap::AM_oneShotRepeatable, t = getToken();
-    
-    if      (*t == _T("shift")) mt = Modifier::Type_Shift;
-    else if (*t == _T("alt")  ||
-            *t == _T("meta") ||
-            *t == _T("menu") ) mt = Modifier::Type_Alt;
-    else if (*t == _T("control") ||
-            *t == _T("ctrl") ) mt = Modifier::Type_Control;
-    else if (*t == _T("windows") ||
-            *t == _T("win")  ) mt = Modifier::Type_Windows;
-    else if (*t == _T("mod0") ) mt = Modifier::Type_Mod0;
-    else if (*t == _T("mod1") ) mt = Modifier::Type_Mod1;
-    else if (*t == _T("mod2") ) mt = Modifier::Type_Mod2;
-    else if (*t == _T("mod3") ) mt = Modifier::Type_Mod3;
-    else if (*t == _T("mod4") ) mt = Modifier::Type_Mod4;
-    else if (*t == _T("mod5") ) mt = Modifier::Type_Mod5;
-    else if (*t == _T("mod6") ) mt = Modifier::Type_Mod6;
-    else if (*t == _T("mod7") ) mt = Modifier::Type_Mod7;
-    else if (*t == _T("mod8") ) mt = Modifier::Type_Mod8;
-    else if (*t == _T("mod9") ) mt = Modifier::Type_Mod9;
-    else throw ErrorMessage() << _T("`") << *t
-                             << _T("': invalid modifier name.");
-
-    if (am == Keymap::AM_notModifier)
-      break;
-    
-    m_currentKeymap->addModifier(mt, Keymap::AO_overwrite, am, NULL);
-    if (isEOL())
-      return;
-    t = getToken();
-  }
-  
-  // <ASSIGN_OP>
-  t = getToken();
-  Keymap::AssignOperator ao;
-  if      (*t == _T("=") ) ao = Keymap::AO_new;
-  else if (*t == _T("+=")) ao = Keymap::AO_add;
-  else if (*t == _T("-=")) ao = Keymap::AO_sub;
-  else  throw ErrorMessage() << _T("`") << *t << _T("': is unknown operator.");
-
-  // <ASSIGN_MODE>? <KEY_NAME>
-  while (!isEOL())
-  {
-    // <ASSIGN_MODE>? 
-    t = getToken();
-    Keymap::AssignMode am = Keymap::AM_normal;
-    if      (*t == _T("!")  ) am = Keymap::AM_true, t = getToken();
-    else if (*t == _T("!!") ) am = Keymap::AM_oneShot, t = getToken();
-    else if (*t == _T("!!!")) am = Keymap::AM_oneShotRepeatable, t = getToken();
-    
-    // <KEY_NAME>
-    Key *key = m_setting->m_keyboard.searchKey(t->getString());
-    if (!key)
-      throw ErrorMessage() << _T("`") << *t << _T("': invalid key name.");
-
-    // we can ignore warning C4701
-    m_currentKeymap->addModifier(mt, ao, am, key);
-    if (ao == Keymap::AO_new)
-      ao = Keymap::AO_add;
-  }
-}
-
-
-// <KEYSEQ_DEFINITION>
-void SettingLoader::load_KEYSEQ_DEFINITION()
-{
-  if (*getToken() != _T("$"))
-    throw ErrorMessage() << _T("there must be `$' after `keyseq'");
-  Token *name = getToken();
-  if (*getToken() != _T("="))
-    throw ErrorMessage() << _T("there must be `=' after keyseq naem");
-  load_KEY_SEQUENCE(name->getString(), false, Modifier::Type_ASSIGN);
-}
-
-
-// <DEFINE>
-void SettingLoader::load_DEFINE()
-{
-  m_setting->m_symbols.insert(getToken()->getString());
-}
-
-
-// <IF>
-void SettingLoader::load_IF()
-{
-  if (!getToken()->isOpenParen())
-    throw ErrorMessage() << _T("there must be `(' after `if'.");
-  Token *t = getToken(); // <SYMBOL> or !
-  bool not = false;
-  if (*t == _T("!"))
-  {
-    not = true;
-    t = getToken(); // <SYMBOL>
-  }
-  
-  bool doesSymbolExist = (m_setting->m_symbols.find(t->getString())
-                         != m_setting->m_symbols.end());
-  bool doesRead = ((doesSymbolExist && !not) ||
-                  (!doesSymbolExist && not));
-  if (0 < m_canReadStack.size())
-    doesRead = doesRead && m_canReadStack.back();
-  
-  if (!getToken()->isCloseParen())
-    throw ErrorMessage() << _T("there must be `)'.");
-
-  m_canReadStack.push_back(doesRead);
-  if (!isEOL())
-  {
-    size_t len = m_canReadStack.size();
-    load_LINE();
-    if (len < m_canReadStack.size())
-    {
-      bool r = m_canReadStack.back();
-      m_canReadStack.pop_back();
-      m_canReadStack[len - 1] = r && doesRead;
-    }
-    else if (len == m_canReadStack.size())
-      m_canReadStack.pop_back();
-    else
-      ; // `end' found
-  }
-}
-
-
-// <ELSE> <ELSEIF>
-void SettingLoader::load_ELSE(bool i_isElseIf, const tstringi &i_token)
-{
-  bool doesRead = !load_ENDIF(i_token);
-  if (0 < m_canReadStack.size())
-    doesRead = doesRead && m_canReadStack.back();
-  m_canReadStack.push_back(doesRead);
-  if (!isEOL())
-  {
-    size_t len = m_canReadStack.size();
-    if (i_isElseIf)
-      load_IF();
-    else
-      load_LINE();
-    if (len < m_canReadStack.size())
-    {
-      bool r = m_canReadStack.back();
-      m_canReadStack.pop_back();
-      m_canReadStack[len - 1] = doesRead && r;
-    }
-    else if (len == m_canReadStack.size())
-      m_canReadStack.pop_back();
-    else
-      ; // `end' found
-  }
-}
-
-
-// <ENDIF>
-bool SettingLoader::load_ENDIF(const tstringi &i_token)
-{
-  if (m_canReadStack.size() == 0)
-    throw ErrorMessage() << _T("unbalanced `") << i_token << _T("'");
-  bool r = m_canReadStack.back();
-  m_canReadStack.pop_back();
-  return r;
-}
-
-
-// <LINE>
-void SettingLoader::load_LINE()
-{
-  Token *i_token = getToken();
-
-  // <COND_SYMBOL>
-  if      (*i_token == _T("if") ||
-          *i_token == _T("and")) load_IF();
-  else if (*i_token == _T("else")) load_ELSE(false, i_token->getString());
-  else if (*i_token == _T("elseif") ||
-          *i_token == _T("elsif")  ||
-          *i_token == _T("elif")   ||
-          *i_token == _T("or")) load_ELSE(true, i_token->getString());
-  else if (*i_token == _T("endif")) load_ENDIF(_T("endif"));
-  else if (0 < m_canReadStack.size() && !m_canReadStack.back())
-  {
-    while (!isEOL())
-      getToken();
-  }
-  else if (*i_token == _T("define")) load_DEFINE();
-  // <INCLUDE>
-  else if (*i_token == _T("include")) load_INCLUDE();
-  // <KEYBOARD_DEFINITION>
-  else if (*i_token == _T("def")) load_KEYBOARD_DEFINITION();
-  // <KEYMAP_DEFINITION>
-  else if (*i_token == _T("keymap")  ||
-          *i_token == _T("keymap2") ||
-          *i_token == _T("window")) load_KEYMAP_DEFINITION(i_token);
-  // <KEY_ASSIGN>
-  else if (*i_token == _T("key")) load_KEY_ASSIGN();
-  // <EVENT_ASSIGN>
-  else if (*i_token == _T("event")) load_EVENT_ASSIGN();
-  // <MODIFIER_ASSIGNMENT>
-  else if (*i_token == _T("mod")) load_MODIFIER_ASSIGNMENT();
-  // <KEYSEQ_DEFINITION>
-  else if (*i_token == _T("keyseq")) load_KEYSEQ_DEFINITION();
-  else
-    throw ErrorMessage() << _T("syntax error `") << *i_token << _T("'.");
-}
-
-  
-// prefix sort predicate used in load(const string &)
-static bool prefixSortPred(const tstringi &i_a, const tstringi &i_b)
-{
-  return i_b.size() < i_a.size();
-}
-
-
-/*
-  _UNICODE: read file (UTF-16 LE/BE, UTF-8, locale specific multibyte encoding)
-  _MBCS: read file
-*/
-bool readFile(tstring *o_data, const tstringi &i_filename)
-{
-  // get size of file
-#if 0
-  // bcc's _wstat cannot obtain file size
-  struct _stat sbuf;
-  if (_tstat(i_filename.c_str(), &sbuf) < 0 || sbuf.st_size == 0)
-    return false;
-#else
-  // so, we use _wstati64 for bcc
-  struct stati64_t sbuf;
-  if (_tstati64(i_filename.c_str(), &sbuf) < 0 || sbuf.st_size == 0)
-    return false;
-  // following check is needed to cast sbuf.st_size to size_t safely
-  // this cast occurs because of above workaround for bcc
-  if (sbuf.st_size > UINT_MAX)
-    return false;
-#endif
-  
-  // open
-  FILE *fp = _tfopen(i_filename.c_str(), _T("rb"));
-  if (!fp)
-    return false;
-  
-  // read file
-  Array<BYTE> buf(static_cast<size_t>(sbuf.st_size) + 1);
-  if (fread(buf.get(), static_cast<size_t>(sbuf.st_size), 1, fp) != 1)
-  {
-    fclose(fp);
-    return false;
-  }
-  buf.get()[sbuf.st_size] = 0;                 // mbstowcs() requires null
-                                               // terminated string
-
-#ifdef _UNICODE
-  //
-  if (buf.get()[0] == 0xffU && buf.get()[1] == 0xfeU &&
-      sbuf.st_size % 2 == 0)
-    // UTF-16 Little Endien
-  {
-    size_t size = static_cast<size_t>(sbuf.st_size) / 2;
-    o_data->resize(size);
-    BYTE *p = buf.get();
-    for (size_t i = 0; i < size; ++ i)
-    {
-      wchar_t c = static_cast<wchar_t>(*p ++);
-      c |= static_cast<wchar_t>(*p ++) << 8;
-      (*o_data)[i] = c;
-    }
-    fclose(fp);
-    return true;
-  }
-  
-  //
-  if (buf.get()[0] == 0xfeU && buf.get()[1] == 0xffU &&
-      sbuf.st_size % 2 == 0)
-    // UTF-16 Big Endien
-  {
-    size_t size = static_cast<size_t>(sbuf.st_size) / 2;
-    o_data->resize(size);
-    BYTE *p = buf.get();
-    for (size_t i = 0; i < size; ++ i)
-    {
-      wchar_t c = static_cast<wchar_t>(*p ++) << 8;
-      c |= static_cast<wchar_t>(*p ++);
-      (*o_data)[i] = c;
-    }
-    fclose(fp);
-    return true;
-  }
-
-  // try multibyte charset 
-  size_t wsize = mbstowcs(NULL, reinterpret_cast<char *>(buf.get()), 0);
-  if (wsize != size_t(-1))
-  {
-    Array<wchar_t> wbuf(wsize);
-    mbstowcs(wbuf.get(), reinterpret_cast<char *>(buf.get()), wsize);
-    o_data->assign(wbuf.get(), wbuf.get() + wsize);
-    fclose(fp);
-    return true;
-  }
-  
-  // try UTF-8
-  {
-    Array<wchar_t> wbuf(static_cast<size_t>(sbuf.st_size));
-    BYTE *f = buf.get();
-    BYTE *end = buf.get() + sbuf.st_size;
-    wchar_t *d = wbuf.get();
-    enum { STATE_1, STATE_2of2, STATE_2of3, STATE_3of3 } state = STATE_1;
-    
-    while (f != end)
-    {
-      switch (state)
-      {
-       case STATE_1:
-         if (!(*f & 0x80))                     // 0xxxxxxx: 00-7F
-           *d++ = static_cast<wchar_t>(*f++);
-         else if ((*f & 0xe0) == 0xc0)         // 110xxxxx 10xxxxxx: 0080-07FF
-         {
-           *d = ((static_cast<wchar_t>(*f++) & 0x1f) << 6);
-           state = STATE_2of2;
-         }
-         else if ((*f & 0xf0) == 0xe0)         // 1110xxxx 10xxxxxx 10xxxxxx:
-                                               // 0800 - FFFF
-         {
-           *d = ((static_cast<wchar_t>(*f++) & 0x0f) << 12);
-           state = STATE_2of3;
-         }
-         else
-           goto not_UTF_8;
-         break;
-         
-       case STATE_2of2:
-       case STATE_3of3:
-         if ((*f & 0xc0) != 0x80)
-           goto not_UTF_8;
-         *d++ |= (static_cast<wchar_t>(*f++) & 0x3f);
-         state = STATE_1;
-         break;
-
-       case STATE_2of3:
-         if ((*f & 0xc0) != 0x80)
-           goto not_UTF_8;
-         *d |= ((static_cast<wchar_t>(*f++) & 0x3f) << 6);
-         state = STATE_3of3;
-         break;
-      }
-    }
-    o_data->assign(wbuf.get(), d);
-    fclose(fp);
-    return true;
-    
-    not_UTF_8: ;
-  }
-#endif // _UNICODE
-
-  // assume ascii
-  o_data->resize(static_cast<size_t>(sbuf.st_size));
-  for (off_t i = 0; i < sbuf.st_size; ++ i)
-    (*o_data)[i] = buf.get()[i];
-  fclose(fp);
-  return true;
-}
-
-
-// load (called from load(Setting *, const tstringi &) only)
-void SettingLoader::load(const tstringi &i_filename)
-{
-  m_currentFilename = i_filename;
-  
-  tstring data;
-  if (!readFile(&data, m_currentFilename))
-  {
-    Acquire a(m_soLog);
-    *m_log << m_currentFilename << _T(" : error: file not found") << std::endl;
-#if 1
-    *m_log << data << std::endl;
-#endif
-    m_isThereAnyError = true;
-    return;
-  }
-  
-  // prefix
-  if (m_prefixesRefCcount == 0)
-  {
-    static const _TCHAR *prefixes[] =
-    {
-      _T("="), _T("=>"), _T("&&"), _T("||"), _T(":"), _T("$"), _T("&"),
-      _T("-="), _T("+="), _T("!!!"), _T("!!"), _T("!"), 
-      _T("E0-"), _T("E1-"),                    // <SCAN_CODE_EXTENTION>
-      _T("S-"), _T("A-"), _T("M-"), _T("C-"),  // <BASIC_MODIFIER>
-      _T("W-"), _T("*"), _T("~"),
-      _T("U-"), _T("D-"),                      // <KEYSEQ_MODIFIER>
-      _T("R-"), _T("IL-"), _T("IC-"), _T("I-"),        // <ASSIGN_MODIFIER>
-      _T("NL-"), _T("CL-"), _T("SL-"), _T("KL-"),
-      _T("MAX-"), _T("MIN-"), _T("MMAX-"), _T("MMIN-"),
-      _T("T-"), _T("TS-"),
-      _T("M0-"), _T("M1-"), _T("M2-"), _T("M3-"), _T("M4-"),
-      _T("M5-"), _T("M6-"), _T("M7-"), _T("M8-"), _T("M9-"), 
-      _T("L0-"), _T("L1-"), _T("L2-"), _T("L3-"), _T("L4-"),
-      _T("L5-"), _T("L6-"), _T("L7-"), _T("L8-"), _T("L9-"), 
-    };
-    m_prefixes = new std::vector<tstringi>;
-    for (size_t i = 0; i < NUMBER_OF(prefixes); ++ i)
-      m_prefixes->push_back(prefixes[i]);
-    std::sort(m_prefixes->begin(), m_prefixes->end(), prefixSortPred);
-  }
-  m_prefixesRefCcount ++;
-
-  // create parser
-  Parser parser(data.c_str(), data.size());
-  parser.setPrefixes(m_prefixes);
-    
-  while (true)
-  {
-    try
-    {
-      if (!parser.getLine(&m_tokens))
-       break;
-      m_ti = m_tokens.begin();
-    }
-    catch (ErrorMessage &e)
-    {
-      if (m_log && m_soLog)
-      {
-       Acquire a(m_soLog);
-       *m_log << m_currentFilename << _T("(") << parser.getLineNumber()
-              << _T(") : error: ") << e << std::endl;
-      }
-      m_isThereAnyError = true;
-      continue;
-    }
-      
-    try
-    {
-      load_LINE();
-      if (!isEOL())
-       throw WarningMessage() << _T("back garbage is ignored.");
-    }
-    catch (WarningMessage &w)
-    {
-      if (m_log && m_soLog)
-      {
-       Acquire a(m_soLog);
-       *m_log << i_filename << _T("(") << parser.getLineNumber()
-              << _T(") : warning: ") << w << std::endl;
-      }
-    }
-    catch (ErrorMessage &e)
-    {
-      if (m_log && m_soLog)
-      {
-       Acquire a(m_soLog);
-       *m_log << i_filename << _T("(") << parser.getLineNumber()
-              << _T(") : error: ") << e << std::endl;
-      }
-      m_isThereAnyError = true;
-    }
-  }
-    
-  // m_prefixes
-  -- m_prefixesRefCcount;
-  if (m_prefixesRefCcount == 0)
-    delete m_prefixes;
-
-  if (0 < m_canReadStack.size())
-  {
-    Acquire a(m_soLog);
-    *m_log << m_currentFilename << _T("(") << parser.getLineNumber()
-          << _T(") : error: unbalanced `if'.  ")
-          << _T("you forget `endif', didn'i_token you?")
-          << std::endl;
-    m_isThereAnyError = true;
-  }
-}
-
-
-// is the filename readable ?
-bool SettingLoader::isReadable(const tstringi &i_filename,
-                              int i_debugLevel) const 
-{
-  if (i_filename.empty())
-    return false;
-#ifdef UNICODE
-  tifstream ist(to_string(i_filename).c_str());
-#else
-  tifstream ist(i_filename.c_str());
-#endif
-  if (ist.good())
-  {
-    if (m_log && m_soLog)
-    {
-               Acquire a(m_soLog, 0);
-      *m_log << _T("  loading: ") << i_filename << std::endl;
-    }
-    return true;
-  }
-  else
-  {
-    if (m_log && m_soLog)
-    {
-      Acquire a(m_soLog, i_debugLevel);
-      *m_log << _T("not found: ") << i_filename << std::endl;
-    }
-    return false;
-  }
-}
-
-#if 0
-// get filename from registry
-bool SettingLoader::getFilenameFromRegistry(tstringi *o_path) const
-{
-  // get from registry
-  Registry reg(MAYU_REGISTRY_ROOT);
-  int index;
-  reg.read(_T(".mayuIndex"), &index, 0);
-  char buf[100];
-  snprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), index);
-  if (!reg.read(buf, o_path))
-    return false;
-
-  // parse registry entry
-  Regexp getFilename(_T("^[^;]*;([^;]*);(.*)$"));
-  if (!getFilename.doesMatch(*o_path))
-    return false;
-  
-  tstringi path = getFilename[1];
-  tstringi options = getFilename[2];
-  
-  if (!(0 < path.size() && isReadable(path)))
-    return false;
-  *o_path = path;
-  
-  // set symbols
-  Regexp symbol(_T("-D([^;]*)"));
-  while (symbol.doesMatch(options))
-  {
-    m_setting->symbols.insert(symbol[1]);
-    options = options.substr(symbol.subBegin(1));
-  }
-  
-  return true;
-}
-#endif
-
-
-// get filename
-bool SettingLoader::getFilename(const tstringi &i_name, tstringi *o_path,
-                               int i_debugLevel) const
-{
-  // the default filename is ".mayu"
-  const tstringi &name = i_name.empty() ? tstringi(_T(".mayu")) : i_name;
-  
-  bool isFirstTime = true;
-
-  while (true)
-  {
-    // find file from registry
-    if (i_name.empty())                                // called not from 'include'
-    {
-      Setting::Symbols symbols;
-      if (getFilenameFromRegistry(NULL, o_path, &symbols))
-      {
-       if (o_path->empty())
-         // find file from home directory
-       {
-         HomeDirectories pathes;
-         getHomeDirectories(&pathes);
-         for (HomeDirectories::iterator
-                i = pathes.begin(); i != pathes.end(); ++ i)
-         {
-           *o_path = *i + _T("\\") + name;
-           if (isReadable(*o_path, i_debugLevel))
-             goto add_symbols;
-         }
-         return false;
-       }
-       else
-       {
-         if (!isReadable(*o_path, i_debugLevel))
-           return false;
-       }
-       add_symbols:
-       for (Setting::Symbols::iterator
-              i = symbols.begin(); i != symbols.end(); ++ i)
-         m_setting->m_symbols.insert(*i);
-       return true;
-      }
-    }
-    
-    if (!isFirstTime)
-      return false;
-    
-    // find file from home directory
-    HomeDirectories pathes;
-    getHomeDirectories(&pathes);
-    for (HomeDirectories::iterator i = pathes.begin(); i != pathes.end(); ++ i)
-    {
-      *o_path = *i + _T("\\") + name;
-      if (isReadable(*o_path, i_debugLevel))
-       return true;
-    }
-    
-    if (!i_name.empty())
-      return false;                            // called by 'include'
-    
-    if (!DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_setting),
-                  NULL, dlgSetting_dlgProc))
-      return false;
-  }
-}
-
-
-// constructor
-SettingLoader::SettingLoader(SyncObject *i_soLog, tostream *i_log)
-  : m_setting(NULL),
-    m_isThereAnyError(false),
-    m_soLog(i_soLog),
-    m_log(i_log),
-    m_currentKeymap(NULL)
-{
-  m_defaultKeySeqModifier =
-    m_defaultAssignModifier.release(Modifier::Type_ImeComp);
-}
-
-
-/* load m_setting
-   If called by "include", 'filename' describes filename.
-   Otherwise the 'filename' is empty.
- */
-bool SettingLoader::load(Setting *i_setting, const tstringi &i_filename)
-{
-  m_setting = i_setting;
-  m_isThereAnyError = false;
-    
-  tstringi path;
-  if (!getFilename(i_filename, &path))
-  {
-    if (i_filename.empty())
-    {
-      Acquire a(m_soLog);
-      getFilename(i_filename, &path, 0);       // show filenames
-      return false;
-    }
-    else
-      throw ErrorMessage() << _T("`") << i_filename
-                          << _T("': no such file or other error.");
-  }
-
-  // create global keymap's default keySeq
-  ActionFunction af(createFunctionData(_T("OtherWindowClass")));
-  KeySeq *globalDefault = m_setting->m_keySeqs.add(KeySeq(_T("")).add(af));
-  
-  // add default keymap
-  m_currentKeymap = m_setting->m_keymaps.add(
-    Keymap(Keymap::Type_windowOr, _T("Global"), _T(""), _T(""),
-          globalDefault, NULL));
-
-  /*
-  // add keyboard layout name
-  if (filename.empty())
-  {
-    char keyboardLayoutName[KL_NAMELENGTH];
-    if (GetKeyboardLayoutName(keyboardLayoutName))
-    {
-      tstringi kl = tstringi(_T("KeyboardLayout/")) + keyboardLayoutName;
-      m_setting->symbols.insert(kl);
-      Acquire a(m_soLog);
-      *m_log << _T("KeyboardLayout: ") << kl << std::endl;
-    }
-  }
-  */
-  
-  // load
-  load(path);
-
-  // finalize
-  if (i_filename.empty())
-    m_setting->m_keymaps.adjustModifier(m_setting->m_keyboard);
-  
-  return !m_isThereAnyError;
-}
-
-
-std::vector<tstringi> *SettingLoader::m_prefixes; // m_prefixes terminal symbol
-size_t SettingLoader::m_prefixesRefCcount;     /* reference count of
-                                                  m_prefixes */
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// setting.cpp\r
+\r
+\r
+#include "misc.h"\r
+\r
+#include "dlgsetting.h"\r
+#include "errormessage.h"\r
+#include "mayu.h"\r
+#include "mayurc.h"\r
+#include "registry.h"\r
+#include "setting.h"\r
+#include "windowstool.h"\r
+#include "vkeytable.h"\r
+#include "array.h"\r
+\r
+#include <algorithm>\r
+#include <fstream>\r
+#include <iomanip>\r
+#include <sys/stat.h>\r
+\r
+\r
+namespace Event\r
+{\r
+  Key prefixed(_T("prefixed"));\r
+  Key before_key_down(_T("before-key-down"));\r
+  Key after_key_up(_T("after-key-up"));\r
+  Key *events[] =\r
+  {\r
+    &prefixed,\r
+    &before_key_down,\r
+    &after_key_up,\r
+    NULL,\r
+  };\r
+}\r
+\r
+\r
+// get mayu filename\r
+static bool getFilenameFromRegistry(\r
+  tstringi *o_name, tstringi *o_filename, Setting::Symbols *o_symbols)\r
+{\r
+  Registry reg(MAYU_REGISTRY_ROOT);\r
+  int index;\r
+  reg.read(_T(".mayuIndex"), &index, 0);\r
+  _TCHAR buf[100];\r
+  _sntprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), index);\r
+\r
+  tstringi entry;\r
+  if (!reg.read(buf, &entry))\r
+    return false;\r
+  \r
+  tregex getFilename(_T("^([^;]*);([^;]*);(.*)$"));\r
+  tsmatch getFilenameResult;\r
+  if (!boost::regex_match(entry, getFilenameResult, getFilename))\r
+    return false;\r
+  \r
+  if (o_name)\r
+    *o_name = getFilenameResult.str(1);\r
+  if (o_filename)\r
+    *o_filename = getFilenameResult.str(2);\r
+  if (o_symbols)\r
+  {\r
+    tstringi symbols = getFilenameResult.str(3);\r
+    tregex symbol(_T("-D([^;]*)(.*)$"));\r
+    tsmatch symbolResult;\r
+    while (boost::regex_search(symbols, symbolResult, symbol))\r
+    {\r
+      o_symbols->insert(symbolResult.str(1));\r
+      symbols = symbolResult.str(2);\r
+    }\r
+  }\r
+  return true;\r
+}\r
+\r
+\r
+// get home directory path\r
+void getHomeDirectories(HomeDirectories *o_pathes)\r
+{\r
+  tstringi filename;\r
+#ifndef USE_INI\r
+  if (getFilenameFromRegistry(NULL, &filename, NULL) &&\r
+      !filename.empty())\r
+  {\r
+    tregex getPath(_T("^(.*[/\\\\])[^/\\\\]*$"));\r
+    tsmatch getPathResult;\r
+    if (boost::regex_match(filename, getPathResult, getPath))\r
+      o_pathes->push_back(getPathResult.str(1));\r
+  }\r
+  \r
+  const _TCHAR *home = _tgetenv(_T("HOME"));\r
+  if (home)\r
+    o_pathes->push_back(home);\r
+\r
+  const _TCHAR *homedrive = _tgetenv(_T("HOMEDRIVE"));\r
+  const _TCHAR *homepath = _tgetenv(_T("HOMEPATH"));\r
+  if (homedrive && homepath)\r
+    o_pathes->push_back(tstringi(homedrive) + homepath);\r
+  \r
+  const _TCHAR *userprofile = _tgetenv(_T("USERPROFILE"));\r
+  if (userprofile)\r
+    o_pathes->push_back(userprofile);\r
+  \r
+  _TCHAR buf[GANA_MAX_PATH];\r
+  DWORD len = GetCurrentDirectory(NUMBER_OF(buf), buf);\r
+  if (0 < len && len < NUMBER_OF(buf))\r
+    o_pathes->push_back(buf);\r
+#else //USE_INI\r
+  _TCHAR buf[GANA_MAX_PATH];\r
+#endif //USE_INI\r
+\r
+  if (GetModuleFileName(GetModuleHandle(NULL), buf, NUMBER_OF(buf)))\r
+    o_pathes->push_back(pathRemoveFileSpec(buf));\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// SettingLoader\r
+\r
+\r
+// is there no more tokens ?\r
+bool SettingLoader::isEOL()\r
+{\r
+  return m_ti == m_tokens.end();\r
+}\r
+\r
+\r
+// get next token\r
+Token *SettingLoader::getToken()\r
+{\r
+  if (isEOL())\r
+    throw ErrorMessage() << _T("too few words.");\r
+  return &*(m_ti ++);\r
+}\r
+\r
+  \r
+// look next token\r
+Token *SettingLoader::lookToken()\r
+{\r
+  if (isEOL())\r
+    throw ErrorMessage() << _T("too few words.");\r
+  return &*m_ti;\r
+}\r
+\r
+\r
+// argument "("\r
+bool SettingLoader::getOpenParen(bool i_doesThrow, const _TCHAR *i_name)\r
+{\r
+  if (!isEOL() && lookToken()->isOpenParen())\r
+  {\r
+    getToken();\r
+    return true;\r
+  }\r
+  if (i_doesThrow)\r
+    throw ErrorMessage() << _T("there must be `(' after `&")\r
+                        << i_name << _T("'.");\r
+  return false;\r
+}\r
+\r
+\r
+// argument ")"\r
+bool SettingLoader::getCloseParen(bool i_doesThrow, const _TCHAR *i_name)\r
+{\r
+  if (!isEOL() && lookToken()->isCloseParen())\r
+  {\r
+    getToken();\r
+    return true;\r
+  }\r
+  if (i_doesThrow)\r
+    throw ErrorMessage() << _T("`&")  << i_name\r
+                        << _T("': too many arguments.");\r
+  return false;\r
+}\r
+\r
+\r
+// argument ","\r
+bool SettingLoader::getComma(bool i_doesThrow, const _TCHAR *i_name)\r
+{\r
+  if (!isEOL() && lookToken()->isComma())\r
+  {\r
+    getToken();\r
+    return true;\r
+  }\r
+  if (i_doesThrow)\r
+    throw ErrorMessage() << _T("`&")  << i_name\r
+                        << _T("': comma expected.");\r
+  return false;\r
+}\r
+\r
+\r
+// <INCLUDE>\r
+void SettingLoader::load_INCLUDE()\r
+{\r
+  SettingLoader loader(m_soLog, m_log);\r
+  loader.m_defaultAssignModifier = m_defaultAssignModifier;\r
+  loader.m_defaultKeySeqModifier = m_defaultKeySeqModifier;\r
+  if (!loader.load(m_setting, (*getToken()).getString()))\r
+    m_isThereAnyError = true;\r
+}\r
+\r
+\r
+// <SCAN_CODES>\r
+void SettingLoader::load_SCAN_CODES(Key *o_key)\r
+{\r
+  for (int j = 0; j < Key::MAX_SCAN_CODES_SIZE && !isEOL(); ++ j)\r
+  {\r
+    ScanCode sc;\r
+    sc.m_flags = 0;\r
+    while (true)\r
+    {\r
+      Token *t = getToken();\r
+      if (t->isNumber())\r
+      {\r
+       sc.m_scan = (u_char)t->getNumber();\r
+       o_key->addScanCode(sc);\r
+       break;\r
+      }\r
+      if      (*t == _T("E0-")) sc.m_flags |= ScanCode::E0;\r
+      else if (*t == _T("E1-")) sc.m_flags |= ScanCode::E1;\r
+      else  throw ErrorMessage() << _T("`") << *t\r
+                                << _T("': invalid modifier.");\r
+    }\r
+  }\r
+}\r
+\r
+\r
+// <DEFINE_KEY>\r
+void SettingLoader::load_DEFINE_KEY()\r
+{\r
+  Token *t = getToken();\r
+  Key key;\r
+      \r
+  // <KEY_NAMES>\r
+  if (*t == _T('('))\r
+  {\r
+    key.addName(getToken()->getString());\r
+    while (t = getToken(), *t != _T(')'))\r
+      key.addName(t->getString());\r
+    if (*getToken() != _T("="))\r
+      throw ErrorMessage() << _T("there must be `=' after `)'.");\r
+  }\r
+  else\r
+  {\r
+    key.addName(t->getString());\r
+    while (t = getToken(), *t != _T("="))\r
+      key.addName(t->getString());\r
+  }\r
+\r
+  load_SCAN_CODES(&key);\r
+  m_setting->m_keyboard.addKey(key);\r
+}\r
+\r
+\r
+// <DEFINE_MODIFIER>\r
+void SettingLoader::load_DEFINE_MODIFIER()\r
+{\r
+  Token *t = getToken();\r
+  Modifier::Type mt;\r
+  if      (*t == _T("shift")  ) mt = Modifier::Type_Shift;\r
+  else if (*t == _T("alt")     ||\r
+          *t == _T("meta")    ||\r
+          *t == _T("menu")   ) mt = Modifier::Type_Alt;\r
+  else if (*t == _T("control") ||\r
+          *t == _T("ctrl")   ) mt = Modifier::Type_Control;\r
+  else if (*t == _T("windows") ||\r
+          *t == _T("win")    ) mt = Modifier::Type_Windows;\r
+  else throw ErrorMessage() << _T("`") << *t\r
+                           << _T("': invalid modifier name.");\r
+    \r
+  if (*getToken() != _T("="))\r
+    throw ErrorMessage() << _T("there must be `=' after modifier name.");\r
+    \r
+  while (!isEOL())\r
+  {\r
+    t = getToken();\r
+    Key *key =\r
+      m_setting->m_keyboard.searchKeyByNonAliasName(t->getString());\r
+    if (!key)\r
+      throw ErrorMessage() << _T("`") << *t << _T("': invalid key name.");\r
+    m_setting->m_keyboard.addModifier(mt, key);\r
+  }\r
+}\r
+\r
+\r
+// <DEFINE_SYNC_KEY>\r
+void SettingLoader::load_DEFINE_SYNC_KEY()\r
+{\r
+  Key *key = m_setting->m_keyboard.getSyncKey();\r
+  key->initialize();\r
+  key->addName(_T("sync"));\r
+  \r
+  if (*getToken() != _T("="))\r
+    throw ErrorMessage() << _T("there must be `=' after `sync'.");\r
+  \r
+  load_SCAN_CODES(key);\r
+}\r
+\r
+\r
+// <DEFINE_ALIAS>\r
+void SettingLoader::load_DEFINE_ALIAS()\r
+{\r
+  Token *name = getToken();\r
+  \r
+  if (*getToken() != _T("="))\r
+    throw ErrorMessage() << _T("there must be `=' after `alias'.");\r
+\r
+  Token *t = getToken();\r
+  Key *key = m_setting->m_keyboard.searchKeyByNonAliasName(t->getString());\r
+  if (!key)\r
+    throw ErrorMessage() << _T("`") << *t << _T("': invalid key name.");\r
+  m_setting->m_keyboard.addAlias(name->getString(), key);\r
+}\r
+\r
+\r
+// <DEFINE_SUBSTITUTE>\r
+void SettingLoader::load_DEFINE_SUBSTITUTE()\r
+{\r
+  typedef std::list<ModifiedKey> AssignedKeys;\r
+  AssignedKeys assignedKeys;\r
+  do\r
+  {\r
+    ModifiedKey mkey;\r
+    mkey.m_modifier =\r
+      load_MODIFIER(Modifier::Type_ASSIGN, m_defaultAssignModifier);\r
+    mkey.m_key = load_KEY_NAME();\r
+    assignedKeys.push_back(mkey);\r
+  } while (!(*lookToken() == _T("=>") || *lookToken() == _T("=")));\r
+  getToken();\r
+  \r
+  KeySeq *keySeq = load_KEY_SEQUENCE(_T(""), false, Modifier::Type_ASSIGN);\r
+  ModifiedKey mkey = keySeq->getFirstModifiedKey();\r
+  if (!mkey.m_key)\r
+    throw ErrorMessage() << _T("no key is specified for substitute.");\r
+  \r
+  for (AssignedKeys::iterator i = assignedKeys.begin();\r
+       i != assignedKeys.end(); ++ i)\r
+    m_setting->m_keyboard.addSubstitute(*i, mkey);\r
+}\r
+\r
+\r
+// <DEFINE_OPTION>\r
+void SettingLoader::load_DEFINE_OPTION()\r
+{\r
+  Token *t = getToken();\r
+  if (*t == _T("KL-")) {\r
+    if (*getToken() != _T("=")) {\r
+      throw ErrorMessage() << _T("there must be `=' after `def option KL-'.");\r
+    }\r
+\r
+    load_ARGUMENT(&m_setting->m_correctKanaLockHandling);\r
+    \r
+  } else if (*t == _T("delay-of")) {\r
+    if (*getToken() != _T("!!!")) {\r
+      throw ErrorMessage()\r
+       << _T("there must be `!!!' after `def option delay-of'.");\r
+    }\r
+    \r
+    if (*getToken() != _T("=")) {\r
+      throw ErrorMessage()\r
+       << _T("there must be `=' after `def option delay-of !!!'.");\r
+    }\r
+    \r
+    load_ARGUMENT(&m_setting->m_oneShotRepeatableDelay);\r
+    \r
+  } else if (*t == _T("sts4mayu")) {\r
+    if (*getToken() != _T("=")) {\r
+      throw ErrorMessage()\r
+       << _T("there must be `=' after `def option sts4mayu'.");\r
+    }\r
+    \r
+    load_ARGUMENT(&m_setting->m_sts4mayu);\r
+    \r
+  } else if (*t == _T("cts4mayu")) {\r
+    if (*getToken() != _T("=")) {\r
+      throw ErrorMessage()\r
+       << _T("there must be `=' after `def option cts4mayu'.");\r
+    }\r
+    \r
+    load_ARGUMENT(&m_setting->m_cts4mayu);\r
+    \r
+  } else {\r
+    throw ErrorMessage() << _T("syntax error `def option ") << *t << _T("'.");\r
+  }\r
+}\r
+\r
+\r
+\r
+// <KEYBOARD_DEFINITION>\r
+void SettingLoader::load_KEYBOARD_DEFINITION()\r
+{\r
+  Token *t = getToken();\r
+    \r
+  // <DEFINE_KEY>\r
+  if (*t == _T("key")) load_DEFINE_KEY();\r
+\r
+  // <DEFINE_MODIFIER>\r
+  else if (*t == _T("mod")) load_DEFINE_MODIFIER();\r
+  \r
+  // <DEFINE_SYNC_KEY>\r
+  else if (*t == _T("sync")) load_DEFINE_SYNC_KEY();\r
+  \r
+  // <DEFINE_ALIAS>\r
+  else if (*t == _T("alias")) load_DEFINE_ALIAS();\r
+  \r
+  // <DEFINE_SUBSTITUTE>\r
+  else if (*t == _T("subst")) load_DEFINE_SUBSTITUTE();\r
+\r
+  // <DEFINE_OPTION>\r
+  else if (*t == _T("option")) load_DEFINE_OPTION();\r
+  \r
+  //\r
+  else throw ErrorMessage() << _T("syntax error `") << *t << _T("'.");\r
+}\r
+\r
+\r
+// <..._MODIFIER>\r
+Modifier SettingLoader::load_MODIFIER(\r
+  Modifier::Type i_mode, Modifier i_modifier, Modifier::Type *o_mode)\r
+{\r
+  if (o_mode)\r
+    *o_mode = Modifier::Type_begin;\r
+  \r
+  Modifier isModifierSpecified;\r
+  enum { PRESS, RELEASE, DONTCARE } flag = PRESS;\r
+\r
+  int i;\r
+  for (i = i_mode; i < Modifier::Type_ASSIGN; ++ i)\r
+  {\r
+    i_modifier.dontcare(Modifier::Type(i));\r
+    isModifierSpecified.on(Modifier::Type(i));\r
+  }\r
+  \r
+  Token *t = NULL;\r
+  \r
+  continue_loop:\r
+  while (!isEOL())\r
+  {\r
+    t = lookToken();\r
+\r
+    const static struct { const _TCHAR *m_s; Modifier::Type m_mt; } map[] =\r
+    {\r
+      // <BASIC_MODIFIER>\r
+      { _T("S-"),  Modifier::Type_Shift },\r
+      { _T("A-"),  Modifier::Type_Alt },\r
+      { _T("M-"),  Modifier::Type_Alt },\r
+      { _T("C-"),  Modifier::Type_Control },\r
+      { _T("W-"),  Modifier::Type_Windows },\r
+      // <KEYSEQ_MODIFIER>\r
+      { _T("U-"),  Modifier::Type_Up },\r
+      { _T("D-"),  Modifier::Type_Down },\r
+      // <ASSIGN_MODIFIER>\r
+      { _T("R-"),  Modifier::Type_Repeat },\r
+      { _T("IL-"), Modifier::Type_ImeLock },\r
+      { _T("IC-"), Modifier::Type_ImeComp },\r
+      { _T("I-"),  Modifier::Type_ImeComp },\r
+      { _T("NL-"), Modifier::Type_NumLock },\r
+      { _T("CL-"), Modifier::Type_CapsLock },\r
+      { _T("SL-"), Modifier::Type_ScrollLock },\r
+      { _T("KL-"), Modifier::Type_KanaLock },\r
+      { _T("MAX-"), Modifier::Type_Maximized },\r
+      { _T("MIN-"), Modifier::Type_Minimized },\r
+      { _T("MMAX-"), Modifier::Type_MdiMaximized },\r
+      { _T("MMIN-"), Modifier::Type_MdiMinimized },\r
+      { _T("T-"), Modifier::Type_Touchpad },\r
+      { _T("TS-"), Modifier::Type_TouchpadSticky },\r
+      { _T("M0-"), Modifier::Type_Mod0 },\r
+      { _T("M1-"), Modifier::Type_Mod1 },\r
+      { _T("M2-"), Modifier::Type_Mod2 },\r
+      { _T("M3-"), Modifier::Type_Mod3 },\r
+      { _T("M4-"), Modifier::Type_Mod4 },\r
+      { _T("M5-"), Modifier::Type_Mod5 },\r
+      { _T("M6-"), Modifier::Type_Mod6 },\r
+      { _T("M7-"), Modifier::Type_Mod7 },\r
+      { _T("M8-"), Modifier::Type_Mod8 },\r
+      { _T("M9-"), Modifier::Type_Mod9 },\r
+      { _T("L0-"), Modifier::Type_Lock0 },\r
+      { _T("L1-"), Modifier::Type_Lock1 },\r
+      { _T("L2-"), Modifier::Type_Lock2 },\r
+      { _T("L3-"), Modifier::Type_Lock3 },\r
+      { _T("L4-"), Modifier::Type_Lock4 },\r
+      { _T("L5-"), Modifier::Type_Lock5 },\r
+      { _T("L6-"), Modifier::Type_Lock6 },\r
+      { _T("L7-"), Modifier::Type_Lock7 },\r
+      { _T("L8-"), Modifier::Type_Lock8 },\r
+      { _T("L9-"), Modifier::Type_Lock9 },\r
+    };\r
+\r
+    for (int i = 0; i < NUMBER_OF(map); ++ i)\r
+      if (*t == map[i].m_s)\r
+      {\r
+       getToken();\r
+       Modifier::Type mt = map[i].m_mt;\r
+       if (static_cast<int>(i_mode) <= static_cast<int>(mt))\r
+         throw ErrorMessage() << _T("`") << *t\r
+                              << _T("': invalid modifier at this context.");\r
+       switch (flag)\r
+       {\r
+         case PRESS: i_modifier.press(mt); break;\r
+         case RELEASE: i_modifier.release(mt); break;\r
+         case DONTCARE: i_modifier.dontcare(mt); break;\r
+       }\r
+       isModifierSpecified.on(mt);\r
+       flag = PRESS;\r
+       \r
+       if (o_mode && *o_mode < mt)\r
+       {\r
+         if (mt < Modifier::Type_BASIC)\r
+           *o_mode = Modifier::Type_BASIC;\r
+         else if (mt < Modifier::Type_KEYSEQ)\r
+           *o_mode = Modifier::Type_KEYSEQ;\r
+         else if (mt < Modifier::Type_ASSIGN)\r
+           *o_mode = Modifier::Type_ASSIGN;\r
+       }\r
+       goto continue_loop;\r
+      }\r
+      \r
+    if (*t == _T("*"))\r
+    {\r
+      getToken();\r
+      flag = DONTCARE;\r
+      continue;\r
+    }\r
+      \r
+    if (*t == _T("~"))\r
+    {\r
+      getToken();\r
+      flag = RELEASE;\r
+      continue;\r
+    }\r
+\r
+    break;\r
+  }\r
+  \r
+  for (i = Modifier::Type_begin; i != Modifier::Type_end; ++ i)\r
+    if (!isModifierSpecified.isOn(Modifier::Type(i)))\r
+      switch (flag)\r
+      {\r
+       case PRESS: break;\r
+       case RELEASE: i_modifier.release(Modifier::Type(i)); break;\r
+       case DONTCARE: i_modifier.dontcare(Modifier::Type(i)); break;\r
+      }\r
+\r
+  // fix up and down\r
+  bool isDontcareUp   = i_modifier.isDontcare(Modifier::Type_Up);\r
+  bool isDontcareDown = i_modifier.isDontcare(Modifier::Type_Down);\r
+  bool isOnUp         = i_modifier.isOn(Modifier::Type_Up);\r
+  bool isOnDown       = i_modifier.isOn(Modifier::Type_Down);\r
+  if (isDontcareUp && isDontcareDown)\r
+    ;\r
+  else if (isDontcareUp)\r
+    i_modifier.on(Modifier::Type_Up, !isOnDown);\r
+  else if (isDontcareDown)\r
+    i_modifier.on(Modifier::Type_Down, !isOnUp);\r
+  else if (isOnUp == isOnDown)\r
+  {\r
+    i_modifier.dontcare(Modifier::Type_Up);\r
+    i_modifier.dontcare(Modifier::Type_Down);\r
+  }\r
+\r
+  // fix repeat\r
+  if (!isModifierSpecified.isOn(Modifier::Type_Repeat))\r
+    i_modifier.dontcare(Modifier::Type_Repeat);\r
+  return i_modifier;\r
+}\r
+\r
+\r
+// <KEY_NAME>\r
+Key *SettingLoader::load_KEY_NAME()\r
+{\r
+  Token *t = getToken();\r
+  Key *key = m_setting->m_keyboard.searchKey(t->getString());\r
+  if (!key)\r
+    throw ErrorMessage() << _T("`") << *t << _T("': invalid key name.");\r
+  return key;\r
+}\r
+\r
+\r
+// <KEYMAP_DEFINITION>\r
+void SettingLoader::load_KEYMAP_DEFINITION(const Token *i_which)\r
+{\r
+  Keymap::Type type = Keymap::Type_keymap;\r
+  Token *name = getToken();    // <KEYMAP_NAME>\r
+  tstringi windowClassName;\r
+  tstringi windowTitleName;\r
+  KeySeq *keySeq = NULL;\r
+  Keymap *parentKeymap = NULL;\r
+  bool isKeymap2 = false;\r
+  bool doesLoadDefaultKeySeq = false;\r
+\r
+  if (!isEOL())\r
+  {\r
+    Token *t = lookToken();\r
+    if (*i_which == _T("window"))      // <WINDOW>\r
+    {\r
+      if (t->isOpenParen())\r
+       // "(" <WINDOW_CLASS_NAME> "&&" <WINDOW_TITLE_NAME> ")"\r
+       // "(" <WINDOW_CLASS_NAME> "||" <WINDOW_TITLE_NAME> ")"\r
+      {\r
+       getToken();\r
+       windowClassName = getToken()->getRegexp();\r
+       t = getToken();\r
+       if (*t == _T("&&"))\r
+         type = Keymap::Type_windowAnd;\r
+       else if (*t == _T("||"))\r
+         type = Keymap::Type_windowOr;\r
+       else\r
+         throw ErrorMessage() << _T("`") << *t << _T("': unknown operator.");\r
+       windowTitleName = getToken()->getRegexp();\r
+       if (!getToken()->isCloseParen())\r
+         throw ErrorMessage() << _T("there must be `)'.");\r
+      }\r
+      else if (t->isRegexp())  // <WINDOW_CLASS_NAME>\r
+      {\r
+       getToken();\r
+       type = Keymap::Type_windowAnd;\r
+       windowClassName = t->getRegexp();\r
+      }\r
+    }\r
+    else if (*i_which == _T("keymap"))\r
+      ;\r
+    else if (*i_which == _T("keymap2"))\r
+      isKeymap2 = true;\r
+    else\r
+      ASSERT(false);\r
+    \r
+    if (!isEOL())\r
+      doesLoadDefaultKeySeq = true;\r
+  }\r
+\r
+  m_currentKeymap = m_setting->m_keymaps.add(\r
+    Keymap(type, name->getString(), windowClassName, windowTitleName,\r
+          NULL, NULL));\r
+\r
+  if (doesLoadDefaultKeySeq)\r
+  {\r
+    Token *t = lookToken();\r
+    // <KEYMAP_PARENT>\r
+    if (*t == _T(":"))\r
+    {\r
+      getToken();\r
+      t = getToken();\r
+      parentKeymap = m_setting->m_keymaps.searchByName(t->getString());\r
+      if (!parentKeymap)\r
+       throw ErrorMessage() << _T("`") << *t\r
+                            << _T("': unknown keymap name.");\r
+    }\r
+    if (!isEOL())\r
+    {\r
+      t = getToken();\r
+      if (!(*t == _T("=>") || *t == _T("=")))\r
+       throw ErrorMessage() << _T("`") << *t << _T("': syntax error.");\r
+      keySeq = SettingLoader::load_KEY_SEQUENCE();\r
+    }\r
+  }\r
+  if (keySeq == NULL)\r
+  {\r
+    FunctionData *fd;\r
+    if (type == Keymap::Type_keymap && !isKeymap2)\r
+      fd = createFunctionData(_T("KeymapParent"));\r
+    else if (type == Keymap::Type_keymap && !isKeymap2)\r
+      fd = createFunctionData(_T("Undefined"));\r
+    else // (type == Keymap::Type_windowAnd || type == Keymap::Type_windowOr)\r
+      fd = createFunctionData(_T("KeymapParent"));\r
+    ASSERT( fd );\r
+    keySeq = m_setting->m_keySeqs.add(\r
+      KeySeq(name->getString()).add(ActionFunction(fd)));\r
+  }\r
+\r
+  m_currentKeymap->setIfNotYet(keySeq, parentKeymap);\r
+}\r
+\r
+\r
+// &lt;ARGUMENT&gt;\r
+void SettingLoader::load_ARGUMENT(bool *o_arg)\r
+{\r
+  *o_arg = !(*getToken() == _T("false"));\r
+}\r
+\r
+\r
+// &lt;ARGUMENT&gt;\r
+void SettingLoader::load_ARGUMENT(int *o_arg)\r
+{\r
+  *o_arg = getToken()->getNumber();\r
+}\r
+\r
+\r
+// &lt;ARGUMENT&gt;\r
+void SettingLoader::load_ARGUMENT(unsigned int *o_arg)\r
+{\r
+  *o_arg = getToken()->getNumber();\r
+}\r
+\r
+\r
+// &lt;ARGUMENT&gt;\r
+void SettingLoader::load_ARGUMENT(long *o_arg)\r
+{\r
+  *o_arg = getToken()->getNumber();\r
+}\r
+\r
+\r
+// &lt;ARGUMENT&gt;\r
+void SettingLoader::load_ARGUMENT(unsigned __int64 *o_arg)\r
+{\r
+  *o_arg = getToken()->getNumber();\r
+}\r
+\r
+\r
+// &lt;ARGUMENT&gt;\r
+void SettingLoader::load_ARGUMENT(__int64 *o_arg)\r
+{\r
+  *o_arg = getToken()->getNumber();\r
+}\r
+\r
+\r
+// &lt;ARGUMENT&gt;\r
+void SettingLoader::load_ARGUMENT(tstringq *o_arg)\r
+{\r
+  *o_arg = getToken()->getString();\r
+}\r
+\r
+\r
+// &lt;ARGUMENT&gt;\r
+void SettingLoader::load_ARGUMENT(std::list<tstringq> *o_arg)\r
+{\r
+  while (true)\r
+  {\r
+    if (!lookToken()->isString())\r
+      return;\r
+    o_arg->push_back(getToken()->getString());\r
+    \r
+    if (!lookToken()->isComma())\r
+      return;\r
+    getToken();\r
+  }\r
+}\r
+\r
+\r
+// &lt;ARGUMENT&gt;\r
+void SettingLoader::load_ARGUMENT(tregex *o_arg)\r
+{\r
+  *o_arg = getToken()->getRegexp();\r
+}\r
+\r
+\r
+// &lt;ARGUMENT_VK&gt;\r
+void SettingLoader::load_ARGUMENT(VKey *o_arg)\r
+{\r
+  Token *t = getToken();\r
+  int vkey = 0;\r
+  while (true)\r
+  {\r
+    if (t->isNumber()) { vkey |= static_cast<BYTE>(t->getNumber()); break; }\r
+    else if (*t == _T("E-")) vkey |= VKey_extended;\r
+    else if (*t == _T("U-")) vkey |= VKey_released;\r
+    else if (*t == _T("D-")) vkey |= VKey_pressed;\r
+    else\r
+    {\r
+      const VKeyTable *vkt;\r
+      for (vkt = g_vkeyTable; vkt->m_name; ++ vkt)\r
+       if (*t == vkt->m_name)\r
+         break;\r
+      if (!vkt->m_name)\r
+       throw ErrorMessage() << _T("`") << *t\r
+                            << _T("': unknown virtual key name.");\r
+      vkey |= vkt->m_code;\r
+      break;\r
+    }\r
+    t = getToken();\r
+  }\r
+  if (!(vkey & VKey_released) && !(vkey & VKey_pressed))\r
+    vkey |= VKey_released | VKey_pressed;\r
+  *o_arg = static_cast<VKey>(vkey);\r
+}\r
+\r
+\r
+// &lt;ARGUMENT_WINDOW&gt;\r
+void SettingLoader::load_ARGUMENT(ToWindowType *o_arg)\r
+{\r
+  Token *t = getToken();\r
+  if (t->isNumber())\r
+  {\r
+    if (ToWindowType_toBegin <= t->getNumber())\r
+    {\r
+      *o_arg = static_cast<ToWindowType>(t->getNumber());\r
+      return;\r
+    }\r
+  }\r
+  else if (getTypeValue(o_arg, t->getString()))\r
+    return;\r
+  throw ErrorMessage() << _T("`") << *t << _T("': invalid target window.");\r
+}\r
+\r
+\r
+// &lt;ARGUMENT&gt;\r
+void SettingLoader::load_ARGUMENT(GravityType *o_arg)\r
+{\r
+  Token *t = getToken();\r
+  if (getTypeValue(o_arg, t->getString()))\r
+    return;\r
+  throw ErrorMessage() << _T("`") << *t << _T("': unknown gravity symbol.");\r
+}\r
+\r
+\r
+// &lt;ARGUMENT&gt;\r
+void SettingLoader::load_ARGUMENT(MouseHookType *o_arg)\r
+{\r
+  Token *t = getToken();\r
+  if (getTypeValue(o_arg, t->getString()))\r
+    return;\r
+  throw ErrorMessage() << _T("`") << *t << _T("': unknown MouseHookType symbol.");\r
+}\r
+\r
+\r
+// &lt;ARGUMENT&gt;\r
+void SettingLoader::load_ARGUMENT(MayuDialogType *o_arg)\r
+{\r
+  Token *t = getToken();\r
+  if (getTypeValue(o_arg, t->getString()))\r
+    return;\r
+  throw ErrorMessage() << _T("`") << *t << _T("': unknown dialog box.");\r
+}\r
+\r
+\r
+// &lt;ARGUMENT_LOCK&gt;\r
+void SettingLoader::load_ARGUMENT(ModifierLockType *o_arg)\r
+{\r
+  Token *t = getToken();\r
+  if (getTypeValue(o_arg, t->getString()))\r
+    return;\r
+  throw ErrorMessage() << _T("`") << *t << _T("': unknown lock name.");\r
+}\r
+\r
+\r
+// &lt;ARGUMENT_LOCK&gt;\r
+void SettingLoader::load_ARGUMENT(ToggleType *o_arg)\r
+{\r
+  Token *t = getToken();\r
+  if (getTypeValue(o_arg, t->getString()))\r
+    return;\r
+  throw ErrorMessage() << _T("`") << *t << _T("': unknown toggle name.");\r
+}\r
+\r
+\r
+// &lt;ARGUMENT_SHOW_WINDOW&gt;\r
+void SettingLoader::load_ARGUMENT(ShowCommandType *o_arg)\r
+{\r
+  Token *t = getToken();\r
+  if (getTypeValue(o_arg, t->getString()))\r
+    return;\r
+  throw ErrorMessage() << _T("`") << *t << _T("': unknown show command.");\r
+}\r
+\r
+\r
+// &lt;ARGUMENT_TARGET_WINDOW&gt;\r
+void SettingLoader::load_ARGUMENT(TargetWindowType *o_arg)\r
+{\r
+  Token *t = getToken();\r
+  if (getTypeValue(o_arg, t->getString()))\r
+    return;\r
+  throw ErrorMessage() << _T("`") << *t\r
+                      << _T("': unknown target window type.");\r
+}\r
+\r
+\r
+// &lt;bool&gt;\r
+void SettingLoader::load_ARGUMENT(BooleanType *o_arg)\r
+{\r
+  Token *t = getToken();\r
+  if (getTypeValue(o_arg, t->getString()))\r
+    return;\r
+  throw ErrorMessage() << _T("`") << *t << _T("': must be true or false.");\r
+}\r
+\r
+\r
+// &lt;ARGUMENT&gt;\r
+void SettingLoader::load_ARGUMENT(LogicalOperatorType *o_arg)\r
+{\r
+  Token *t = getToken();\r
+  if (getTypeValue(o_arg, t->getString()))\r
+    return;\r
+  throw ErrorMessage() << _T("`") << *t << _T("': must be 'or' or 'and'.");\r
+}\r
+\r
+\r
+// &lt;ARGUMENT&gt;\r
+void SettingLoader::load_ARGUMENT(Modifier *o_arg)\r
+{\r
+  Modifier modifier;\r
+  for (int i = Modifier::Type_begin; i != Modifier::Type_end; ++ i)\r
+    modifier.dontcare(static_cast<Modifier::Type>(i));\r
+  *o_arg = load_MODIFIER(Modifier::Type_ASSIGN, modifier);\r
+}\r
+\r
+\r
+// &lt;ARGUMENT&gt;\r
+void SettingLoader::load_ARGUMENT(const Keymap **o_arg)\r
+{\r
+  Token *t = getToken();\r
+  const Keymap *&keymap = *o_arg;\r
+  keymap = m_setting->m_keymaps.searchByName(t->getString());\r
+  if (!keymap)\r
+    throw ErrorMessage() << _T("`") << *t << _T("': unknown keymap name.");\r
+}\r
+\r
+\r
+// &lt;ARGUMENT&gt;\r
+void SettingLoader::load_ARGUMENT(const KeySeq **o_arg)\r
+{\r
+  Token *t = getToken();\r
+  const KeySeq *&keySeq = *o_arg;\r
+  if (t->isOpenParen())\r
+  {\r
+    keySeq = load_KEY_SEQUENCE(_T(""), true);\r
+    getToken(); // close paren\r
+  }\r
+  else if (*t == _T("$"))\r
+  {\r
+    t = getToken();\r
+    keySeq = m_setting->m_keySeqs.searchByName(t->getString());\r
+    if (!keySeq)\r
+      throw ErrorMessage() << _T("`$") << *t << _T("': unknown keyseq name.");\r
+  }\r
+  else\r
+    throw ErrorMessage() << _T("`") << *t << _T("': it is not keyseq.");\r
+}\r
+\r
+\r
+// &lt;ARGUMENT&gt;\r
+void SettingLoader::load_ARGUMENT(StrExprArg *o_arg)\r
+{\r
+  Token *t = getToken();\r
+  StrExprArg::Type type = StrExprArg::Literal;\r
+  if (*t == _T("$") && t->isQuoted() == false\r
+      && lookToken()->getType() == Token::Type_string)\r
+  {\r
+    type = StrExprArg::Builtin;\r
+    t = getToken();\r
+  }\r
+  *o_arg = StrExprArg(t->getString(), type);\r
+}\r
+\r
+\r
+// &lt;ARGUMENT&gt;\r
+void SettingLoader::load_ARGUMENT(WindowMonitorFromType *o_arg)\r
+{\r
+  Token *t = getToken();\r
+  if (getTypeValue(o_arg, t->getString()))\r
+    return;\r
+  throw ErrorMessage() << _T("`") << *t\r
+                      << _T("': unknown monitor from type.");\r
+}\r
+\r
+\r
+// <KEY_SEQUENCE>\r
+KeySeq *SettingLoader::load_KEY_SEQUENCE(\r
+  const tstringi &i_name, bool i_isInParen, Modifier::Type i_mode)\r
+{\r
+  KeySeq keySeq(i_name);\r
+  while (!isEOL())\r
+  {\r
+    Modifier::Type mode;\r
+    Modifier modifier = load_MODIFIER(i_mode, m_defaultKeySeqModifier, &mode);\r
+    keySeq.setMode(mode);\r
+    Token *t = lookToken();\r
+    if (t->isCloseParen() && i_isInParen)\r
+      break;\r
+    else if (t->isOpenParen())\r
+    {\r
+      getToken(); // open paren\r
+      KeySeq *ks = load_KEY_SEQUENCE(_T(""), true, i_mode);\r
+      getToken(); // close paren\r
+      keySeq.add(ActionKeySeq(ks));\r
+    }\r
+    else if (*t == _T("$")) // <KEYSEQ_NAME>\r
+    {\r
+      getToken();\r
+      t = getToken();\r
+      KeySeq *ks = m_setting->m_keySeqs.searchByName(t->getString());\r
+      if (ks == NULL)\r
+       throw ErrorMessage() << _T("`$") << *t\r
+                            << _T("': unknown keyseq name.");\r
+      if (!ks->isCorrectMode(i_mode))\r
+       throw ErrorMessage()\r
+         << _T("`$") << *t\r
+         << _T("': Some of R-, IL-, IC-, NL-, CL-, SL-, KL-, MAX-, MIN-, MMAX-, MMIN-, T-, TS-, M0...M9- and L0...L9- are used in the keyseq.  They are prohibited in this context.");\r
+      keySeq.setMode(ks->getMode());\r
+      keySeq.add(ActionKeySeq(ks));\r
+    }\r
+    else if (*t == _T("&")) // <FUNCTION_NAME>\r
+    {\r
+      getToken();\r
+      t = getToken();\r
+      \r
+      // search function\r
+      ActionFunction af(createFunctionData(t->getString()), modifier);\r
+      if (af.m_functionData == NULL)\r
+       throw ErrorMessage() << _T("`&") << *t\r
+                            << _T("': unknown function name.");\r
+      af.m_functionData->load(this);\r
+      keySeq.add(af);\r
+    }\r
+    else // <KEYSEQ_MODIFIED_KEY_NAME>\r
+    {\r
+      ModifiedKey mkey;\r
+      mkey.m_modifier = modifier;\r
+      mkey.m_key = load_KEY_NAME();\r
+      keySeq.add(ActionKey(mkey));\r
+    }\r
+  }\r
+  return m_setting->m_keySeqs.add(keySeq);\r
+}\r
+\r
+\r
+// <KEY_ASSIGN>\r
+void SettingLoader::load_KEY_ASSIGN()\r
+{\r
+  typedef std::list<ModifiedKey> AssignedKeys;\r
+  AssignedKeys assignedKeys;\r
+  \r
+  ModifiedKey mkey;\r
+  mkey.m_modifier =\r
+    load_MODIFIER(Modifier::Type_ASSIGN, m_defaultAssignModifier);\r
+  if (*lookToken() == _T("="))\r
+  {\r
+    getToken();\r
+    m_defaultKeySeqModifier = load_MODIFIER(Modifier::Type_KEYSEQ,\r
+                                           m_defaultKeySeqModifier);\r
+    m_defaultAssignModifier = mkey.m_modifier;\r
+    return;\r
+  }\r
+  \r
+  while (true)\r
+  {\r
+    mkey.m_key = load_KEY_NAME();\r
+    assignedKeys.push_back(mkey);\r
+    if (*lookToken() == _T("=>") || *lookToken() == _T("="))\r
+      break;\r
+    mkey.m_modifier =\r
+      load_MODIFIER(Modifier::Type_ASSIGN, m_defaultAssignModifier);\r
+  }\r
+  getToken();\r
+\r
+  ASSERT(m_currentKeymap);\r
+  KeySeq *keySeq = load_KEY_SEQUENCE();\r
+  for (AssignedKeys::iterator i = assignedKeys.begin();\r
+       i != assignedKeys.end(); ++ i)\r
+    m_currentKeymap->addAssignment(*i, keySeq);\r
+}\r
+\r
+\r
+// <EVENT_ASSIGN>\r
+void SettingLoader::load_EVENT_ASSIGN()\r
+{\r
+  std::list<ModifiedKey> assignedKeys;\r
+\r
+  ModifiedKey mkey;\r
+  mkey.m_modifier.dontcare();                  //set all modifiers to dontcare\r
+  \r
+  Token *t = getToken();\r
+  Key **e;\r
+  for (e = Event::events; *e; ++ e)\r
+    if (*t == (*e)->getName())\r
+    {\r
+      mkey.m_key = *e;\r
+      break;\r
+    }\r
+  if (!*e)\r
+    throw ErrorMessage() << _T("`") << *t << _T("': invalid event name.");\r
+\r
+  t = getToken();\r
+  if (!(*t == _T("=>") || *t == _T("=")))\r
+    throw ErrorMessage() << _T("`=' is expected.");\r
+\r
+  ASSERT(m_currentKeymap);\r
+  KeySeq *keySeq = load_KEY_SEQUENCE();\r
+  m_currentKeymap->addAssignment(mkey, keySeq);\r
+}\r
+\r
+\r
+// <MODIFIER_ASSIGNMENT>\r
+void SettingLoader::load_MODIFIER_ASSIGNMENT()\r
+{\r
+  // <MODIFIER_NAME>\r
+  Token *t = getToken();\r
+  Modifier::Type mt;\r
+\r
+  while (true)\r
+  {\r
+    Keymap::AssignMode am = Keymap::AM_notModifier;\r
+    if      (*t == _T("!")  ) am = Keymap::AM_true, t = getToken();\r
+    else if (*t == _T("!!") ) am = Keymap::AM_oneShot, t = getToken();\r
+    else if (*t == _T("!!!")) am = Keymap::AM_oneShotRepeatable, t = getToken();\r
+    \r
+    if      (*t == _T("shift")) mt = Modifier::Type_Shift;\r
+    else if (*t == _T("alt")  ||\r
+            *t == _T("meta") ||\r
+            *t == _T("menu") ) mt = Modifier::Type_Alt;\r
+    else if (*t == _T("control") ||\r
+            *t == _T("ctrl") ) mt = Modifier::Type_Control;\r
+    else if (*t == _T("windows") ||\r
+            *t == _T("win")  ) mt = Modifier::Type_Windows;\r
+    else if (*t == _T("mod0") ) mt = Modifier::Type_Mod0;\r
+    else if (*t == _T("mod1") ) mt = Modifier::Type_Mod1;\r
+    else if (*t == _T("mod2") ) mt = Modifier::Type_Mod2;\r
+    else if (*t == _T("mod3") ) mt = Modifier::Type_Mod3;\r
+    else if (*t == _T("mod4") ) mt = Modifier::Type_Mod4;\r
+    else if (*t == _T("mod5") ) mt = Modifier::Type_Mod5;\r
+    else if (*t == _T("mod6") ) mt = Modifier::Type_Mod6;\r
+    else if (*t == _T("mod7") ) mt = Modifier::Type_Mod7;\r
+    else if (*t == _T("mod8") ) mt = Modifier::Type_Mod8;\r
+    else if (*t == _T("mod9") ) mt = Modifier::Type_Mod9;\r
+    else throw ErrorMessage() << _T("`") << *t\r
+                             << _T("': invalid modifier name.");\r
+\r
+    if (am == Keymap::AM_notModifier)\r
+      break;\r
+    \r
+    m_currentKeymap->addModifier(mt, Keymap::AO_overwrite, am, NULL);\r
+    if (isEOL())\r
+      return;\r
+    t = getToken();\r
+  }\r
+  \r
+  // <ASSIGN_OP>\r
+  t = getToken();\r
+  Keymap::AssignOperator ao;\r
+  if      (*t == _T("=") ) ao = Keymap::AO_new;\r
+  else if (*t == _T("+=")) ao = Keymap::AO_add;\r
+  else if (*t == _T("-=")) ao = Keymap::AO_sub;\r
+  else  throw ErrorMessage() << _T("`") << *t << _T("': is unknown operator.");\r
+\r
+  // <ASSIGN_MODE>? <KEY_NAME>\r
+  while (!isEOL())\r
+  {\r
+    // <ASSIGN_MODE>? \r
+    t = getToken();\r
+    Keymap::AssignMode am = Keymap::AM_normal;\r
+    if      (*t == _T("!")  ) am = Keymap::AM_true, t = getToken();\r
+    else if (*t == _T("!!") ) am = Keymap::AM_oneShot, t = getToken();\r
+    else if (*t == _T("!!!")) am = Keymap::AM_oneShotRepeatable, t = getToken();\r
+    \r
+    // <KEY_NAME>\r
+    Key *key = m_setting->m_keyboard.searchKey(t->getString());\r
+    if (!key)\r
+      throw ErrorMessage() << _T("`") << *t << _T("': invalid key name.");\r
+\r
+    // we can ignore warning C4701\r
+    m_currentKeymap->addModifier(mt, ao, am, key);\r
+    if (ao == Keymap::AO_new)\r
+      ao = Keymap::AO_add;\r
+  }\r
+}\r
+\r
+\r
+// <KEYSEQ_DEFINITION>\r
+void SettingLoader::load_KEYSEQ_DEFINITION()\r
+{\r
+  if (*getToken() != _T("$"))\r
+    throw ErrorMessage() << _T("there must be `$' after `keyseq'");\r
+  Token *name = getToken();\r
+  if (*getToken() != _T("="))\r
+    throw ErrorMessage() << _T("there must be `=' after keyseq naem");\r
+  load_KEY_SEQUENCE(name->getString(), false, Modifier::Type_ASSIGN);\r
+}\r
+\r
+\r
+// <DEFINE>\r
+void SettingLoader::load_DEFINE()\r
+{\r
+  m_setting->m_symbols.insert(getToken()->getString());\r
+}\r
+\r
+\r
+// <IF>\r
+void SettingLoader::load_IF()\r
+{\r
+  if (!getToken()->isOpenParen())\r
+    throw ErrorMessage() << _T("there must be `(' after `if'.");\r
+  Token *t = getToken(); // <SYMBOL> or !\r
+  bool not = false;\r
+  if (*t == _T("!"))\r
+  {\r
+    not = true;\r
+    t = getToken(); // <SYMBOL>\r
+  }\r
+  \r
+  bool doesSymbolExist = (m_setting->m_symbols.find(t->getString())\r
+                         != m_setting->m_symbols.end());\r
+  bool doesRead = ((doesSymbolExist && !not) ||\r
+                  (!doesSymbolExist && not));\r
+  if (0 < m_canReadStack.size())\r
+    doesRead = doesRead && m_canReadStack.back();\r
+  \r
+  if (!getToken()->isCloseParen())\r
+    throw ErrorMessage() << _T("there must be `)'.");\r
+\r
+  m_canReadStack.push_back(doesRead);\r
+  if (!isEOL())\r
+  {\r
+    size_t len = m_canReadStack.size();\r
+    load_LINE();\r
+    if (len < m_canReadStack.size())\r
+    {\r
+      bool r = m_canReadStack.back();\r
+      m_canReadStack.pop_back();\r
+      m_canReadStack[len - 1] = r && doesRead;\r
+    }\r
+    else if (len == m_canReadStack.size())\r
+      m_canReadStack.pop_back();\r
+    else\r
+      ; // `end' found\r
+  }\r
+}\r
+\r
+\r
+// <ELSE> <ELSEIF>\r
+void SettingLoader::load_ELSE(bool i_isElseIf, const tstringi &i_token)\r
+{\r
+  bool doesRead = !load_ENDIF(i_token);\r
+  if (0 < m_canReadStack.size())\r
+    doesRead = doesRead && m_canReadStack.back();\r
+  m_canReadStack.push_back(doesRead);\r
+  if (!isEOL())\r
+  {\r
+    size_t len = m_canReadStack.size();\r
+    if (i_isElseIf)\r
+      load_IF();\r
+    else\r
+      load_LINE();\r
+    if (len < m_canReadStack.size())\r
+    {\r
+      bool r = m_canReadStack.back();\r
+      m_canReadStack.pop_back();\r
+      m_canReadStack[len - 1] = doesRead && r;\r
+    }\r
+    else if (len == m_canReadStack.size())\r
+      m_canReadStack.pop_back();\r
+    else\r
+      ; // `end' found\r
+  }\r
+}\r
+\r
+\r
+// <ENDIF>\r
+bool SettingLoader::load_ENDIF(const tstringi &i_token)\r
+{\r
+  if (m_canReadStack.size() == 0)\r
+    throw ErrorMessage() << _T("unbalanced `") << i_token << _T("'");\r
+  bool r = m_canReadStack.back();\r
+  m_canReadStack.pop_back();\r
+  return r;\r
+}\r
+\r
+\r
+// <LINE>\r
+void SettingLoader::load_LINE()\r
+{\r
+  Token *i_token = getToken();\r
+\r
+  // <COND_SYMBOL>\r
+  if      (*i_token == _T("if") ||\r
+          *i_token == _T("and")) load_IF();\r
+  else if (*i_token == _T("else")) load_ELSE(false, i_token->getString());\r
+  else if (*i_token == _T("elseif") ||\r
+          *i_token == _T("elsif")  ||\r
+          *i_token == _T("elif")   ||\r
+          *i_token == _T("or")) load_ELSE(true, i_token->getString());\r
+  else if (*i_token == _T("endif")) load_ENDIF(_T("endif"));\r
+  else if (0 < m_canReadStack.size() && !m_canReadStack.back())\r
+  {\r
+    while (!isEOL())\r
+      getToken();\r
+  }\r
+  else if (*i_token == _T("define")) load_DEFINE();\r
+  // <INCLUDE>\r
+  else if (*i_token == _T("include")) load_INCLUDE();\r
+  // <KEYBOARD_DEFINITION>\r
+  else if (*i_token == _T("def")) load_KEYBOARD_DEFINITION();\r
+  // <KEYMAP_DEFINITION>\r
+  else if (*i_token == _T("keymap")  ||\r
+          *i_token == _T("keymap2") ||\r
+          *i_token == _T("window")) load_KEYMAP_DEFINITION(i_token);\r
+  // <KEY_ASSIGN>\r
+  else if (*i_token == _T("key")) load_KEY_ASSIGN();\r
+  // <EVENT_ASSIGN>\r
+  else if (*i_token == _T("event")) load_EVENT_ASSIGN();\r
+  // <MODIFIER_ASSIGNMENT>\r
+  else if (*i_token == _T("mod")) load_MODIFIER_ASSIGNMENT();\r
+  // <KEYSEQ_DEFINITION>\r
+  else if (*i_token == _T("keyseq")) load_KEYSEQ_DEFINITION();\r
+  else\r
+    throw ErrorMessage() << _T("syntax error `") << *i_token << _T("'.");\r
+}\r
+\r
+  \r
+// prefix sort predicate used in load(const string &)\r
+static bool prefixSortPred(const tstringi &i_a, const tstringi &i_b)\r
+{\r
+  return i_b.size() < i_a.size();\r
+}\r
+\r
+\r
+/*\r
+  _UNICODE: read file (UTF-16 LE/BE, UTF-8, locale specific multibyte encoding)\r
+  _MBCS: read file\r
+*/\r
+bool readFile(tstring *o_data, const tstringi &i_filename)\r
+{\r
+  // get size of file\r
+#if 0\r
+  // bcc's _wstat cannot obtain file size\r
+  struct _stat sbuf;\r
+  if (_tstat(i_filename.c_str(), &sbuf) < 0 || sbuf.st_size == 0)\r
+    return false;\r
+#else\r
+  // so, we use _wstati64 for bcc\r
+  struct stati64_t sbuf;\r
+  if (_tstati64(i_filename.c_str(), &sbuf) < 0 || sbuf.st_size == 0)\r
+    return false;\r
+  // following check is needed to cast sbuf.st_size to size_t safely\r
+  // this cast occurs because of above workaround for bcc\r
+  if (sbuf.st_size > UINT_MAX)\r
+    return false;\r
+#endif\r
+  \r
+  // open\r
+  FILE *fp = _tfopen(i_filename.c_str(), _T("rb"));\r
+  if (!fp)\r
+    return false;\r
+  \r
+  // read file\r
+  Array<BYTE> buf(static_cast<size_t>(sbuf.st_size) + 1);\r
+  if (fread(buf.get(), static_cast<size_t>(sbuf.st_size), 1, fp) != 1)\r
+  {\r
+    fclose(fp);\r
+    return false;\r
+  }\r
+  buf.get()[sbuf.st_size] = 0;                 // mbstowcs() requires null\r
+                                               // terminated string\r
+\r
+#ifdef _UNICODE\r
+  //\r
+  if (buf.get()[0] == 0xffU && buf.get()[1] == 0xfeU &&\r
+      sbuf.st_size % 2 == 0)\r
+    // UTF-16 Little Endien\r
+  {\r
+    size_t size = static_cast<size_t>(sbuf.st_size) / 2;\r
+    o_data->resize(size);\r
+    BYTE *p = buf.get();\r
+    for (size_t i = 0; i < size; ++ i)\r
+    {\r
+      wchar_t c = static_cast<wchar_t>(*p ++);\r
+      c |= static_cast<wchar_t>(*p ++) << 8;\r
+      (*o_data)[i] = c;\r
+    }\r
+    fclose(fp);\r
+    return true;\r
+  }\r
+  \r
+  //\r
+  if (buf.get()[0] == 0xfeU && buf.get()[1] == 0xffU &&\r
+      sbuf.st_size % 2 == 0)\r
+    // UTF-16 Big Endien\r
+  {\r
+    size_t size = static_cast<size_t>(sbuf.st_size) / 2;\r
+    o_data->resize(size);\r
+    BYTE *p = buf.get();\r
+    for (size_t i = 0; i < size; ++ i)\r
+    {\r
+      wchar_t c = static_cast<wchar_t>(*p ++) << 8;\r
+      c |= static_cast<wchar_t>(*p ++);\r
+      (*o_data)[i] = c;\r
+    }\r
+    fclose(fp);\r
+    return true;\r
+  }\r
+\r
+  // try multibyte charset \r
+  size_t wsize = mbstowcs(NULL, reinterpret_cast<char *>(buf.get()), 0);\r
+  if (wsize != size_t(-1))\r
+  {\r
+    Array<wchar_t> wbuf(wsize);\r
+    mbstowcs(wbuf.get(), reinterpret_cast<char *>(buf.get()), wsize);\r
+    o_data->assign(wbuf.get(), wbuf.get() + wsize);\r
+    fclose(fp);\r
+    return true;\r
+  }\r
+  \r
+  // try UTF-8\r
+  {\r
+    Array<wchar_t> wbuf(static_cast<size_t>(sbuf.st_size));\r
+    BYTE *f = buf.get();\r
+    BYTE *end = buf.get() + sbuf.st_size;\r
+    wchar_t *d = wbuf.get();\r
+    enum { STATE_1, STATE_2of2, STATE_2of3, STATE_3of3 } state = STATE_1;\r
+    \r
+    while (f != end)\r
+    {\r
+      switch (state)\r
+      {\r
+       case STATE_1:\r
+         if (!(*f & 0x80))                     // 0xxxxxxx: 00-7F\r
+           *d++ = static_cast<wchar_t>(*f++);\r
+         else if ((*f & 0xe0) == 0xc0)         // 110xxxxx 10xxxxxx: 0080-07FF\r
+         {\r
+           *d = ((static_cast<wchar_t>(*f++) & 0x1f) << 6);\r
+           state = STATE_2of2;\r
+         }\r
+         else if ((*f & 0xf0) == 0xe0)         // 1110xxxx 10xxxxxx 10xxxxxx:\r
+                                               // 0800 - FFFF\r
+         {\r
+           *d = ((static_cast<wchar_t>(*f++) & 0x0f) << 12);\r
+           state = STATE_2of3;\r
+         }\r
+         else\r
+           goto not_UTF_8;\r
+         break;\r
+         \r
+       case STATE_2of2:\r
+       case STATE_3of3:\r
+         if ((*f & 0xc0) != 0x80)\r
+           goto not_UTF_8;\r
+         *d++ |= (static_cast<wchar_t>(*f++) & 0x3f);\r
+         state = STATE_1;\r
+         break;\r
+\r
+       case STATE_2of3:\r
+         if ((*f & 0xc0) != 0x80)\r
+           goto not_UTF_8;\r
+         *d |= ((static_cast<wchar_t>(*f++) & 0x3f) << 6);\r
+         state = STATE_3of3;\r
+         break;\r
+      }\r
+    }\r
+    o_data->assign(wbuf.get(), d);\r
+    fclose(fp);\r
+    return true;\r
+    \r
+    not_UTF_8: ;\r
+  }\r
+#endif // _UNICODE\r
+\r
+  // assume ascii\r
+  o_data->resize(static_cast<size_t>(sbuf.st_size));\r
+  for (off_t i = 0; i < sbuf.st_size; ++ i)\r
+    (*o_data)[i] = buf.get()[i];\r
+  fclose(fp);\r
+  return true;\r
+}\r
+\r
+\r
+// load (called from load(Setting *, const tstringi &) only)\r
+void SettingLoader::load(const tstringi &i_filename)\r
+{\r
+  m_currentFilename = i_filename;\r
+  \r
+  tstring data;\r
+  if (!readFile(&data, m_currentFilename))\r
+  {\r
+    Acquire a(m_soLog);\r
+    *m_log << m_currentFilename << _T(" : error: file not found") << std::endl;\r
+#if 1\r
+    *m_log << data << std::endl;\r
+#endif\r
+    m_isThereAnyError = true;\r
+    return;\r
+  }\r
+  \r
+  // prefix\r
+  if (m_prefixesRefCcount == 0)\r
+  {\r
+    static const _TCHAR *prefixes[] =\r
+    {\r
+      _T("="), _T("=>"), _T("&&"), _T("||"), _T(":"), _T("$"), _T("&"),\r
+      _T("-="), _T("+="), _T("!!!"), _T("!!"), _T("!"), \r
+      _T("E0-"), _T("E1-"),                    // <SCAN_CODE_EXTENTION>\r
+      _T("S-"), _T("A-"), _T("M-"), _T("C-"),  // <BASIC_MODIFIER>\r
+      _T("W-"), _T("*"), _T("~"),\r
+      _T("U-"), _T("D-"),                      // <KEYSEQ_MODIFIER>\r
+      _T("R-"), _T("IL-"), _T("IC-"), _T("I-"),        // <ASSIGN_MODIFIER>\r
+      _T("NL-"), _T("CL-"), _T("SL-"), _T("KL-"),\r
+      _T("MAX-"), _T("MIN-"), _T("MMAX-"), _T("MMIN-"),\r
+      _T("T-"), _T("TS-"),\r
+      _T("M0-"), _T("M1-"), _T("M2-"), _T("M3-"), _T("M4-"),\r
+      _T("M5-"), _T("M6-"), _T("M7-"), _T("M8-"), _T("M9-"), \r
+      _T("L0-"), _T("L1-"), _T("L2-"), _T("L3-"), _T("L4-"),\r
+      _T("L5-"), _T("L6-"), _T("L7-"), _T("L8-"), _T("L9-"), \r
+    };\r
+    m_prefixes = new std::vector<tstringi>;\r
+    for (size_t i = 0; i < NUMBER_OF(prefixes); ++ i)\r
+      m_prefixes->push_back(prefixes[i]);\r
+    std::sort(m_prefixes->begin(), m_prefixes->end(), prefixSortPred);\r
+  }\r
+  m_prefixesRefCcount ++;\r
+\r
+  // create parser\r
+  Parser parser(data.c_str(), data.size());\r
+  parser.setPrefixes(m_prefixes);\r
+    \r
+  while (true)\r
+  {\r
+    try\r
+    {\r
+      if (!parser.getLine(&m_tokens))\r
+       break;\r
+      m_ti = m_tokens.begin();\r
+    }\r
+    catch (ErrorMessage &e)\r
+    {\r
+      if (m_log && m_soLog)\r
+      {\r
+       Acquire a(m_soLog);\r
+       *m_log << m_currentFilename << _T("(") << parser.getLineNumber()\r
+              << _T(") : error: ") << e << std::endl;\r
+      }\r
+      m_isThereAnyError = true;\r
+      continue;\r
+    }\r
+      \r
+    try\r
+    {\r
+      load_LINE();\r
+      if (!isEOL())\r
+       throw WarningMessage() << _T("back garbage is ignored.");\r
+    }\r
+    catch (WarningMessage &w)\r
+    {\r
+      if (m_log && m_soLog)\r
+      {\r
+       Acquire a(m_soLog);\r
+       *m_log << i_filename << _T("(") << parser.getLineNumber()\r
+              << _T(") : warning: ") << w << std::endl;\r
+      }\r
+    }\r
+    catch (ErrorMessage &e)\r
+    {\r
+      if (m_log && m_soLog)\r
+      {\r
+       Acquire a(m_soLog);\r
+       *m_log << i_filename << _T("(") << parser.getLineNumber()\r
+              << _T(") : error: ") << e << std::endl;\r
+      }\r
+      m_isThereAnyError = true;\r
+    }\r
+  }\r
+    \r
+  // m_prefixes\r
+  -- m_prefixesRefCcount;\r
+  if (m_prefixesRefCcount == 0)\r
+    delete m_prefixes;\r
+\r
+  if (0 < m_canReadStack.size())\r
+  {\r
+    Acquire a(m_soLog);\r
+    *m_log << m_currentFilename << _T("(") << parser.getLineNumber()\r
+          << _T(") : error: unbalanced `if'.  ")\r
+          << _T("you forget `endif', didn'i_token you?")\r
+          << std::endl;\r
+    m_isThereAnyError = true;\r
+  }\r
+}\r
+\r
+\r
+// is the filename readable ?\r
+bool SettingLoader::isReadable(const tstringi &i_filename,\r
+                              int i_debugLevel) const \r
+{\r
+  if (i_filename.empty())\r
+    return false;\r
+#ifdef UNICODE\r
+  tifstream ist(to_string(i_filename).c_str());\r
+#else\r
+  tifstream ist(i_filename.c_str());\r
+#endif\r
+  if (ist.good())\r
+  {\r
+    if (m_log && m_soLog)\r
+    {\r
+               Acquire a(m_soLog, 0);\r
+      *m_log << _T("  loading: ") << i_filename << std::endl;\r
+    }\r
+    return true;\r
+  }\r
+  else\r
+  {\r
+    if (m_log && m_soLog)\r
+    {\r
+      Acquire a(m_soLog, i_debugLevel);\r
+      *m_log << _T("not found: ") << i_filename << std::endl;\r
+    }\r
+    return false;\r
+  }\r
+}\r
+\r
+#if 0\r
+// get filename from registry\r
+bool SettingLoader::getFilenameFromRegistry(tstringi *o_path) const\r
+{\r
+  // get from registry\r
+  Registry reg(MAYU_REGISTRY_ROOT);\r
+  int index;\r
+  reg.read(_T(".mayuIndex"), &index, 0);\r
+  char buf[100];\r
+  snprintf(buf, NUMBER_OF(buf), _T(".mayu%d"), index);\r
+  if (!reg.read(buf, o_path))\r
+    return false;\r
+\r
+  // parse registry entry\r
+  Regexp getFilename(_T("^[^;]*;([^;]*);(.*)$"));\r
+  if (!getFilename.doesMatch(*o_path))\r
+    return false;\r
+  \r
+  tstringi path = getFilename[1];\r
+  tstringi options = getFilename[2];\r
+  \r
+  if (!(0 < path.size() && isReadable(path)))\r
+    return false;\r
+  *o_path = path;\r
+  \r
+  // set symbols\r
+  Regexp symbol(_T("-D([^;]*)"));\r
+  while (symbol.doesMatch(options))\r
+  {\r
+    m_setting->symbols.insert(symbol[1]);\r
+    options = options.substr(symbol.subBegin(1));\r
+  }\r
+  \r
+  return true;\r
+}\r
+#endif\r
+\r
+\r
+// get filename\r
+bool SettingLoader::getFilename(const tstringi &i_name, tstringi *o_path,\r
+                               int i_debugLevel) const\r
+{\r
+  // the default filename is ".mayu"\r
+  const tstringi &name = i_name.empty() ? tstringi(_T(".mayu")) : i_name;\r
+  \r
+  bool isFirstTime = true;\r
+\r
+  while (true)\r
+  {\r
+    // find file from registry\r
+    if (i_name.empty())                                // called not from 'include'\r
+    {\r
+      Setting::Symbols symbols;\r
+      if (getFilenameFromRegistry(NULL, o_path, &symbols))\r
+      {\r
+       if (o_path->empty())\r
+         // find file from home directory\r
+       {\r
+         HomeDirectories pathes;\r
+         getHomeDirectories(&pathes);\r
+         for (HomeDirectories::iterator\r
+                i = pathes.begin(); i != pathes.end(); ++ i)\r
+         {\r
+           *o_path = *i + _T("\\") + name;\r
+           if (isReadable(*o_path, i_debugLevel))\r
+             goto add_symbols;\r
+         }\r
+         return false;\r
+       }\r
+       else\r
+       {\r
+         if (!isReadable(*o_path, i_debugLevel))\r
+           return false;\r
+       }\r
+       add_symbols:\r
+       for (Setting::Symbols::iterator\r
+              i = symbols.begin(); i != symbols.end(); ++ i)\r
+         m_setting->m_symbols.insert(*i);\r
+       return true;\r
+      }\r
+    }\r
+    \r
+    if (!isFirstTime)\r
+      return false;\r
+    \r
+    // find file from home directory\r
+    HomeDirectories pathes;\r
+    getHomeDirectories(&pathes);\r
+    for (HomeDirectories::iterator i = pathes.begin(); i != pathes.end(); ++ i)\r
+    {\r
+      *o_path = *i + _T("\\") + name;\r
+      if (isReadable(*o_path, i_debugLevel))\r
+       return true;\r
+    }\r
+    \r
+    if (!i_name.empty())\r
+      return false;                            // called by 'include'\r
+    \r
+    if (!DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_setting),\r
+                  NULL, dlgSetting_dlgProc))\r
+      return false;\r
+  }\r
+}\r
+\r
+\r
+// constructor\r
+SettingLoader::SettingLoader(SyncObject *i_soLog, tostream *i_log)\r
+  : m_setting(NULL),\r
+    m_isThereAnyError(false),\r
+    m_soLog(i_soLog),\r
+    m_log(i_log),\r
+    m_currentKeymap(NULL)\r
+{\r
+  m_defaultKeySeqModifier =\r
+    m_defaultAssignModifier.release(Modifier::Type_ImeComp);\r
+}\r
+\r
+\r
+/* load m_setting\r
+   If called by "include", 'filename' describes filename.\r
+   Otherwise the 'filename' is empty.\r
+ */\r
+bool SettingLoader::load(Setting *i_setting, const tstringi &i_filename)\r
+{\r
+  m_setting = i_setting;\r
+  m_isThereAnyError = false;\r
+    \r
+  tstringi path;\r
+  if (!getFilename(i_filename, &path))\r
+  {\r
+    if (i_filename.empty())\r
+    {\r
+      Acquire a(m_soLog);\r
+      getFilename(i_filename, &path, 0);       // show filenames\r
+      return false;\r
+    }\r
+    else\r
+      throw ErrorMessage() << _T("`") << i_filename\r
+                          << _T("': no such file or other error.");\r
+  }\r
+\r
+  // create global keymap's default keySeq\r
+  ActionFunction af(createFunctionData(_T("OtherWindowClass")));\r
+  KeySeq *globalDefault = m_setting->m_keySeqs.add(KeySeq(_T("")).add(af));\r
+  \r
+  // add default keymap\r
+  m_currentKeymap = m_setting->m_keymaps.add(\r
+    Keymap(Keymap::Type_windowOr, _T("Global"), _T(""), _T(""),\r
+          globalDefault, NULL));\r
+\r
+  /*\r
+  // add keyboard layout name\r
+  if (filename.empty())\r
+  {\r
+    char keyboardLayoutName[KL_NAMELENGTH];\r
+    if (GetKeyboardLayoutName(keyboardLayoutName))\r
+    {\r
+      tstringi kl = tstringi(_T("KeyboardLayout/")) + keyboardLayoutName;\r
+      m_setting->symbols.insert(kl);\r
+      Acquire a(m_soLog);\r
+      *m_log << _T("KeyboardLayout: ") << kl << std::endl;\r
+    }\r
+  }\r
+  */\r
+  \r
+  // load\r
+  load(path);\r
+\r
+  // finalize\r
+  if (i_filename.empty())\r
+    m_setting->m_keymaps.adjustModifier(m_setting->m_keyboard);\r
+  \r
+  return !m_isThereAnyError;\r
+}\r
+\r
+\r
+std::vector<tstringi> *SettingLoader::m_prefixes; // m_prefixes terminal symbol\r
+size_t SettingLoader::m_prefixesRefCcount;     /* reference count of\r
+                                                  m_prefixes */\r
index bc7d7af..1d0ce55 100644 (file)
--- a/setting.h
+++ b/setting.h
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// setting.h
-
-
-#ifndef _SETTING_H
-#  define _SETTING_H
-
-
-#  include "keymap.h"
-#  include "parser.h"
-#  include "multithread.h"
-#  include <set>
-
-
-/// this class contains all of loaded settings
-class Setting
-{
-public:
-  typedef std::set<tstringi> Symbols;          ///
-  typedef std::list<Modifier> Modifiers;       /// 
-  
-public:
-  Keyboard m_keyboard;                         ///
-  Keymaps m_keymaps;                           ///
-  KeySeqs m_keySeqs;                           ///
-  Symbols m_symbols;                           ///
-  bool m_correctKanaLockHandling;              ///
-  bool m_sts4mayu;                             ///
-  bool m_cts4mayu;                             ///
-  unsigned int m_oneShotRepeatableDelay;       ///
-
-public:
-  Setting()
-    : m_correctKanaLockHandling(false),
-      m_sts4mayu(false),
-      m_cts4mayu(false),
-      m_oneShotRepeatableDelay(0) { }
-};
-
-
-///
-namespace Event
-{
-  ///
-  extern Key prefixed;
-  ///
-  extern Key before_key_down;
-  ///
-  extern Key after_key_up;
-  ///
-  extern Key *events[];
-}
-
-
-///
-class SettingLoader
-{
-#  define FUNCTION_FRIEND
-#  include "functions.h"
-#  undef FUNCTION_FRIEND
-  
-public:
-  ///
-  class FunctionCreator
-  {
-  public:
-    const _TCHAR *m_name;                      /// 
-    FunctionData *m_creator;                   /// 
-  };
-
-private:
-  typedef std::vector<Token> Tokens;           ///
-  typedef std::vector<tstringi> Prefixes;      ///
-  typedef std::vector<bool> CanReadStack;      /// 
-  
-private:
-  Setting *m_setting;                          /// loaded setting
-  bool m_isThereAnyError;                      /// is there any error ?
-
-  SyncObject *m_soLog;                         /// guard log output stream
-  tostream *m_log;                             /// log output stream
-  
-  tstringi m_currentFilename;                  /// current filename
-  
-  Tokens m_tokens;                             /// tokens for current line
-  Tokens::iterator m_ti;                       /// current processing token
-
-  static Prefixes *m_prefixes;                 /// prefix terminal symbol
-  static size_t m_prefixesRefCcount;           /// reference count of prefix
-
-  Keymap *m_currentKeymap;                     /// current keymap
-
-  CanReadStack m_canReadStack;                 /// for &lt;COND_SYMBOL&gt;
-
-  Modifier m_defaultAssignModifier;            /** default
-                                                    &lt;ASSIGN_MODIFIER&gt; */
-  Modifier m_defaultKeySeqModifier;            /** default
-                                                    &lt;KEYSEQ_MODIFIER&gt; */
-
-private:
-  bool isEOL();                                        /// is there no more tokens ?
-  Token *getToken();                           /// get next token
-  Token *lookToken();                          /// look next token
-  bool getOpenParen(bool i_doesThrow, const _TCHAR *i_name); /// argument "("
-  bool getCloseParen(bool i_doesThrow, const _TCHAR *i_name); /// argument ")"
-  bool getComma(bool i_doesThrow, const _TCHAR *i_name); /// argument ","
-  
-  void load_LINE();                            /// &lt;LINE&gt;
-  void load_DEFINE();                          /// &lt;DEFINE&gt;
-  void load_IF();                              /// &lt;IF&gt;
-  void load_ELSE(bool i_isElseIf, const tstringi &i_token);
-                                               /// &lt;ELSE&gt; &lt;ELSEIF&gt;
-  bool load_ENDIF(const tstringi &i_token);    /// &lt;ENDIF&gt;
-  void load_INCLUDE();                         /// &lt;INCLUDE&gt;
-  void load_SCAN_CODES(Key *o_key);            /// &lt;SCAN_CODES&gt;
-  void load_DEFINE_KEY();                      /// &lt;DEFINE_KEY&gt;
-  void load_DEFINE_MODIFIER();                 /// &lt;DEFINE_MODIFIER&gt;
-  void load_DEFINE_SYNC_KEY();                 /// &lt;DEFINE_SYNC_KEY&gt;
-  void load_DEFINE_ALIAS();                    /// &lt;DEFINE_ALIAS&gt;
-  void load_DEFINE_SUBSTITUTE();               /// &lt;DEFINE_SUBSTITUTE&gt;
-  void load_DEFINE_OPTION();                   /// &lt;DEFINE_OPTION&gt;
-  void load_KEYBOARD_DEFINITION();             /// &lt;KEYBOARD_DEFINITION&gt;
-  Modifier load_MODIFIER(Modifier::Type i_mode, Modifier i_modifier,
-                        Modifier::Type *o_mode = NULL);
-                                               /// &lt;..._MODIFIER&gt;
-  Key *load_KEY_NAME();                                /// &lt;KEY_NAME&gt;
-  void load_KEYMAP_DEFINITION(const Token *i_which);
-                                               /// &lt;KEYMAP_DEFINITION&gt;
-  void load_ARGUMENT(bool *o_arg);             /// &lt;ARGUMENT&gt;
-  void load_ARGUMENT(int *o_arg);              /// &lt;ARGUMENT&gt;
-  void load_ARGUMENT(unsigned int *o_arg);     /// &lt;ARGUMENT&gt;
-  void load_ARGUMENT(long *o_arg);             /// &lt;ARGUMENT&gt;
-  void load_ARGUMENT(unsigned __int64 *o_arg); /// &lt;ARGUMENT&gt;
-  void load_ARGUMENT(__int64 *o_arg);          /// &lt;ARGUMENT&gt;
-  void load_ARGUMENT(tstringq *o_arg);         /// &lt;ARGUMENT&gt;
-  void load_ARGUMENT(std::list<tstringq> *o_arg); /// &lt;ARGUMENT&gt;
-  void load_ARGUMENT(tregex *o_arg);           /// &lt;ARGUMENT&gt;
-  void load_ARGUMENT(VKey *o_arg);             /// &lt;ARGUMENT_VK&gt;
-  void load_ARGUMENT(ToWindowType *o_arg);     /// &lt;ARGUMENT_WINDOW&gt;
-  void load_ARGUMENT(GravityType *o_arg);      /// &lt;ARGUMENT&gt;
-  void load_ARGUMENT(MouseHookType *o_arg);    /// &lt;ARGUMENT&gt;
-  void load_ARGUMENT(MayuDialogType *o_arg);   /// &lt;ARGUMENT&gt;
-  void load_ARGUMENT(ModifierLockType *o_arg); /// &lt;ARGUMENT_LOCK&gt;
-  void load_ARGUMENT(ToggleType *o_arg);       /// &lt;ARGUMENT&gt;
-  void load_ARGUMENT(ShowCommandType *o_arg);  ///&lt;ARGUMENT_SHOW_WINDOW&gt;
-  void load_ARGUMENT(TargetWindowType *o_arg);
-                                       /// &lt;ARGUMENT_TARGET_WINDOW_TYPE&gt;
-  void load_ARGUMENT(BooleanType *o_arg);      /// &lt;bool&gt;
-  void load_ARGUMENT(LogicalOperatorType *o_arg);/// &lt;ARGUMENT&gt;
-  void load_ARGUMENT(Modifier *o_arg);         /// &lt;ARGUMENT&gt;
-  void load_ARGUMENT(const Keymap **o_arg);    /// &lt;ARGUMENT&gt;
-  void load_ARGUMENT(const KeySeq **o_arg);    /// &lt;ARGUMENT&gt;
-  void load_ARGUMENT(StrExprArg *o_arg);       /// &lt;ARGUMENT&gt;
-  void load_ARGUMENT(WindowMonitorFromType *o_arg);    /// &lt;ARGUMENT&gt;
-  KeySeq *load_KEY_SEQUENCE(
-    const tstringi &i_name = _T(""), bool i_isInParen = false,
-    Modifier::Type i_mode = Modifier::Type_KEYSEQ); /// &lt;KEY_SEQUENCE&gt;
-  void load_KEY_ASSIGN();                      /// &lt;KEY_ASSIGN&gt;
-  void load_EVENT_ASSIGN();                    /// &lt;EVENT_ASSIGN&gt;
-  void load_MODIFIER_ASSIGNMENT();             /// &lt;MODIFIER_ASSIGN&gt;
-  void load_LOCK_ASSIGNMENT();                 /// &lt;LOCK_ASSIGN&gt;
-  void load_KEYSEQ_DEFINITION();               /// &lt;KEYSEQ_DEFINITION&gt;
-
-  /// load
-  void load(const tstringi &i_filename);
-
-  /// is the filename readable ?
-  bool isReadable(const tstringi &i_filename, int i_debugLevel = 1) const;
-
-  /// get filename
-  bool getFilename(const tstringi &i_name,
-                  tstringi *o_path, int i_debugLevel = 1) const;
-
-public:
-  ///
-  SettingLoader(SyncObject *i_soLog, tostream *i_log);
-
-  /// load setting
-  bool load(Setting *o_setting, const tstringi &i_filename = _T(""));
-};
-
-
-/// get home directory path
-typedef std::list<tstringi> HomeDirectories;
-extern void getHomeDirectories(HomeDirectories *o_path);
-
-
-#endif // !_SETTING_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// setting.h\r
+\r
+\r
+#ifndef _SETTING_H\r
+#  define _SETTING_H\r
+\r
+\r
+#  include "keymap.h"\r
+#  include "parser.h"\r
+#  include "multithread.h"\r
+#  include <set>\r
+\r
+\r
+/// this class contains all of loaded settings\r
+class Setting\r
+{\r
+public:\r
+  typedef std::set<tstringi> Symbols;          ///\r
+  typedef std::list<Modifier> Modifiers;       /// \r
+  \r
+public:\r
+  Keyboard m_keyboard;                         ///\r
+  Keymaps m_keymaps;                           ///\r
+  KeySeqs m_keySeqs;                           ///\r
+  Symbols m_symbols;                           ///\r
+  bool m_correctKanaLockHandling;              ///\r
+  bool m_sts4mayu;                             ///\r
+  bool m_cts4mayu;                             ///\r
+  unsigned int m_oneShotRepeatableDelay;       ///\r
+\r
+public:\r
+  Setting()\r
+    : m_correctKanaLockHandling(false),\r
+      m_sts4mayu(false),\r
+      m_cts4mayu(false),\r
+      m_oneShotRepeatableDelay(0) { }\r
+};\r
+\r
+\r
+///\r
+namespace Event\r
+{\r
+  ///\r
+  extern Key prefixed;\r
+  ///\r
+  extern Key before_key_down;\r
+  ///\r
+  extern Key after_key_up;\r
+  ///\r
+  extern Key *events[];\r
+}\r
+\r
+\r
+///\r
+class SettingLoader\r
+{\r
+#  define FUNCTION_FRIEND\r
+#  include "functions.h"\r
+#  undef FUNCTION_FRIEND\r
+  \r
+public:\r
+  ///\r
+  class FunctionCreator\r
+  {\r
+  public:\r
+    const _TCHAR *m_name;                      /// \r
+    FunctionData *m_creator;                   /// \r
+  };\r
+\r
+private:\r
+  typedef std::vector<Token> Tokens;           ///\r
+  typedef std::vector<tstringi> Prefixes;      ///\r
+  typedef std::vector<bool> CanReadStack;      /// \r
+  \r
+private:\r
+  Setting *m_setting;                          /// loaded setting\r
+  bool m_isThereAnyError;                      /// is there any error ?\r
+\r
+  SyncObject *m_soLog;                         /// guard log output stream\r
+  tostream *m_log;                             /// log output stream\r
+  \r
+  tstringi m_currentFilename;                  /// current filename\r
+  \r
+  Tokens m_tokens;                             /// tokens for current line\r
+  Tokens::iterator m_ti;                       /// current processing token\r
+\r
+  static Prefixes *m_prefixes;                 /// prefix terminal symbol\r
+  static size_t m_prefixesRefCcount;           /// reference count of prefix\r
+\r
+  Keymap *m_currentKeymap;                     /// current keymap\r
+\r
+  CanReadStack m_canReadStack;                 /// for &lt;COND_SYMBOL&gt;\r
+\r
+  Modifier m_defaultAssignModifier;            /** default\r
+                                                    &lt;ASSIGN_MODIFIER&gt; */\r
+  Modifier m_defaultKeySeqModifier;            /** default\r
+                                                    &lt;KEYSEQ_MODIFIER&gt; */\r
+\r
+private:\r
+  bool isEOL();                                        /// is there no more tokens ?\r
+  Token *getToken();                           /// get next token\r
+  Token *lookToken();                          /// look next token\r
+  bool getOpenParen(bool i_doesThrow, const _TCHAR *i_name); /// argument "("\r
+  bool getCloseParen(bool i_doesThrow, const _TCHAR *i_name); /// argument ")"\r
+  bool getComma(bool i_doesThrow, const _TCHAR *i_name); /// argument ","\r
+  \r
+  void load_LINE();                            /// &lt;LINE&gt;\r
+  void load_DEFINE();                          /// &lt;DEFINE&gt;\r
+  void load_IF();                              /// &lt;IF&gt;\r
+  void load_ELSE(bool i_isElseIf, const tstringi &i_token);\r
+                                               /// &lt;ELSE&gt; &lt;ELSEIF&gt;\r
+  bool load_ENDIF(const tstringi &i_token);    /// &lt;ENDIF&gt;\r
+  void load_INCLUDE();                         /// &lt;INCLUDE&gt;\r
+  void load_SCAN_CODES(Key *o_key);            /// &lt;SCAN_CODES&gt;\r
+  void load_DEFINE_KEY();                      /// &lt;DEFINE_KEY&gt;\r
+  void load_DEFINE_MODIFIER();                 /// &lt;DEFINE_MODIFIER&gt;\r
+  void load_DEFINE_SYNC_KEY();                 /// &lt;DEFINE_SYNC_KEY&gt;\r
+  void load_DEFINE_ALIAS();                    /// &lt;DEFINE_ALIAS&gt;\r
+  void load_DEFINE_SUBSTITUTE();               /// &lt;DEFINE_SUBSTITUTE&gt;\r
+  void load_DEFINE_OPTION();                   /// &lt;DEFINE_OPTION&gt;\r
+  void load_KEYBOARD_DEFINITION();             /// &lt;KEYBOARD_DEFINITION&gt;\r
+  Modifier load_MODIFIER(Modifier::Type i_mode, Modifier i_modifier,\r
+                        Modifier::Type *o_mode = NULL);\r
+                                               /// &lt;..._MODIFIER&gt;\r
+  Key *load_KEY_NAME();                                /// &lt;KEY_NAME&gt;\r
+  void load_KEYMAP_DEFINITION(const Token *i_which);\r
+                                               /// &lt;KEYMAP_DEFINITION&gt;\r
+  void load_ARGUMENT(bool *o_arg);             /// &lt;ARGUMENT&gt;\r
+  void load_ARGUMENT(int *o_arg);              /// &lt;ARGUMENT&gt;\r
+  void load_ARGUMENT(unsigned int *o_arg);     /// &lt;ARGUMENT&gt;\r
+  void load_ARGUMENT(long *o_arg);             /// &lt;ARGUMENT&gt;\r
+  void load_ARGUMENT(unsigned __int64 *o_arg); /// &lt;ARGUMENT&gt;\r
+  void load_ARGUMENT(__int64 *o_arg);          /// &lt;ARGUMENT&gt;\r
+  void load_ARGUMENT(tstringq *o_arg);         /// &lt;ARGUMENT&gt;\r
+  void load_ARGUMENT(std::list<tstringq> *o_arg); /// &lt;ARGUMENT&gt;\r
+  void load_ARGUMENT(tregex *o_arg);           /// &lt;ARGUMENT&gt;\r
+  void load_ARGUMENT(VKey *o_arg);             /// &lt;ARGUMENT_VK&gt;\r
+  void load_ARGUMENT(ToWindowType *o_arg);     /// &lt;ARGUMENT_WINDOW&gt;\r
+  void load_ARGUMENT(GravityType *o_arg);      /// &lt;ARGUMENT&gt;\r
+  void load_ARGUMENT(MouseHookType *o_arg);    /// &lt;ARGUMENT&gt;\r
+  void load_ARGUMENT(MayuDialogType *o_arg);   /// &lt;ARGUMENT&gt;\r
+  void load_ARGUMENT(ModifierLockType *o_arg); /// &lt;ARGUMENT_LOCK&gt;\r
+  void load_ARGUMENT(ToggleType *o_arg);       /// &lt;ARGUMENT&gt;\r
+  void load_ARGUMENT(ShowCommandType *o_arg);  ///&lt;ARGUMENT_SHOW_WINDOW&gt;\r
+  void load_ARGUMENT(TargetWindowType *o_arg);\r
+                                       /// &lt;ARGUMENT_TARGET_WINDOW_TYPE&gt;\r
+  void load_ARGUMENT(BooleanType *o_arg);      /// &lt;bool&gt;\r
+  void load_ARGUMENT(LogicalOperatorType *o_arg);/// &lt;ARGUMENT&gt;\r
+  void load_ARGUMENT(Modifier *o_arg);         /// &lt;ARGUMENT&gt;\r
+  void load_ARGUMENT(const Keymap **o_arg);    /// &lt;ARGUMENT&gt;\r
+  void load_ARGUMENT(const KeySeq **o_arg);    /// &lt;ARGUMENT&gt;\r
+  void load_ARGUMENT(StrExprArg *o_arg);       /// &lt;ARGUMENT&gt;\r
+  void load_ARGUMENT(WindowMonitorFromType *o_arg);    /// &lt;ARGUMENT&gt;\r
+  KeySeq *load_KEY_SEQUENCE(\r
+    const tstringi &i_name = _T(""), bool i_isInParen = false,\r
+    Modifier::Type i_mode = Modifier::Type_KEYSEQ); /// &lt;KEY_SEQUENCE&gt;\r
+  void load_KEY_ASSIGN();                      /// &lt;KEY_ASSIGN&gt;\r
+  void load_EVENT_ASSIGN();                    /// &lt;EVENT_ASSIGN&gt;\r
+  void load_MODIFIER_ASSIGNMENT();             /// &lt;MODIFIER_ASSIGN&gt;\r
+  void load_LOCK_ASSIGNMENT();                 /// &lt;LOCK_ASSIGN&gt;\r
+  void load_KEYSEQ_DEFINITION();               /// &lt;KEYSEQ_DEFINITION&gt;\r
+\r
+  /// load\r
+  void load(const tstringi &i_filename);\r
+\r
+  /// is the filename readable ?\r
+  bool isReadable(const tstringi &i_filename, int i_debugLevel = 1) const;\r
+\r
+  /// get filename\r
+  bool getFilename(const tstringi &i_name,\r
+                  tstringi *o_path, int i_debugLevel = 1) const;\r
+\r
+public:\r
+  ///\r
+  SettingLoader(SyncObject *i_soLog, tostream *i_log);\r
+\r
+  /// load setting\r
+  bool load(Setting *o_setting, const tstringi &i_filename = _T(""));\r
+};\r
+\r
+\r
+/// get home directory path\r
+typedef std::list<tstringi> HomeDirectories;\r
+extern void getHomeDirectories(HomeDirectories *o_path);\r
+\r
+\r
+#endif // !_SETTING_H\r
index 5837626..4a6f44a 100644 (file)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// stringtool.cpp
-
-
-#include "stringtool.h"
-#include "array.h"
-#include <locale>
-#include <malloc.h>
-#include <mbstring.h>
-
-
-/* ************************************************************************** *
-   
-STRLCPY(3)                OpenBSD Programmer's Manual               STRLCPY(3)
-
-NAME
-     strlcpy, strlcat - size-bounded string copying and concatenation
-
-
-
-SYNOPSIS
-     #include <string.h>
-
-     size_t
-     strlcpy(char *dst, const char *src, size_t size);
-
-     size_t
-     strlcat(char *dst, const char *src, size_t size);
-
-DESCRIPTION
-     The strlcpy() and strlcat() functions copy and concatenate strings re-
-     spectively.  They are designed to be safer, more consistent, and less er-
-     ror prone replacements for strncpy(3) and strncat(3).  Unlike those func-
-     tions, strlcpy() and strlcat() take the full size of the buffer (not just
-     the length) and guarantee to NUL-terminate the result (as long as size is
-     larger than 0).  Note that you should include a byte for the NUL in size.
-
-     The strlcpy() function copies up to size - 1 characters from the NUL-ter-
-     minated string src to dst, NUL-terminating the result.
-
-     The strlcat() function appends the NUL-terminated string src to the end
-     of dst. It will append at most size - strlen(dst) - 1 bytes, NUL-termi-
-     nating the result.
-
-RETURN VALUES
-     The strlcpy() and strlcat() functions return the total length of the
-     string they tried to create.  For strlcpy() that means the length of src.
-     For strlcat() that means the initial length of dst plus the length of
-     src. While this may seem somewhat confusing it was done to make trunca-
-     tion detection simple.
-
-EXAMPLES
-     The following code fragment illustrates the simple case:
-
-           char *s, *p, buf[BUFSIZ];
-
-           ...
-
-           (void)strlcpy(buf, s, sizeof(buf));
-           (void)strlcat(buf, p, sizeof(buf));
-
-     To detect truncation, perhaps while building a pathname, something like
-     the following might be used:
-
-           char *dir, *file, pname[MAXPATHNAMELEN];
-
-           ...
-
-           if (strlcpy(pname, dir, sizeof(pname)) >= sizeof(pname))
-                   goto toolong;
-           if (strlcat(pname, file, sizeof(pname)) >= sizeof(pname))
-                   goto toolong;
-
-     Since we know how many characters we copied the first time, we can speed
-     things up a bit by using a copy instead on an append:
-
-           char *dir, *file, pname[MAXPATHNAMELEN];
-           size_t n;
-
-           ...
-
-           n = strlcpy(pname, dir, sizeof(pname));
-           if (n >= sizeof(pname))
-                   goto toolong;
-           if (strlcpy(pname + n, file, sizeof(pname) - n) >= sizeof(pname)-n)
-                   goto toolong;
-
-     However, one may question the validity of such optimizations, as they de-
-     feat the whole purpose of strlcpy() and strlcat().  As a matter of fact,
-     the first version of this manual page got it wrong.
-
-SEE ALSO
-     snprintf(3),  strncat(3),  strncpy(3)
-
-OpenBSD 2.6                      June 22, 1998                               2
-
-
--------------------------------------------------------------------------------
-
-Source: OpenBSD 2.6 man pages. Copyright: Portions are copyrighted by BERKELEY
-SOFTWARE DESIGN, INC., The Regents of the University of California,
-Massachusetts Institute of Technology, Free Software Foundation, FreeBSD Inc.,
-and others.
-
-* ************************************************************************** */
-
-
-// copy
-template <class T>
-static inline size_t xstrlcpy(T *o_dest, const T *i_src, size_t i_destSize)
-{
-  T *d = o_dest;
-  const T *s = i_src;
-  size_t n = i_destSize;
-
-  ASSERT( o_dest != NULL );
-  ASSERT( i_src != NULL );
-
-  // Copy as many bytes as will fit
-  if (n != 0 && --n != 0)
-  {
-    do
-    {
-      if ((*d++ = *s++) == 0)
-       break;
-    } while (--n != 0);
-  }
-
-  // Not enough room in o_dest, add NUL and traverse rest of i_src
-  if (n == 0)
-  {
-    if (i_destSize != 0)
-      *d = T();                                        // NUL-terminate o_dest
-    while (*s++)
-      ;
-  }
-
-  return (s - i_src - 1);                      // count does not include NUL
-}
-
-
-// copy
-size_t strlcpy(char *o_dest, const char *i_src, size_t i_destSize)
-{
-  return xstrlcpy(o_dest, i_src, i_destSize);
-}
-
-
-// copy
-size_t wcslcpy(wchar_t *o_dest, const wchar_t *i_src, size_t i_destSize)
-{
-  return xstrlcpy(o_dest, i_src, i_destSize);
-}
-
-
-// copy 
-size_t mbslcpy(unsigned char *o_dest, const unsigned char *i_src,
-              size_t i_destSize)
-{
-  unsigned char *d = o_dest;
-  const unsigned char *s = i_src;
-  size_t n = i_destSize;
-
-  ASSERT( o_dest != NULL );
-  ASSERT( i_src != NULL );
-
-  if (n == 0)
-    return strlen(reinterpret_cast<const char *>(i_src));
-  
-  // Copy as many bytes as will fit
-  for (-- n; *s && 0 < n; -- n)
-  {
-    if (_ismbblead(*s))
-    {
-      if (!(s[1] && 2 <= n))
-       break;
-      *d++ = *s++;
-      -- n;
-    }
-    *d++ = *s++;
-  }
-  *d = '\0';
-
-  for (; *s; ++ s)
-    ;
-  
-  return s - i_src;
-}
-
-
-/// stream output
-tostream &operator<<(tostream &i_ost, const tstringq &i_data)
-{
-  i_ost << _T("\"");
-  for (const _TCHAR *s = i_data.c_str(); *s; ++ s)
-  {
-    switch (*s)
-    {
-      case _T('\a'): i_ost << _T("\\a"); break;
-      case _T('\f'): i_ost << _T("\\f"); break;
-      case _T('\n'): i_ost << _T("\\n"); break;
-      case _T('\r'): i_ost << _T("\\r"); break;
-      case _T('\t'): i_ost << _T("\\t"); break;
-      case _T('\v'): i_ost << _T("\\v"); break;
-      case _T('"'): i_ost << _T("\\\""); break;
-      default:
-       if (_istlead(*s))
-       {
-         _TCHAR buf[3] = { s[0], s[1], 0 };
-         i_ost << buf;
-         ++ s;
-       }
-       else if (_istprint(*s))
-       {
-         _TCHAR buf[2] = { *s, 0 };
-         i_ost << buf;
-       }
-       else
-       {
-         i_ost << _T("\\x");
-         _TCHAR buf[5];
-#ifdef _UNICODE
-         _sntprintf(buf, NUMBER_OF(buf), _T("%04x"), *s);
-#else
-         _sntprintf(buf, NUMBER_OF(buf), _T("%02x"), *s);
-#endif
-         i_ost << buf;
-       }
-       break;
-    }
-  }
-  i_ost << _T("\"");
-  return i_ost;
-}
-
-
-// interpret meta characters such as \n
-tstring interpretMetaCharacters(const _TCHAR *i_str, size_t i_len,
-                               const _TCHAR *i_quote,
-                               bool i_doesUseRegexpBackReference)
-{
-  // interpreted string is always less than i_len
-  Array<_TCHAR> result(i_len + 1);
-  // destination
-  _TCHAR *d = result.get();
-  // end pointer
-  const _TCHAR *end = i_str + i_len;
-  
-  while (i_str < end && *i_str)
-  {
-    if (*i_str != _T('\\'))
-    {
-      if (_istlead(*i_str) && *(i_str + 1) && i_str + 1 < end)
-       *d++ = *i_str++;
-      *d++ = *i_str++;
-    }
-    else if (*(i_str + 1) != _T('\0'))
-    {
-      i_str ++;
-      if (i_quote && _tcschr(i_quote, *i_str))
-       *d++ = *i_str++;
-      else
-       switch (*i_str)
-       {
-         case _T('a'): *d++ = _T('\x07'); i_str ++; break;
-           //case _T('b'): *d++ = _T('\b'); i_str ++; break;
-         case _T('e'): *d++ = _T('\x1b'); i_str ++; break;
-         case _T('f'): *d++ = _T('\f'); i_str ++; break;
-         case _T('n'): *d++ = _T('\n'); i_str ++; break;
-         case _T('r'): *d++ = _T('\r'); i_str ++; break;
-         case _T('t'): *d++ = _T('\t'); i_str ++; break;
-         case _T('v'): *d++ = _T('\v'); i_str ++; break;
-           //case _T('?'): *d++ = _T('\x7f'); i_str ++; break;
-           //case _T('_'): *d++ = _T(' '); i_str ++; break;
-           //case _T('\\'): *d++ = _T('\\'); i_str ++; break;
-         case _T('\''): *d++ = _T('\''); i_str ++; break;
-         case _T('"'): *d++ = _T('"'); i_str ++; break;
-         case _T('\\'): *d++ = _T('\\'); i_str ++; break;
-         case _T('c'): // control code, for example '\c[' is escape: '\x1b'
-           i_str ++;
-           if (i_str < end && *i_str)
-           {
-             static const _TCHAR *ctrlchar =
-               _T("@ABCDEFGHIJKLMNO")
-               _T("PQRSTUVWXYZ[\\]^_")
-               _T("@abcdefghijklmno")
-               _T("pqrstuvwxyz@@@@?");
-             static const _TCHAR *ctrlcode =
-               _T("\00\01\02\03\04\05\06\07\10\11\12\13\14\15\16\17")
-               _T("\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37")
-               _T("\00\01\02\03\04\05\06\07\10\11\12\13\14\15\16\17")
-               _T("\20\21\22\23\24\25\26\27\30\31\32\00\00\00\00\177");
-             if (const _TCHAR *c = _tcschr(ctrlchar, *i_str))
-               *d++ = ctrlcode[c - ctrlchar], i_str ++;
-           }
-           break;
-         case _T('x'): case _T('X'):
-         {
-           i_str ++;
-           static const _TCHAR *hexchar = _T("0123456789ABCDEFabcdef");
-           static int hexvalue[] = { 0, 1, 2, 3, 4, 5 ,6, 7, 8, 9,
-                                     10, 11, 12, 13, 14, 15,
-                                     10, 11, 12, 13, 14, 15, };
-           bool brace = false;
-           if (i_str < end && *i_str == _T('{'))
-           {
-             i_str ++;
-             brace = true;
-           }
-           int n = 0;
-           for (; i_str < end && *i_str; i_str ++)
-             if (const _TCHAR *c = _tcschr(hexchar, *i_str))
-               n = n * 16 + hexvalue[c - hexchar];
-             else
-               break;
-           if (i_str < end && *i_str == _T('}') && brace)
-             i_str ++;
-           if (0 < n)
-             *d++ = static_cast<_TCHAR>(n);
-           break;
-         }
-         case _T('1'): case _T('2'): case _T('3'):
-         case _T('4'): case _T('5'): case _T('6'): case _T('7'):
-           if (i_doesUseRegexpBackReference)
-             goto case_default;
-           // fall through
-         case _T('0'):
-         {
-           static const _TCHAR *octalchar = _T("01234567");
-           static int octalvalue[] = { 0, 1, 2, 3, 4, 5 ,6, 7, };
-           int n = 0;
-           for (; i_str < end && *i_str; i_str ++)
-             if (const _TCHAR *c = _tcschr(octalchar, *i_str))
-               n = n * 8 + octalvalue[c - octalchar];
-             else
-               break;
-           if (0 < n)
-             *d++ = static_cast<_TCHAR>(n);
-           break;
-         }
-         default:
-         case_default:
-           *d++ = _T('\\');
-           if (_istlead(*i_str) && *(i_str + 1) && i_str + 1 < end)
-             *d++ = *i_str++;
-           *d++ = *i_str++;
-           break;
-       }
-    }
-  }
-  *d =_T('\0');
-  return result.get();
-}
-
-
-// add session id to i_str
-tstring addSessionId(const _TCHAR *i_str)
-{
-    DWORD sessionId;
-    tstring s(i_str);
-    if (ProcessIdToSessionId(GetCurrentProcessId(), &sessionId)) {
-       _TCHAR buf[20];
-       _sntprintf(buf, NUMBER_OF(buf), _T("%u"), sessionId);
-       s += buf;
-    }
-    return s;
-}
-
-
-#ifdef _MBCS
-// escape regexp special characters in MBCS trail bytes
-std::string guardRegexpFromMbcs(const char *i_str)
-{
-  size_t len = strlen(i_str);
-  Array<char> buf(len * 2 + 1);
-  char *p = buf.get();
-  while (*i_str)
-  {
-    if (_ismbblead(static_cast<u_char>(*i_str)) && i_str[1])
-    {
-      *p ++ = *i_str ++;
-      if (strchr(".*?+(){}[]^$", *i_str))
-       *p ++ = '\\';
-    }
-    *p ++ = *i_str ++;
-  }
-  return std::string(buf.get(), p);
-}
-#endif // !_MBCS
-
-
-// converter
-std::wstring to_wstring(const std::string &i_str)
-{
-  size_t size = mbstowcs(NULL, i_str.c_str(), i_str.size() + 1);
-  if (size == (size_t)-1)
-    return std::wstring();
-  Array<wchar_t> result(size + 1);
-  mbstowcs(result.get(), i_str.c_str(), i_str.size() + 1);
-  return std::wstring(result.get());
-}
-
-
-// converter
-std::string to_string(const std::wstring &i_str)
-{
-  size_t size = wcstombs(NULL, i_str.c_str(), i_str.size() + 1);
-  if (size == (size_t)-1)
-    return std::string();
-  Array<char> result(size + 1);
-  wcstombs(result.get(), i_str.c_str(), i_str.size() + 1);
-  return std::string(result.get());
-}
-
-
-/// stream output
-tostream &operator<<(tostream &i_ost, const tregex &i_data)
-{
-  return i_ost << i_data.str();
-}
-
-
-/// get lower string
-tstring toLower(const tstring &i_str)
-{
-  tstring str(i_str);
-  for (size_t i = 0; i < str.size(); ++ i)
-  {
-    if (_ismbblead(str[i]))
-      ++ i;
-    else
-      str[i] = tolower(str[i]);
-  }
-  return str;
-}
-
-
-// convert wstring to UTF-8
-std::string to_UTF_8(const std::wstring &i_str)
-{
-  // 0xxxxxxx: 00-7F
-  // 110xxxxx 10xxxxxx: 0080-07FF
-  // 1110xxxx 10xxxxxx 10xxxxxx: 0800 - FFFF
-
-  int size = 0;
-  
-  // count needed buffer size
-  for (std::wstring::const_iterator i = i_str.begin(); i != i_str.end(); ++ i)
-  {
-    if (0x0000 <= *i && *i <= 0x007f)
-      size += 1;
-    else if (0x0080 <= *i && *i <= 0x07ff)
-      size += 2;
-    else if (0x0800 <= *i && *i <= 0xffff)
-      size += 3;
-  }
-
-  Array<char> result(size);
-  int ri = 0;
-  
-  // make UTF-8
-  for (std::wstring::const_iterator i = i_str.begin(); i != i_str.end(); ++ i)
-  {
-    if (0x0000 <= *i && *i <= 0x007f)
-      result[ri ++] = static_cast<char>(*i);
-    else if (0x0080 <= *i && *i <= 0x07ff)
-    {
-      result[ri ++] = static_cast<char>(((*i & 0x0fc0) >>  6) | 0xc0);
-      result[ri ++] = static_cast<char>(( *i & 0x003f       ) | 0x80);
-    }
-    else if (0x0800 <= *i && *i <= 0xffff)
-    {
-      result[ri ++] = static_cast<char>(((*i & 0xf000) >> 12) | 0xe0);
-      result[ri ++] = static_cast<char>(((*i & 0x0fc0) >>  6) | 0x80);
-      result[ri ++] = static_cast<char>(( *i & 0x003f       ) | 0x80);
-    }
-  }
-
-  return std::string(result.begin(), result.end());
-}
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// stringtool.cpp\r
+\r
+\r
+#include "stringtool.h"\r
+#include "array.h"\r
+#include <locale>\r
+#include <malloc.h>\r
+#include <mbstring.h>\r
+\r
+\r
+/* ************************************************************************** *\r
+   \r
+STRLCPY(3)                OpenBSD Programmer's Manual               STRLCPY(3)\r
+\r
+NAME\r
+     strlcpy, strlcat - size-bounded string copying and concatenation\r
+\r
+\r
+\r
+SYNOPSIS\r
+     #include <string.h>\r
+\r
+     size_t\r
+     strlcpy(char *dst, const char *src, size_t size);\r
+\r
+     size_t\r
+     strlcat(char *dst, const char *src, size_t size);\r
+\r
+DESCRIPTION\r
+     The strlcpy() and strlcat() functions copy and concatenate strings re-\r
+     spectively.  They are designed to be safer, more consistent, and less er-\r
+     ror prone replacements for strncpy(3) and strncat(3).  Unlike those func-\r
+     tions, strlcpy() and strlcat() take the full size of the buffer (not just\r
+     the length) and guarantee to NUL-terminate the result (as long as size is\r
+     larger than 0).  Note that you should include a byte for the NUL in size.\r
+\r
+     The strlcpy() function copies up to size - 1 characters from the NUL-ter-\r
+     minated string src to dst, NUL-terminating the result.\r
+\r
+     The strlcat() function appends the NUL-terminated string src to the end\r
+     of dst. It will append at most size - strlen(dst) - 1 bytes, NUL-termi-\r
+     nating the result.\r
+\r
+RETURN VALUES\r
+     The strlcpy() and strlcat() functions return the total length of the\r
+     string they tried to create.  For strlcpy() that means the length of src.\r
+     For strlcat() that means the initial length of dst plus the length of\r
+     src. While this may seem somewhat confusing it was done to make trunca-\r
+     tion detection simple.\r
+\r
+EXAMPLES\r
+     The following code fragment illustrates the simple case:\r
+\r
+           char *s, *p, buf[BUFSIZ];\r
+\r
+           ...\r
+\r
+           (void)strlcpy(buf, s, sizeof(buf));\r
+           (void)strlcat(buf, p, sizeof(buf));\r
+\r
+     To detect truncation, perhaps while building a pathname, something like\r
+     the following might be used:\r
+\r
+           char *dir, *file, pname[MAXPATHNAMELEN];\r
+\r
+           ...\r
+\r
+           if (strlcpy(pname, dir, sizeof(pname)) >= sizeof(pname))\r
+                   goto toolong;\r
+           if (strlcat(pname, file, sizeof(pname)) >= sizeof(pname))\r
+                   goto toolong;\r
+\r
+     Since we know how many characters we copied the first time, we can speed\r
+     things up a bit by using a copy instead on an append:\r
+\r
+           char *dir, *file, pname[MAXPATHNAMELEN];\r
+           size_t n;\r
+\r
+           ...\r
+\r
+           n = strlcpy(pname, dir, sizeof(pname));\r
+           if (n >= sizeof(pname))\r
+                   goto toolong;\r
+           if (strlcpy(pname + n, file, sizeof(pname) - n) >= sizeof(pname)-n)\r
+                   goto toolong;\r
+\r
+     However, one may question the validity of such optimizations, as they de-\r
+     feat the whole purpose of strlcpy() and strlcat().  As a matter of fact,\r
+     the first version of this manual page got it wrong.\r
+\r
+SEE ALSO\r
+     snprintf(3),  strncat(3),  strncpy(3)\r
+\r
+OpenBSD 2.6                      June 22, 1998                               2\r
+\r
+\r
+-------------------------------------------------------------------------------\r
+\r
+Source: OpenBSD 2.6 man pages. Copyright: Portions are copyrighted by BERKELEY\r
+SOFTWARE DESIGN, INC., The Regents of the University of California,\r
+Massachusetts Institute of Technology, Free Software Foundation, FreeBSD Inc.,\r
+and others.\r
+\r
+* ************************************************************************** */\r
+\r
+\r
+// copy\r
+template <class T>\r
+static inline size_t xstrlcpy(T *o_dest, const T *i_src, size_t i_destSize)\r
+{\r
+  T *d = o_dest;\r
+  const T *s = i_src;\r
+  size_t n = i_destSize;\r
+\r
+  ASSERT( o_dest != NULL );\r
+  ASSERT( i_src != NULL );\r
+\r
+  // Copy as many bytes as will fit\r
+  if (n != 0 && --n != 0)\r
+  {\r
+    do\r
+    {\r
+      if ((*d++ = *s++) == 0)\r
+       break;\r
+    } while (--n != 0);\r
+  }\r
+\r
+  // Not enough room in o_dest, add NUL and traverse rest of i_src\r
+  if (n == 0)\r
+  {\r
+    if (i_destSize != 0)\r
+      *d = T();                                        // NUL-terminate o_dest\r
+    while (*s++)\r
+      ;\r
+  }\r
+\r
+  return (s - i_src - 1);                      // count does not include NUL\r
+}\r
+\r
+\r
+// copy\r
+size_t strlcpy(char *o_dest, const char *i_src, size_t i_destSize)\r
+{\r
+  return xstrlcpy(o_dest, i_src, i_destSize);\r
+}\r
+\r
+\r
+// copy\r
+size_t wcslcpy(wchar_t *o_dest, const wchar_t *i_src, size_t i_destSize)\r
+{\r
+  return xstrlcpy(o_dest, i_src, i_destSize);\r
+}\r
+\r
+\r
+// copy \r
+size_t mbslcpy(unsigned char *o_dest, const unsigned char *i_src,\r
+              size_t i_destSize)\r
+{\r
+  unsigned char *d = o_dest;\r
+  const unsigned char *s = i_src;\r
+  size_t n = i_destSize;\r
+\r
+  ASSERT( o_dest != NULL );\r
+  ASSERT( i_src != NULL );\r
+\r
+  if (n == 0)\r
+    return strlen(reinterpret_cast<const char *>(i_src));\r
+  \r
+  // Copy as many bytes as will fit\r
+  for (-- n; *s && 0 < n; -- n)\r
+  {\r
+    if (_ismbblead(*s))\r
+    {\r
+      if (!(s[1] && 2 <= n))\r
+       break;\r
+      *d++ = *s++;\r
+      -- n;\r
+    }\r
+    *d++ = *s++;\r
+  }\r
+  *d = '\0';\r
+\r
+  for (; *s; ++ s)\r
+    ;\r
+  \r
+  return s - i_src;\r
+}\r
+\r
+\r
+/// stream output\r
+tostream &operator<<(tostream &i_ost, const tstringq &i_data)\r
+{\r
+  i_ost << _T("\"");\r
+  for (const _TCHAR *s = i_data.c_str(); *s; ++ s)\r
+  {\r
+    switch (*s)\r
+    {\r
+      case _T('\a'): i_ost << _T("\\a"); break;\r
+      case _T('\f'): i_ost << _T("\\f"); break;\r
+      case _T('\n'): i_ost << _T("\\n"); break;\r
+      case _T('\r'): i_ost << _T("\\r"); break;\r
+      case _T('\t'): i_ost << _T("\\t"); break;\r
+      case _T('\v'): i_ost << _T("\\v"); break;\r
+      case _T('"'): i_ost << _T("\\\""); break;\r
+      default:\r
+       if (_istlead(*s))\r
+       {\r
+         _TCHAR buf[3] = { s[0], s[1], 0 };\r
+         i_ost << buf;\r
+         ++ s;\r
+       }\r
+       else if (_istprint(*s))\r
+       {\r
+         _TCHAR buf[2] = { *s, 0 };\r
+         i_ost << buf;\r
+       }\r
+       else\r
+       {\r
+         i_ost << _T("\\x");\r
+         _TCHAR buf[5];\r
+#ifdef _UNICODE\r
+         _sntprintf(buf, NUMBER_OF(buf), _T("%04x"), *s);\r
+#else\r
+         _sntprintf(buf, NUMBER_OF(buf), _T("%02x"), *s);\r
+#endif\r
+         i_ost << buf;\r
+       }\r
+       break;\r
+    }\r
+  }\r
+  i_ost << _T("\"");\r
+  return i_ost;\r
+}\r
+\r
+\r
+// interpret meta characters such as \n\r
+tstring interpretMetaCharacters(const _TCHAR *i_str, size_t i_len,\r
+                               const _TCHAR *i_quote,\r
+                               bool i_doesUseRegexpBackReference)\r
+{\r
+  // interpreted string is always less than i_len\r
+  Array<_TCHAR> result(i_len + 1);\r
+  // destination\r
+  _TCHAR *d = result.get();\r
+  // end pointer\r
+  const _TCHAR *end = i_str + i_len;\r
+  \r
+  while (i_str < end && *i_str)\r
+  {\r
+    if (*i_str != _T('\\'))\r
+    {\r
+      if (_istlead(*i_str) && *(i_str + 1) && i_str + 1 < end)\r
+       *d++ = *i_str++;\r
+      *d++ = *i_str++;\r
+    }\r
+    else if (*(i_str + 1) != _T('\0'))\r
+    {\r
+      i_str ++;\r
+      if (i_quote && _tcschr(i_quote, *i_str))\r
+       *d++ = *i_str++;\r
+      else\r
+       switch (*i_str)\r
+       {\r
+         case _T('a'): *d++ = _T('\x07'); i_str ++; break;\r
+           //case _T('b'): *d++ = _T('\b'); i_str ++; break;\r
+         case _T('e'): *d++ = _T('\x1b'); i_str ++; break;\r
+         case _T('f'): *d++ = _T('\f'); i_str ++; break;\r
+         case _T('n'): *d++ = _T('\n'); i_str ++; break;\r
+         case _T('r'): *d++ = _T('\r'); i_str ++; break;\r
+         case _T('t'): *d++ = _T('\t'); i_str ++; break;\r
+         case _T('v'): *d++ = _T('\v'); i_str ++; break;\r
+           //case _T('?'): *d++ = _T('\x7f'); i_str ++; break;\r
+           //case _T('_'): *d++ = _T(' '); i_str ++; break;\r
+           //case _T('\\'): *d++ = _T('\\'); i_str ++; break;\r
+         case _T('\''): *d++ = _T('\''); i_str ++; break;\r
+         case _T('"'): *d++ = _T('"'); i_str ++; break;\r
+         case _T('\\'): *d++ = _T('\\'); i_str ++; break;\r
+         case _T('c'): // control code, for example '\c[' is escape: '\x1b'\r
+           i_str ++;\r
+           if (i_str < end && *i_str)\r
+           {\r
+             static const _TCHAR *ctrlchar =\r
+               _T("@ABCDEFGHIJKLMNO")\r
+               _T("PQRSTUVWXYZ[\\]^_")\r
+               _T("@abcdefghijklmno")\r
+               _T("pqrstuvwxyz@@@@?");\r
+             static const _TCHAR *ctrlcode =\r
+               _T("\00\01\02\03\04\05\06\07\10\11\12\13\14\15\16\17")\r
+               _T("\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37")\r
+               _T("\00\01\02\03\04\05\06\07\10\11\12\13\14\15\16\17")\r
+               _T("\20\21\22\23\24\25\26\27\30\31\32\00\00\00\00\177");\r
+             if (const _TCHAR *c = _tcschr(ctrlchar, *i_str))\r
+               *d++ = ctrlcode[c - ctrlchar], i_str ++;\r
+           }\r
+           break;\r
+         case _T('x'): case _T('X'):\r
+         {\r
+           i_str ++;\r
+           static const _TCHAR *hexchar = _T("0123456789ABCDEFabcdef");\r
+           static int hexvalue[] = { 0, 1, 2, 3, 4, 5 ,6, 7, 8, 9,\r
+                                     10, 11, 12, 13, 14, 15,\r
+                                     10, 11, 12, 13, 14, 15, };\r
+           bool brace = false;\r
+           if (i_str < end && *i_str == _T('{'))\r
+           {\r
+             i_str ++;\r
+             brace = true;\r
+           }\r
+           int n = 0;\r
+           for (; i_str < end && *i_str; i_str ++)\r
+             if (const _TCHAR *c = _tcschr(hexchar, *i_str))\r
+               n = n * 16 + hexvalue[c - hexchar];\r
+             else\r
+               break;\r
+           if (i_str < end && *i_str == _T('}') && brace)\r
+             i_str ++;\r
+           if (0 < n)\r
+             *d++ = static_cast<_TCHAR>(n);\r
+           break;\r
+         }\r
+         case _T('1'): case _T('2'): case _T('3'):\r
+         case _T('4'): case _T('5'): case _T('6'): case _T('7'):\r
+           if (i_doesUseRegexpBackReference)\r
+             goto case_default;\r
+           // fall through\r
+         case _T('0'):\r
+         {\r
+           static const _TCHAR *octalchar = _T("01234567");\r
+           static int octalvalue[] = { 0, 1, 2, 3, 4, 5 ,6, 7, };\r
+           int n = 0;\r
+           for (; i_str < end && *i_str; i_str ++)\r
+             if (const _TCHAR *c = _tcschr(octalchar, *i_str))\r
+               n = n * 8 + octalvalue[c - octalchar];\r
+             else\r
+               break;\r
+           if (0 < n)\r
+             *d++ = static_cast<_TCHAR>(n);\r
+           break;\r
+         }\r
+         default:\r
+         case_default:\r
+           *d++ = _T('\\');\r
+           if (_istlead(*i_str) && *(i_str + 1) && i_str + 1 < end)\r
+             *d++ = *i_str++;\r
+           *d++ = *i_str++;\r
+           break;\r
+       }\r
+    }\r
+  }\r
+  *d =_T('\0');\r
+  return result.get();\r
+}\r
+\r
+\r
+// add session id to i_str\r
+tstring addSessionId(const _TCHAR *i_str)\r
+{\r
+    DWORD sessionId;\r
+    tstring s(i_str);\r
+    if (ProcessIdToSessionId(GetCurrentProcessId(), &sessionId)) {\r
+       _TCHAR buf[20];\r
+       _sntprintf(buf, NUMBER_OF(buf), _T("%u"), sessionId);\r
+       s += buf;\r
+    }\r
+    return s;\r
+}\r
+\r
+\r
+#ifdef _MBCS\r
+// escape regexp special characters in MBCS trail bytes\r
+std::string guardRegexpFromMbcs(const char *i_str)\r
+{\r
+  size_t len = strlen(i_str);\r
+  Array<char> buf(len * 2 + 1);\r
+  char *p = buf.get();\r
+  while (*i_str)\r
+  {\r
+    if (_ismbblead(static_cast<u_char>(*i_str)) && i_str[1])\r
+    {\r
+      *p ++ = *i_str ++;\r
+      if (strchr(".*?+(){}[]^$", *i_str))\r
+       *p ++ = '\\';\r
+    }\r
+    *p ++ = *i_str ++;\r
+  }\r
+  return std::string(buf.get(), p);\r
+}\r
+#endif // !_MBCS\r
+\r
+\r
+// converter\r
+std::wstring to_wstring(const std::string &i_str)\r
+{\r
+  size_t size = mbstowcs(NULL, i_str.c_str(), i_str.size() + 1);\r
+  if (size == (size_t)-1)\r
+    return std::wstring();\r
+  Array<wchar_t> result(size + 1);\r
+  mbstowcs(result.get(), i_str.c_str(), i_str.size() + 1);\r
+  return std::wstring(result.get());\r
+}\r
+\r
+\r
+// converter\r
+std::string to_string(const std::wstring &i_str)\r
+{\r
+  size_t size = wcstombs(NULL, i_str.c_str(), i_str.size() + 1);\r
+  if (size == (size_t)-1)\r
+    return std::string();\r
+  Array<char> result(size + 1);\r
+  wcstombs(result.get(), i_str.c_str(), i_str.size() + 1);\r
+  return std::string(result.get());\r
+}\r
+\r
+\r
+/// stream output\r
+tostream &operator<<(tostream &i_ost, const tregex &i_data)\r
+{\r
+  return i_ost << i_data.str();\r
+}\r
+\r
+\r
+/// get lower string\r
+tstring toLower(const tstring &i_str)\r
+{\r
+  tstring str(i_str);\r
+  for (size_t i = 0; i < str.size(); ++ i)\r
+  {\r
+    if (_ismbblead(str[i]))\r
+      ++ i;\r
+    else\r
+      str[i] = tolower(str[i]);\r
+  }\r
+  return str;\r
+}\r
+\r
+\r
+// convert wstring to UTF-8\r
+std::string to_UTF_8(const std::wstring &i_str)\r
+{\r
+  // 0xxxxxxx: 00-7F\r
+  // 110xxxxx 10xxxxxx: 0080-07FF\r
+  // 1110xxxx 10xxxxxx 10xxxxxx: 0800 - FFFF\r
+\r
+  int size = 0;\r
+  \r
+  // count needed buffer size\r
+  for (std::wstring::const_iterator i = i_str.begin(); i != i_str.end(); ++ i)\r
+  {\r
+    if (0x0000 <= *i && *i <= 0x007f)\r
+      size += 1;\r
+    else if (0x0080 <= *i && *i <= 0x07ff)\r
+      size += 2;\r
+    else if (0x0800 <= *i && *i <= 0xffff)\r
+      size += 3;\r
+  }\r
+\r
+  Array<char> result(size);\r
+  int ri = 0;\r
+  \r
+  // make UTF-8\r
+  for (std::wstring::const_iterator i = i_str.begin(); i != i_str.end(); ++ i)\r
+  {\r
+    if (0x0000 <= *i && *i <= 0x007f)\r
+      result[ri ++] = static_cast<char>(*i);\r
+    else if (0x0080 <= *i && *i <= 0x07ff)\r
+    {\r
+      result[ri ++] = static_cast<char>(((*i & 0x0fc0) >>  6) | 0xc0);\r
+      result[ri ++] = static_cast<char>(( *i & 0x003f       ) | 0x80);\r
+    }\r
+    else if (0x0800 <= *i && *i <= 0xffff)\r
+    {\r
+      result[ri ++] = static_cast<char>(((*i & 0xf000) >> 12) | 0xe0);\r
+      result[ri ++] = static_cast<char>(((*i & 0x0fc0) >>  6) | 0x80);\r
+      result[ri ++] = static_cast<char>(( *i & 0x003f       ) | 0x80);\r
+    }\r
+  }\r
+\r
+  return std::string(result.begin(), result.end());\r
+}\r
index 882e23f..5b673c2 100644 (file)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// stringtool.h
-
-
-#ifndef _STRINGTOOL_H
-#  define _STRINGTOOL_H
-
-#  include "misc.h"
-#  include <tchar.h>
-#  include <cctype>
-#  include <string>
-#  include <iosfwd>
-#  include <fstream>
-#  include <locale>
-#  include <boost/regex.hpp>
-#  include <stdio.h>                           // for snprintf
-
-
-/// string for generic international text
-typedef std::basic_string<_TCHAR> tstring;
-/// istream for generic international text
-typedef std::basic_istream<_TCHAR> tistream;
-/// ostream for generic international text
-typedef std::basic_ostream<_TCHAR> tostream;
-/// streambuf for for generic international text
-typedef std::basic_streambuf<_TCHAR> tstreambuf;
-/// stringstream for generic international text
-typedef std::basic_stringstream<_TCHAR> tstringstream;
-/// ifstream for generic international text
-typedef std::basic_ifstream<_TCHAR> tifstream;
-/// ofstream for generic international text
-typedef std::basic_ofstream<_TCHAR> tofstream;
-/// basic_regex for generic international text
-typedef boost::basic_regex<_TCHAR> tregex;
-/// match_results for generic international text
-typedef boost::match_results<tstring::const_iterator> tsmatch;
-
-
-/// string with custom stream output
-class tstringq : public tstring
-{
-public:
-  ///
-  tstringq() { }
-  ///
-  tstringq(const tstringq &i_str) : tstring(i_str) { }
-  ///
-  tstringq(const tstring &i_str) : tstring(i_str) { }
-  ///
-  tstringq(const _TCHAR *i_str) : tstring(i_str) { }
-  ///
-  tstringq(const _TCHAR *i_str, size_t i_n) : tstring(i_str, i_n) { }
-  ///
-  tstringq(const _TCHAR *i_str, size_t i_pos, size_t i_n)
-    : tstring(i_str, i_pos, i_n) { }
-  ///
-  tstringq(size_t i_n, _TCHAR i_c) : tstring(i_n, i_c) { }
-};
-
-
-/// stream output
-extern tostream &operator<<(tostream &i_ost, const tstringq &i_data);
-
-
-/// interpret meta characters such as \n
-tstring interpretMetaCharacters(const _TCHAR *i_str, size_t i_len,
-                               const _TCHAR *i_quote = NULL,
-                               bool i_doesUseRegexpBackReference = false);
-
-/// add session id to i_str
-tstring addSessionId(const _TCHAR *i_str);
-
-/// copy
-size_t strlcpy(char *o_dest, const char *i_src, size_t i_destSize);
-/// copy
-size_t mbslcpy(unsigned char *o_dest, const unsigned char *i_src,
-              size_t i_destSize);
-/// copy
-size_t wcslcpy(wchar_t *o_dest, const wchar_t *i_src, size_t i_destSize);
-/// copy
-inline size_t tcslcpy(char *o_dest, const char *i_src, size_t i_destSize)
-{ return strlcpy(o_dest, i_src, i_destSize); }
-/// copy
-inline size_t tcslcpy(unsigned char *o_dest, const unsigned char *i_src,
-                     size_t i_destSize)
-{ return mbslcpy(o_dest, i_src, i_destSize); }
-/// copy
-inline size_t tcslcpy(wchar_t *o_dest, const wchar_t *i_src, size_t i_destSize)
-{ return wcslcpy(o_dest, i_src, i_destSize); }
-
-// escape regexp special characters in MBCS trail bytes
-std::string guardRegexpFromMbcs(const char *i_str);
-/// converter
-std::wstring to_wstring(const std::string &i_str);
-/// converter
-std::string to_string(const std::wstring &i_str);
-// convert wstring to UTF-8
-std::string to_UTF_8(const std::wstring &i_str);
-
-  
-/// case insensitive string
-class tstringi : public tstring
-{
-public:
-  ///
-  tstringi() { }
-  ///
-  tstringi(const tstringi &i_str) : tstring(i_str) { }
-  ///
-  tstringi(const tstring &i_str) : tstring(i_str) { }
-  ///
-  tstringi(const _TCHAR *i_str) : tstring(i_str) { }
-  ///
-  tstringi(const _TCHAR *i_str, size_t i_n) : tstring(i_str, i_n) { }
-  ///
-  tstringi(const _TCHAR *i_str, size_t i_pos, size_t i_n)
-    : tstring(i_str, i_pos, i_n) { }
-  ///
-  tstringi(size_t i_n, _TCHAR i_c) : tstring(i_n, i_c) { }
-  ///
-  int compare(const tstringi &i_str) const
-  { return compare(i_str.c_str()); }
-  ///
-  int compare(const tstring &i_str) const
-  { return compare(i_str.c_str()); }
-  ///
-  int compare(const _TCHAR *i_str) const
-  { return _tcsicmp(c_str(), i_str); }
-  ///
-  tstring &getString() { return *this; }
-  ///
-  const tstring &getString() const { return *this; }
-};
-
-/// case insensitive string comparison
-inline bool operator<(const tstringi &i_str1, const _TCHAR *i_str2)
-{ return i_str1.compare(i_str2) < 0; }
-/// case insensitive string comparison
-inline bool operator<(const _TCHAR *i_str1, const tstringi &i_str2)
-{ return 0 < i_str2.compare(i_str1); }
-/// case insensitive string comparison
-inline bool operator<(const tstringi &i_str1, const tstring &i_str2)
-{ return i_str1.compare(i_str2) < 0; }
-/// case insensitive string comparison
-inline bool operator<(const tstring &i_str1, const tstringi &i_str2)
-{ return 0 < i_str2.compare(i_str1); }
-/// case insensitive string comparison
-inline bool operator<(const tstringi &i_str1, const tstringi &i_str2)
-{ return i_str1.compare(i_str2) < 0; }
-
-/// case insensitive string comparison
-inline bool operator==(const _TCHAR *i_str1, const tstringi &i_str2)
-{ return i_str2.compare(i_str1) == 0; }
-/// case insensitive string comparison
-inline bool operator==(const tstringi &i_str1, const _TCHAR *i_str2)
-{ return i_str1.compare(i_str2) == 0; }
-/// case insensitive string comparison
-inline bool operator==(const tstring &i_str1, const tstringi &i_str2)
-{ return i_str2.compare(i_str1) == 0; }
-/// case insensitive string comparison
-inline bool operator==(const tstringi &i_str1, const tstring &i_str2)
-{ return i_str1.compare(i_str2) == 0; }
-/// case insensitive string comparison
-inline bool operator==(const tstringi &i_str1, const tstringi &i_str2)
-{ return i_str1.compare(i_str2) == 0; }
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// workarounds for Borland C++
-
-
-/// case insensitive string comparison
-inline bool operator!=(const _TCHAR *i_str1, const tstringi &i_str2)
-{ return i_str2.compare(i_str1) != 0; }
-/// case insensitive string comparison
-inline bool operator!=(const tstringi &i_str1, const _TCHAR *i_str2)
-{ return i_str1.compare(i_str2) != 0; }
-/// case insensitive string comparison
-inline bool operator!=(const tstring &i_str1, const tstringi &i_str2)
-{ return i_str2.compare(i_str1) != 0; }
-/// case insensitive string comparison
-inline bool operator!=(const tstringi &i_str1, const tstring &i_str2)
-{ return i_str1.compare(i_str2) != 0; }
-/// case insensitive string comparison
-inline bool operator!=(const tstringi &i_str1, const tstringi &i_str2)
-{ return i_str1.compare(i_str2) != 0; }
-
-
-/// stream output
-extern tostream &operator<<(tostream &i_ost, const tregex &i_data);
-
-/// get lower string
-extern tstring toLower(const tstring &i_str);
-
-
-#endif // !_STRINGTOOL_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// stringtool.h\r
+\r
+\r
+#ifndef _STRINGTOOL_H\r
+#  define _STRINGTOOL_H\r
+\r
+#  include "misc.h"\r
+#  include <tchar.h>\r
+#  include <cctype>\r
+#  include <string>\r
+#  include <iosfwd>\r
+#  include <fstream>\r
+#  include <locale>\r
+#  include <boost/regex.hpp>\r
+#  include <stdio.h>                           // for snprintf\r
+\r
+\r
+/// string for generic international text\r
+typedef std::basic_string<_TCHAR> tstring;\r
+/// istream for generic international text\r
+typedef std::basic_istream<_TCHAR> tistream;\r
+/// ostream for generic international text\r
+typedef std::basic_ostream<_TCHAR> tostream;\r
+/// streambuf for for generic international text\r
+typedef std::basic_streambuf<_TCHAR> tstreambuf;\r
+/// stringstream for generic international text\r
+typedef std::basic_stringstream<_TCHAR> tstringstream;\r
+/// ifstream for generic international text\r
+typedef std::basic_ifstream<_TCHAR> tifstream;\r
+/// ofstream for generic international text\r
+typedef std::basic_ofstream<_TCHAR> tofstream;\r
+/// basic_regex for generic international text\r
+typedef boost::basic_regex<_TCHAR> tregex;\r
+/// match_results for generic international text\r
+typedef boost::match_results<tstring::const_iterator> tsmatch;\r
+\r
+\r
+/// string with custom stream output\r
+class tstringq : public tstring\r
+{\r
+public:\r
+  ///\r
+  tstringq() { }\r
+  ///\r
+  tstringq(const tstringq &i_str) : tstring(i_str) { }\r
+  ///\r
+  tstringq(const tstring &i_str) : tstring(i_str) { }\r
+  ///\r
+  tstringq(const _TCHAR *i_str) : tstring(i_str) { }\r
+  ///\r
+  tstringq(const _TCHAR *i_str, size_t i_n) : tstring(i_str, i_n) { }\r
+  ///\r
+  tstringq(const _TCHAR *i_str, size_t i_pos, size_t i_n)\r
+    : tstring(i_str, i_pos, i_n) { }\r
+  ///\r
+  tstringq(size_t i_n, _TCHAR i_c) : tstring(i_n, i_c) { }\r
+};\r
+\r
+\r
+/// stream output\r
+extern tostream &operator<<(tostream &i_ost, const tstringq &i_data);\r
+\r
+\r
+/// interpret meta characters such as \n\r
+tstring interpretMetaCharacters(const _TCHAR *i_str, size_t i_len,\r
+                               const _TCHAR *i_quote = NULL,\r
+                               bool i_doesUseRegexpBackReference = false);\r
+\r
+/// add session id to i_str\r
+tstring addSessionId(const _TCHAR *i_str);\r
+\r
+/// copy\r
+size_t strlcpy(char *o_dest, const char *i_src, size_t i_destSize);\r
+/// copy\r
+size_t mbslcpy(unsigned char *o_dest, const unsigned char *i_src,\r
+              size_t i_destSize);\r
+/// copy\r
+size_t wcslcpy(wchar_t *o_dest, const wchar_t *i_src, size_t i_destSize);\r
+/// copy\r
+inline size_t tcslcpy(char *o_dest, const char *i_src, size_t i_destSize)\r
+{ return strlcpy(o_dest, i_src, i_destSize); }\r
+/// copy\r
+inline size_t tcslcpy(unsigned char *o_dest, const unsigned char *i_src,\r
+                     size_t i_destSize)\r
+{ return mbslcpy(o_dest, i_src, i_destSize); }\r
+/// copy\r
+inline size_t tcslcpy(wchar_t *o_dest, const wchar_t *i_src, size_t i_destSize)\r
+{ return wcslcpy(o_dest, i_src, i_destSize); }\r
+\r
+// escape regexp special characters in MBCS trail bytes\r
+std::string guardRegexpFromMbcs(const char *i_str);\r
+/// converter\r
+std::wstring to_wstring(const std::string &i_str);\r
+/// converter\r
+std::string to_string(const std::wstring &i_str);\r
+// convert wstring to UTF-8\r
+std::string to_UTF_8(const std::wstring &i_str);\r
+\r
+  \r
+/// case insensitive string\r
+class tstringi : public tstring\r
+{\r
+public:\r
+  ///\r
+  tstringi() { }\r
+  ///\r
+  tstringi(const tstringi &i_str) : tstring(i_str) { }\r
+  ///\r
+  tstringi(const tstring &i_str) : tstring(i_str) { }\r
+  ///\r
+  tstringi(const _TCHAR *i_str) : tstring(i_str) { }\r
+  ///\r
+  tstringi(const _TCHAR *i_str, size_t i_n) : tstring(i_str, i_n) { }\r
+  ///\r
+  tstringi(const _TCHAR *i_str, size_t i_pos, size_t i_n)\r
+    : tstring(i_str, i_pos, i_n) { }\r
+  ///\r
+  tstringi(size_t i_n, _TCHAR i_c) : tstring(i_n, i_c) { }\r
+  ///\r
+  int compare(const tstringi &i_str) const\r
+  { return compare(i_str.c_str()); }\r
+  ///\r
+  int compare(const tstring &i_str) const\r
+  { return compare(i_str.c_str()); }\r
+  ///\r
+  int compare(const _TCHAR *i_str) const\r
+  { return _tcsicmp(c_str(), i_str); }\r
+  ///\r
+  tstring &getString() { return *this; }\r
+  ///\r
+  const tstring &getString() const { return *this; }\r
+};\r
+\r
+/// case insensitive string comparison\r
+inline bool operator<(const tstringi &i_str1, const _TCHAR *i_str2)\r
+{ return i_str1.compare(i_str2) < 0; }\r
+/// case insensitive string comparison\r
+inline bool operator<(const _TCHAR *i_str1, const tstringi &i_str2)\r
+{ return 0 < i_str2.compare(i_str1); }\r
+/// case insensitive string comparison\r
+inline bool operator<(const tstringi &i_str1, const tstring &i_str2)\r
+{ return i_str1.compare(i_str2) < 0; }\r
+/// case insensitive string comparison\r
+inline bool operator<(const tstring &i_str1, const tstringi &i_str2)\r
+{ return 0 < i_str2.compare(i_str1); }\r
+/// case insensitive string comparison\r
+inline bool operator<(const tstringi &i_str1, const tstringi &i_str2)\r
+{ return i_str1.compare(i_str2) < 0; }\r
+\r
+/// case insensitive string comparison\r
+inline bool operator==(const _TCHAR *i_str1, const tstringi &i_str2)\r
+{ return i_str2.compare(i_str1) == 0; }\r
+/// case insensitive string comparison\r
+inline bool operator==(const tstringi &i_str1, const _TCHAR *i_str2)\r
+{ return i_str1.compare(i_str2) == 0; }\r
+/// case insensitive string comparison\r
+inline bool operator==(const tstring &i_str1, const tstringi &i_str2)\r
+{ return i_str2.compare(i_str1) == 0; }\r
+/// case insensitive string comparison\r
+inline bool operator==(const tstringi &i_str1, const tstring &i_str2)\r
+{ return i_str1.compare(i_str2) == 0; }\r
+/// case insensitive string comparison\r
+inline bool operator==(const tstringi &i_str1, const tstringi &i_str2)\r
+{ return i_str1.compare(i_str2) == 0; }\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// workarounds for Borland C++\r
+\r
+\r
+/// case insensitive string comparison\r
+inline bool operator!=(const _TCHAR *i_str1, const tstringi &i_str2)\r
+{ return i_str2.compare(i_str1) != 0; }\r
+/// case insensitive string comparison\r
+inline bool operator!=(const tstringi &i_str1, const _TCHAR *i_str2)\r
+{ return i_str1.compare(i_str2) != 0; }\r
+/// case insensitive string comparison\r
+inline bool operator!=(const tstring &i_str1, const tstringi &i_str2)\r
+{ return i_str2.compare(i_str1) != 0; }\r
+/// case insensitive string comparison\r
+inline bool operator!=(const tstringi &i_str1, const tstring &i_str2)\r
+{ return i_str1.compare(i_str2) != 0; }\r
+/// case insensitive string comparison\r
+inline bool operator!=(const tstringi &i_str1, const tstringi &i_str2)\r
+{ return i_str1.compare(i_str2) != 0; }\r
+\r
+\r
+/// stream output\r
+extern tostream &operator<<(tostream &i_ost, const tregex &i_data);\r
+\r
+/// get lower string\r
+extern tstring toLower(const tstring &i_str);\r
+\r
+\r
+#endif // !_STRINGTOOL_H\r
index 66f9ae2..7cee3d2 100644 (file)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// target.cpp
-
-
-#include "misc.h"
-
-#include "mayurc.h"
-#include "target.h"
-#include "windowstool.h"
-
-
-///
-class Target
-{
-  HWND m_hwnd;                                 ///
-  HWND m_preHwnd;                              ///
-  HICON m_hCursor;                             ///
-
-  ///
-  static void invertFrame(HWND i_hwnd)
-  {
-    HDC hdc = GetWindowDC(i_hwnd);
-    ASSERT(hdc);
-    int rop2 = SetROP2(hdc, R2_XORPEN);
-    if (rop2)
-    {
-      RECT rc;
-      CHECK_TRUE( GetWindowRect(i_hwnd, &rc) );
-      int width = rcWidth(&rc);
-      int height = rcHeight(&rc);
-    
-      HANDLE hpen = SelectObject(hdc, GetStockObject(WHITE_PEN));
-      HANDLE hbr  = SelectObject(hdc, GetStockObject(NULL_BRUSH));
-      CHECK_TRUE( Rectangle(hdc, 0, 0, width    , height    ) );
-      CHECK_TRUE( Rectangle(hdc, 1, 1, width - 1, height - 1) );
-      CHECK_TRUE( Rectangle(hdc, 2, 2, width - 2, height - 2) );
-      SelectObject(hdc, hpen);
-      SelectObject(hdc, hbr);
-      // no need to DeleteObject StockObject
-      SetROP2(hdc, rop2);
-    }
-    CHECK_TRUE( ReleaseDC(i_hwnd, hdc) );
-  }
-  
-  ///
-  Target(HWND i_hwnd)
-    : m_hwnd(i_hwnd),
-      m_preHwnd(NULL),
-      m_hCursor(NULL)
-  {
-  }
-
-  /// WM_CREATE
-  int wmCreate(CREATESTRUCT * /* i_cs */)
-  {
-    CHECK_TRUE( m_hCursor =
-               LoadCursor(g_hInst, MAKEINTRESOURCE(IDC_CURSOR_target)) );
-    return 0;
-  }
-
-  /// WM_PAINT
-  int wmPaint()
-  {
-    PAINTSTRUCT ps;
-    HDC hdc = BeginPaint(m_hwnd, &ps);
-    ASSERT(hdc);
-
-    if (GetCapture() != m_hwnd)
-    {
-      RECT rc;
-      CHECK_TRUE( GetClientRect(m_hwnd, &rc) );
-      CHECK_TRUE(
-       DrawIcon(hdc, (rcWidth(&rc) - GetSystemMetrics(SM_CXICON)) / 2,
-                (rcHeight(&rc) - GetSystemMetrics(SM_CYICON)) / 2,
-                m_hCursor) );
-    }
-    
-    EndPaint(m_hwnd, &ps);
-    return 0;
-  }
-
-  ///
-  struct PointWindow
-  {
-    POINT m_p;                                 ///
-    HWND m_hwnd;                               ///
-    RECT m_rc;                                 ///
-  };
-  
-  ///
-  static BOOL CALLBACK childWindowFromPoint(HWND i_hwnd, LPARAM i_lParam)
-  {
-    if (IsWindowVisible(i_hwnd))
-    {
-      PointWindow &pw = *(PointWindow *)i_lParam;
-      RECT rc;
-      CHECK_TRUE( GetWindowRect(i_hwnd, &rc) );
-      if (PtInRect(&rc, pw.m_p))
-       if (isRectInRect(&rc, &pw.m_rc))
-       {
-         pw.m_hwnd = i_hwnd;
-         pw.m_rc = rc;
-       }
-    }
-    return TRUE;
-  }
-  
-  ///
-  static BOOL CALLBACK windowFromPoint(HWND i_hwnd, LPARAM i_lParam)
-  {
-    if (IsWindowVisible(i_hwnd))
-    {
-      PointWindow &pw = *(PointWindow *)i_lParam;
-      RECT rc;
-      CHECK_TRUE( GetWindowRect(i_hwnd, &rc) );
-      if (PtInRect(&rc, pw.m_p))
-      {
-       pw.m_hwnd = i_hwnd;
-       pw.m_rc = rc;
-       return FALSE;
-      }
-    }
-    return TRUE;
-  }
-
-  /// WM_MOUSEMOVE
-  int wmMouseMove(WORD /* i_keys */, int /* i_x */, int /* i_y */)
-  {
-    if (GetCapture() == m_hwnd)
-    {
-      PointWindow pw;
-      CHECK_TRUE( GetCursorPos(&pw.m_p) );
-      pw.m_hwnd = 0;
-      CHECK_TRUE( GetWindowRect(GetDesktopWindow(), &pw.m_rc) );
-      EnumWindows(windowFromPoint, (LPARAM)&pw);
-      while (1)
-      {
-       HWND hwndParent = pw.m_hwnd;
-       if (!EnumChildWindows(pw.m_hwnd, childWindowFromPoint, (LPARAM)&pw))
-         break;
-       if (hwndParent == pw.m_hwnd)
-         break;
-      }
-      if (pw.m_hwnd != m_preHwnd)
-      {
-       if (m_preHwnd)
-         invertFrame(m_preHwnd);
-       m_preHwnd = pw.m_hwnd;
-       invertFrame(m_preHwnd);
-       SendMessage(GetParent(m_hwnd), WM_APP_targetNotify, 0,
-                   (LPARAM)m_preHwnd);
-      }
-      SetCursor(m_hCursor);
-    }
-    return 0;
-  }
-
-  /// WM_LBUTTONDOWN
-  int wmLButtonDown(WORD /* i_keys */, int /* i_x */, int /* i_y */)
-  {
-    SetCapture(m_hwnd);
-    SetCursor(m_hCursor);
-    CHECK_TRUE( InvalidateRect(m_hwnd, NULL, TRUE) );
-    CHECK_TRUE( UpdateWindow(m_hwnd) );
-    return 0;
-  }
-
-  /// WM_LBUTTONUP
-  int wmLButtonUp(WORD /* i_keys */, int /* i_x */, int /* i_y */)
-  {
-    if (m_preHwnd)
-      invertFrame(m_preHwnd);
-    m_preHwnd = NULL;
-    ReleaseCapture();
-    CHECK_TRUE( InvalidateRect(m_hwnd, NULL, TRUE) );
-    CHECK_TRUE( UpdateWindow(m_hwnd) );
-    return 0;
-  }
-
-public:
-  ///
-  static LRESULT CALLBACK WndProc(HWND i_hwnd, UINT i_message,
-                                 WPARAM i_wParam, LPARAM i_lParam)
-  {
-    Target *wc;
-    getUserData(i_hwnd, &wc);
-    if (!wc)
-      switch (i_message)
-      {
-       case WM_CREATE:
-         wc = setUserData(i_hwnd, new Target(i_hwnd));
-         return wc->wmCreate((CREATESTRUCT *)i_lParam);
-      }
-    else 
-      switch (i_message)
-      {
-       case WM_PAINT:
-         return wc->wmPaint();
-       case WM_LBUTTONDOWN:
-         return wc->wmLButtonDown((WORD)i_wParam, (short)LOWORD(i_lParam),
-                                  (short)HIWORD(i_lParam));
-       case WM_LBUTTONUP:
-         return wc->wmLButtonUp((WORD)i_wParam, (short)LOWORD(i_lParam),
-                                (short)HIWORD(i_lParam));
-       case WM_MOUSEMOVE:
-         return wc->wmMouseMove((WORD)i_wParam, (short)LOWORD(i_lParam),
-                                (short)HIWORD(i_lParam));
-       case WM_NCDESTROY:
-         delete wc;
-         return 0;
-      }
-    return DefWindowProc(i_hwnd, i_message, i_wParam, i_lParam);
-  }
-};
-  
-
-//
-ATOM Register_target()
-{
-  WNDCLASS wc;
-  wc.style         = CS_HREDRAW | CS_VREDRAW;
-  wc.lpfnWndProc   = Target::WndProc;
-  wc.cbClsExtra    = 0;
-  wc.cbWndExtra    = 0;
-  wc.hInstance     = g_hInst;
-  wc.hIcon         = NULL;
-  wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
-  wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
-  wc.lpszMenuName  = NULL;
-  wc.lpszClassName = _T("mayuTarget");
-  return RegisterClass(&wc);
-}
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// target.cpp\r
+\r
+\r
+#include "misc.h"\r
+\r
+#include "mayurc.h"\r
+#include "target.h"\r
+#include "windowstool.h"\r
+\r
+\r
+///\r
+class Target\r
+{\r
+  HWND m_hwnd;                                 ///\r
+  HWND m_preHwnd;                              ///\r
+  HICON m_hCursor;                             ///\r
+\r
+  ///\r
+  static void invertFrame(HWND i_hwnd)\r
+  {\r
+    HDC hdc = GetWindowDC(i_hwnd);\r
+    ASSERT(hdc);\r
+    int rop2 = SetROP2(hdc, R2_XORPEN);\r
+    if (rop2)\r
+    {\r
+      RECT rc;\r
+      CHECK_TRUE( GetWindowRect(i_hwnd, &rc) );\r
+      int width = rcWidth(&rc);\r
+      int height = rcHeight(&rc);\r
+    \r
+      HANDLE hpen = SelectObject(hdc, GetStockObject(WHITE_PEN));\r
+      HANDLE hbr  = SelectObject(hdc, GetStockObject(NULL_BRUSH));\r
+      CHECK_TRUE( Rectangle(hdc, 0, 0, width    , height    ) );\r
+      CHECK_TRUE( Rectangle(hdc, 1, 1, width - 1, height - 1) );\r
+      CHECK_TRUE( Rectangle(hdc, 2, 2, width - 2, height - 2) );\r
+      SelectObject(hdc, hpen);\r
+      SelectObject(hdc, hbr);\r
+      // no need to DeleteObject StockObject\r
+      SetROP2(hdc, rop2);\r
+    }\r
+    CHECK_TRUE( ReleaseDC(i_hwnd, hdc) );\r
+  }\r
+  \r
+  ///\r
+  Target(HWND i_hwnd)\r
+    : m_hwnd(i_hwnd),\r
+      m_preHwnd(NULL),\r
+      m_hCursor(NULL)\r
+  {\r
+  }\r
+\r
+  /// WM_CREATE\r
+  int wmCreate(CREATESTRUCT * /* i_cs */)\r
+  {\r
+    CHECK_TRUE( m_hCursor =\r
+               LoadCursor(g_hInst, MAKEINTRESOURCE(IDC_CURSOR_target)) );\r
+    return 0;\r
+  }\r
+\r
+  /// WM_PAINT\r
+  int wmPaint()\r
+  {\r
+    PAINTSTRUCT ps;\r
+    HDC hdc = BeginPaint(m_hwnd, &ps);\r
+    ASSERT(hdc);\r
+\r
+    if (GetCapture() != m_hwnd)\r
+    {\r
+      RECT rc;\r
+      CHECK_TRUE( GetClientRect(m_hwnd, &rc) );\r
+      CHECK_TRUE(\r
+       DrawIcon(hdc, (rcWidth(&rc) - GetSystemMetrics(SM_CXICON)) / 2,\r
+                (rcHeight(&rc) - GetSystemMetrics(SM_CYICON)) / 2,\r
+                m_hCursor) );\r
+    }\r
+    \r
+    EndPaint(m_hwnd, &ps);\r
+    return 0;\r
+  }\r
+\r
+  ///\r
+  struct PointWindow\r
+  {\r
+    POINT m_p;                                 ///\r
+    HWND m_hwnd;                               ///\r
+    RECT m_rc;                                 ///\r
+  };\r
+  \r
+  ///\r
+  static BOOL CALLBACK childWindowFromPoint(HWND i_hwnd, LPARAM i_lParam)\r
+  {\r
+    if (IsWindowVisible(i_hwnd))\r
+    {\r
+      PointWindow &pw = *(PointWindow *)i_lParam;\r
+      RECT rc;\r
+      CHECK_TRUE( GetWindowRect(i_hwnd, &rc) );\r
+      if (PtInRect(&rc, pw.m_p))\r
+       if (isRectInRect(&rc, &pw.m_rc))\r
+       {\r
+         pw.m_hwnd = i_hwnd;\r
+         pw.m_rc = rc;\r
+       }\r
+    }\r
+    return TRUE;\r
+  }\r
+  \r
+  ///\r
+  static BOOL CALLBACK windowFromPoint(HWND i_hwnd, LPARAM i_lParam)\r
+  {\r
+    if (IsWindowVisible(i_hwnd))\r
+    {\r
+      PointWindow &pw = *(PointWindow *)i_lParam;\r
+      RECT rc;\r
+      CHECK_TRUE( GetWindowRect(i_hwnd, &rc) );\r
+      if (PtInRect(&rc, pw.m_p))\r
+      {\r
+       pw.m_hwnd = i_hwnd;\r
+       pw.m_rc = rc;\r
+       return FALSE;\r
+      }\r
+    }\r
+    return TRUE;\r
+  }\r
+\r
+  /// WM_MOUSEMOVE\r
+  int wmMouseMove(WORD /* i_keys */, int /* i_x */, int /* i_y */)\r
+  {\r
+    if (GetCapture() == m_hwnd)\r
+    {\r
+      PointWindow pw;\r
+      CHECK_TRUE( GetCursorPos(&pw.m_p) );\r
+      pw.m_hwnd = 0;\r
+      CHECK_TRUE( GetWindowRect(GetDesktopWindow(), &pw.m_rc) );\r
+      EnumWindows(windowFromPoint, (LPARAM)&pw);\r
+      while (1)\r
+      {\r
+       HWND hwndParent = pw.m_hwnd;\r
+       if (!EnumChildWindows(pw.m_hwnd, childWindowFromPoint, (LPARAM)&pw))\r
+         break;\r
+       if (hwndParent == pw.m_hwnd)\r
+         break;\r
+      }\r
+      if (pw.m_hwnd != m_preHwnd)\r
+      {\r
+       if (m_preHwnd)\r
+         invertFrame(m_preHwnd);\r
+       m_preHwnd = pw.m_hwnd;\r
+       invertFrame(m_preHwnd);\r
+       SendMessage(GetParent(m_hwnd), WM_APP_targetNotify, 0,\r
+                   (LPARAM)m_preHwnd);\r
+      }\r
+      SetCursor(m_hCursor);\r
+    }\r
+    return 0;\r
+  }\r
+\r
+  /// WM_LBUTTONDOWN\r
+  int wmLButtonDown(WORD /* i_keys */, int /* i_x */, int /* i_y */)\r
+  {\r
+    SetCapture(m_hwnd);\r
+    SetCursor(m_hCursor);\r
+    CHECK_TRUE( InvalidateRect(m_hwnd, NULL, TRUE) );\r
+    CHECK_TRUE( UpdateWindow(m_hwnd) );\r
+    return 0;\r
+  }\r
+\r
+  /// WM_LBUTTONUP\r
+  int wmLButtonUp(WORD /* i_keys */, int /* i_x */, int /* i_y */)\r
+  {\r
+    if (m_preHwnd)\r
+      invertFrame(m_preHwnd);\r
+    m_preHwnd = NULL;\r
+    ReleaseCapture();\r
+    CHECK_TRUE( InvalidateRect(m_hwnd, NULL, TRUE) );\r
+    CHECK_TRUE( UpdateWindow(m_hwnd) );\r
+    return 0;\r
+  }\r
+\r
+public:\r
+  ///\r
+  static LRESULT CALLBACK WndProc(HWND i_hwnd, UINT i_message,\r
+                                 WPARAM i_wParam, LPARAM i_lParam)\r
+  {\r
+    Target *wc;\r
+    getUserData(i_hwnd, &wc);\r
+    if (!wc)\r
+      switch (i_message)\r
+      {\r
+       case WM_CREATE:\r
+         wc = setUserData(i_hwnd, new Target(i_hwnd));\r
+         return wc->wmCreate((CREATESTRUCT *)i_lParam);\r
+      }\r
+    else \r
+      switch (i_message)\r
+      {\r
+       case WM_PAINT:\r
+         return wc->wmPaint();\r
+       case WM_LBUTTONDOWN:\r
+         return wc->wmLButtonDown((WORD)i_wParam, (short)LOWORD(i_lParam),\r
+                                  (short)HIWORD(i_lParam));\r
+       case WM_LBUTTONUP:\r
+         return wc->wmLButtonUp((WORD)i_wParam, (short)LOWORD(i_lParam),\r
+                                (short)HIWORD(i_lParam));\r
+       case WM_MOUSEMOVE:\r
+         return wc->wmMouseMove((WORD)i_wParam, (short)LOWORD(i_lParam),\r
+                                (short)HIWORD(i_lParam));\r
+       case WM_NCDESTROY:\r
+         delete wc;\r
+         return 0;\r
+      }\r
+    return DefWindowProc(i_hwnd, i_message, i_wParam, i_lParam);\r
+  }\r
+};\r
+  \r
+\r
+//\r
+ATOM Register_target()\r
+{\r
+  WNDCLASS wc;\r
+  wc.style         = CS_HREDRAW | CS_VREDRAW;\r
+  wc.lpfnWndProc   = Target::WndProc;\r
+  wc.cbClsExtra    = 0;\r
+  wc.cbWndExtra    = 0;\r
+  wc.hInstance     = g_hInst;\r
+  wc.hIcon         = NULL;\r
+  wc.hCursor       = LoadCursor(NULL, IDC_ARROW);\r
+  wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);\r
+  wc.lpszMenuName  = NULL;\r
+  wc.lpszClassName = _T("mayuTarget");\r
+  return RegisterClass(&wc);\r
+}\r
index e270b9a..a4f5fb0 100644 (file)
--- a/target.h
+++ b/target.h
@@ -1,22 +1,22 @@
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// target.h
-
-
-#ifndef _TARGET_H
-#  define _TARGET_H
-
-#  include <windows.h>
-
-
-///
-extern ATOM Register_target();
-
-///
-enum
-{
-  ///
-  WM_APP_targetNotify = WM_APP + 102,
-};
-
-
-#endif // !_TARGET_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// target.h\r
+\r
+\r
+#ifndef _TARGET_H\r
+#  define _TARGET_H\r
+\r
+#  include <windows.h>\r
+\r
+\r
+///\r
+extern ATOM Register_target();\r
+\r
+///\r
+enum\r
+{\r
+  ///\r
+  WM_APP_targetNotify = WM_APP + 102,\r
+};\r
+\r
+\r
+#endif // !_TARGET_H\r
index 4b7540e..6cf6b4c 100755 (executable)
@@ -1,76 +1,76 @@
-# ts4mayu.dll \82ð\8eg\82Á\82Ä ThumbSense \82ð\8eÀ\8c»\82·\82é\82½\82ß\82Ì\83T\83\93\83v\83\8b
-# \83I\83\8a\83W\83i\83\8b\82Ì ThumbSense \82Ì\83L\81[\8a\84\82è\93\96\82Ä\91S\82Ä\82ð\8eÀ\8c»\82µ\82Ä\82¢\82é\82í\82¯\82Å\82Í\82È\82¢\81B
-
-# F,J,Space \82ð\8d\83{\83^\83\93\82Ì\83N\83\8a\83b\83N\82É\8a\84\82è\93\96\82Ä\82é\81B
-  key TS-*F TS-*J TS-*Space = &VK(LButton)
-# \83N\83\8a\83b\83N\82ª\83\8a\83s\81[\83g\82³\82ê\82é\82Ì\82ð\96h\82®
-  key D-R-TS-*F D-R-TS-*J D-R-TS-*Space = &Ignore
-
-# D,K \82ð\89E\83{\83^\83\93\82Ì\83N\83\8a\83b\83N\82É\8a\84\82è\93\96\82Ä\82é\81B
-  key TS-*D TS-*K = &VK(RButton)
-# \83N\83\8a\83b\83N\82ª\83\8a\83s\81[\83g\82³\82ê\82é\82Ì\82ð\96h\82®
-  key D-R-TS-*D D-R-TS-*K = &Ignore
-
-# V \82ð\8d\83{\83^\83\93\82Ì\83_\83u\83\8b\83N\83\8a\83b\83N\82É\8a\84\82è\93\96\82Ä\82é\81B
-  key D-T-*V = &VK(LButton) &Wait(10) &VK(LButton)
-# \83N\83\8a\83b\83N\82ª\83\8a\83s\81[\83g\82³\82ê\82é\82Ì\82ð\96h\82¬\81A\83L\81[\97£\82µ\82½\82Æ\82«\82Í\96³\8e\8b\82·\82é\81B
-  key D-R-T-*V U-T-*V = &Ignore
-
-# G \82ð\91æ4\83{\83^\83\93\82Ì\83N\83\8a\83b\83N\82É\8a\84\82è\93\96\82Ä\82é\81B
-  key TS-*G = &VK(XButton1)
-# \83N\83\8a\83b\83N\82ª\83\8a\83s\81[\83g\82³\82ê\82é\82Ì\82ð\96h\82®
-  key D-R-TS-*G = &Ignore
-
-# H \82ð\91æ5\83{\83^\83\93\82Ì\83N\83\8a\83b\83N\82É\8a\84\82è\93\96\82Ä\82é\81B
-  key TS-*H = &VK(XButton2)
-# \83N\83\8a\83b\83N\82ª\83\8a\83s\81[\83g\82³\82ê\82é\82Ì\82ð\96h\82®
-  key D-R-TS-*H = &Ignore
-
-# S,L \82ð\89\9f\82µ\82È\82ª\82ç\82Ì\8fã\89º\95û\8cü\83h\83\89\83b\83O\82ð\83z\83C\81[\83\8b\89ñ\93]\82É\82·\82é\81B
-  key D-TS-*S D-TS-*L = &MouseHook(Wheel, -5)
-# \83\8a\83s\81[\83g\82Í\96³\8e\8b\81B
-  key D-R-TS-*S D-R-TS-*L = &Ignore
-# \83L\81[\82ð\97£\82µ\82½\82ç\89ð\8f\9c\82·\82é\81B
-  key U-TS-*S U-TS-*L = &MouseHook(None, 0)
-
-# A \82ð\89\9f\82µ\82È\82ª\82ç\83h\83\89\83b\83O\82·\82é\82Æ\83A\83N\83e\83B\83u\83E\83B\83\93\83h\83E\82ª\88Ú\93®\82·\82é\81B
-  key D-TS-*A = &MouseHook(WindowMove, 1)
-# \83\8a\83s\81[\83g\82Í\96³\8e\8b\81B
-  key D-R-TS-*A = &Ignore
-# \83L\81[\82ð\97£\82µ\82½\82ç\89ð\8f\9c\82·\82é\81B
-  key U-TS-*A = &MouseHook(None, 0)
-
-# R \82Å\83E\83B\83\93\83h\83E\82Ì\8dÅ\91å\89»/\89ð\8f\9c\82ð\83g\83O\83\8b\82·\82é\81B
-  key T-R = &WindowMaximize
-
-# W,B \82Å\83E\83B\83\93\83h\83E\82ð\95Â\82\82é\81B
-  key T-W T-B = &WindowClose
-
-# M \82Å My Document \82ð\8aJ\82­\81B
-  key T-M = &ShellExecute("open", "C:\\WINDOWS\\explorer.exe", "::{450D8FBA-AD25-11D0-98A8-0800361B1103}",, ShowNormal)
-
-# O \82Å Outlook Express \82ð\8bN\93®\82·\82é\81B
-  key T-O = &ShellExecute("open", "C:\\Program Files\\Outlook Express\\msimn.exe",,, ShowNormal)
-
-# I \82Å Internet Explorer \82ð\8bN\93®\82·\82é\81B
-  key T-I = &ShellExecute("open", "C:\\Program Files\\Internet Explorer\\iexplore.exe",,, ShowNormal)
-
-# P \82Å\83R\83}\83\93\83h\83v\83\8d\83\93\83v\83g\82ð\8bN\93®\82·\82é\81B
-  key T-P = &ShellExecute("open", "C:\\WINDOWS\\system32\\cmd.exe",,, ShowNormal)
-
-# \88È\89º\82Í\83I\83\8a\83W\83i\83\8b\82Ì ThumbSense \82É\82Í\82È\82¢\8a\84\82è\93\96\82Ä\82ð\8eÀ\8c»\82·\82é\81B
-
-# C \82ð\92\86\83{\83^\83\93\82Ì\83N\83\8a\83b\83N\82É\8a\84\82è\93\96\82Ä\82é\81B
-#  key TS-*C = &VK(MButton)
-#  key D-R-TS-*C = &Ignore
-
-# \83E\83C\83\93\83h\83E\82ª\8dÅ\91å\89»\82³\82ê\82Ä\82¢\82é\8e\9e\82É A \82ð\89\9f\82µ\82È\82ª\82ç\83h\83\89\83b\83O\82·\82é\82Æ
-# \83A\83N\83e\83B\83u MDI \8eq\83A\83N\83e\83B\83u\83E\83B\83\93\83h\83E\82ª\88Ú\93®\82·\82é\81B
-#  key D-TS-MAX-*A = &MouseHook(WindowMove, -1)
-
-# Control+A \82ð\89\9f\82µ\82È\82ª\82ç\83h\83\89\83b\83O\82·\82é\82Æ\83}\83E\83X\83J\81[\83\\83\8b\92¼\89º\82Ì\83E\83B\83\93\83h\83E\82ª\88Ú\93®\82·\82é\81B
-#  key D-TS-C-*A = &MouseHook(WindowMove, 2)
-
-# \83E\83C\83\93\83h\83E\82ª\8dÅ\91å\89»\82³\82ê\82Ä\82¢\82é\8e\9e\82É Control+A \82ð\89\9f\82µ\82È\82ª\82ç\83h\83\89\83b\83O\82·\82é\82Æ
-# \83}\83E\83X\83J\81[\83\\83\8b\92¼\89º\82Ì MDI \8eq\83A\83N\83e\83B\83u\83E\83B\83\93\83h\83E\82ª\88Ú\93®\82·\82é\81B
-#  key D-TS-MAX-C-*A = &MouseHook(WindowMove, -2)
+# ts4mayu.dll \82ð\8eg\82Á\82Ä ThumbSense \82ð\8eÀ\8c»\82·\82é\82½\82ß\82Ì\83T\83\93\83v\83\8b\r
+# \83I\83\8a\83W\83i\83\8b\82Ì ThumbSense \82Ì\83L\81[\8a\84\82è\93\96\82Ä\91S\82Ä\82ð\8eÀ\8c»\82µ\82Ä\82¢\82é\82í\82¯\82Å\82Í\82È\82¢\81B\r
+\r
+# F,J,Space \82ð\8d\83{\83^\83\93\82Ì\83N\83\8a\83b\83N\82É\8a\84\82è\93\96\82Ä\82é\81B\r
+  key TS-*F TS-*J TS-*Space = &VK(LButton)\r
+# \83N\83\8a\83b\83N\82ª\83\8a\83s\81[\83g\82³\82ê\82é\82Ì\82ð\96h\82®\r
+  key D-R-TS-*F D-R-TS-*J D-R-TS-*Space = &Ignore\r
+\r
+# D,K \82ð\89E\83{\83^\83\93\82Ì\83N\83\8a\83b\83N\82É\8a\84\82è\93\96\82Ä\82é\81B\r
+  key TS-*D TS-*K = &VK(RButton)\r
+# \83N\83\8a\83b\83N\82ª\83\8a\83s\81[\83g\82³\82ê\82é\82Ì\82ð\96h\82®\r
+  key D-R-TS-*D D-R-TS-*K = &Ignore\r
+\r
+# V \82ð\8d\83{\83^\83\93\82Ì\83_\83u\83\8b\83N\83\8a\83b\83N\82É\8a\84\82è\93\96\82Ä\82é\81B\r
+  key D-T-*V = &VK(LButton) &Wait(10) &VK(LButton)\r
+# \83N\83\8a\83b\83N\82ª\83\8a\83s\81[\83g\82³\82ê\82é\82Ì\82ð\96h\82¬\81A\83L\81[\97£\82µ\82½\82Æ\82«\82Í\96³\8e\8b\82·\82é\81B\r
+  key D-R-T-*V U-T-*V = &Ignore\r
+\r
+# G \82ð\91æ4\83{\83^\83\93\82Ì\83N\83\8a\83b\83N\82É\8a\84\82è\93\96\82Ä\82é\81B\r
+  key TS-*G = &VK(XButton1)\r
+# \83N\83\8a\83b\83N\82ª\83\8a\83s\81[\83g\82³\82ê\82é\82Ì\82ð\96h\82®\r
+  key D-R-TS-*G = &Ignore\r
+\r
+# H \82ð\91æ5\83{\83^\83\93\82Ì\83N\83\8a\83b\83N\82É\8a\84\82è\93\96\82Ä\82é\81B\r
+  key TS-*H = &VK(XButton2)\r
+# \83N\83\8a\83b\83N\82ª\83\8a\83s\81[\83g\82³\82ê\82é\82Ì\82ð\96h\82®\r
+  key D-R-TS-*H = &Ignore\r
+\r
+# S,L \82ð\89\9f\82µ\82È\82ª\82ç\82Ì\8fã\89º\95û\8cü\83h\83\89\83b\83O\82ð\83z\83C\81[\83\8b\89ñ\93]\82É\82·\82é\81B\r
+  key D-TS-*S D-TS-*L = &MouseHook(Wheel, -5)\r
+# \83\8a\83s\81[\83g\82Í\96³\8e\8b\81B\r
+  key D-R-TS-*S D-R-TS-*L = &Ignore\r
+# \83L\81[\82ð\97£\82µ\82½\82ç\89ð\8f\9c\82·\82é\81B\r
+  key U-TS-*S U-TS-*L = &MouseHook(None, 0)\r
+\r
+# A \82ð\89\9f\82µ\82È\82ª\82ç\83h\83\89\83b\83O\82·\82é\82Æ\83A\83N\83e\83B\83u\83E\83B\83\93\83h\83E\82ª\88Ú\93®\82·\82é\81B\r
+  key D-TS-*A = &MouseHook(WindowMove, 1)\r
+# \83\8a\83s\81[\83g\82Í\96³\8e\8b\81B\r
+  key D-R-TS-*A = &Ignore\r
+# \83L\81[\82ð\97£\82µ\82½\82ç\89ð\8f\9c\82·\82é\81B\r
+  key U-TS-*A = &MouseHook(None, 0)\r
+\r
+# R \82Å\83E\83B\83\93\83h\83E\82Ì\8dÅ\91å\89»/\89ð\8f\9c\82ð\83g\83O\83\8b\82·\82é\81B\r
+  key T-R = &WindowMaximize\r
+\r
+# W,B \82Å\83E\83B\83\93\83h\83E\82ð\95Â\82\82é\81B\r
+  key T-W T-B = &WindowClose\r
+\r
+# M \82Å My Document \82ð\8aJ\82­\81B\r
+  key T-M = &ShellExecute("open", "C:\\WINDOWS\\explorer.exe", "::{450D8FBA-AD25-11D0-98A8-0800361B1103}",, ShowNormal)\r
+\r
+# O \82Å Outlook Express \82ð\8bN\93®\82·\82é\81B\r
+  key T-O = &ShellExecute("open", "C:\\Program Files\\Outlook Express\\msimn.exe",,, ShowNormal)\r
+\r
+# I \82Å Internet Explorer \82ð\8bN\93®\82·\82é\81B\r
+  key T-I = &ShellExecute("open", "C:\\Program Files\\Internet Explorer\\iexplore.exe",,, ShowNormal)\r
+\r
+# P \82Å\83R\83}\83\93\83h\83v\83\8d\83\93\83v\83g\82ð\8bN\93®\82·\82é\81B\r
+  key T-P = &ShellExecute("open", "C:\\WINDOWS\\system32\\cmd.exe",,, ShowNormal)\r
+\r
+# \88È\89º\82Í\83I\83\8a\83W\83i\83\8b\82Ì ThumbSense \82É\82Í\82È\82¢\8a\84\82è\93\96\82Ä\82ð\8eÀ\8c»\82·\82é\81B\r
+\r
+# C \82ð\92\86\83{\83^\83\93\82Ì\83N\83\8a\83b\83N\82É\8a\84\82è\93\96\82Ä\82é\81B\r
+#  key TS-*C = &VK(MButton)\r
+#  key D-R-TS-*C = &Ignore\r
+\r
+# \83E\83C\83\93\83h\83E\82ª\8dÅ\91å\89»\82³\82ê\82Ä\82¢\82é\8e\9e\82É A \82ð\89\9f\82µ\82È\82ª\82ç\83h\83\89\83b\83O\82·\82é\82Æ\r
+# \83A\83N\83e\83B\83u MDI \8eq\83A\83N\83e\83B\83u\83E\83B\83\93\83h\83E\82ª\88Ú\93®\82·\82é\81B\r
+#  key D-TS-MAX-*A = &MouseHook(WindowMove, -1)\r
+\r
+# Control+A \82ð\89\9f\82µ\82È\82ª\82ç\83h\83\89\83b\83O\82·\82é\82Æ\83}\83E\83X\83J\81[\83\\83\8b\92¼\89º\82Ì\83E\83B\83\93\83h\83E\82ª\88Ú\93®\82·\82é\81B\r
+#  key D-TS-C-*A = &MouseHook(WindowMove, 2)\r
+\r
+# \83E\83C\83\93\83h\83E\82ª\8dÅ\91å\89»\82³\82ê\82Ä\82¢\82é\8e\9e\82É Control+A \82ð\89\9f\82µ\82È\82ª\82ç\83h\83\89\83b\83O\82·\82é\82Æ\r
+# \83}\83E\83X\83J\81[\83\\83\8b\92¼\89º\82Ì MDI \8eq\83A\83N\83e\83B\83u\83E\83B\83\93\83h\83E\82ª\88Ú\93®\82·\82é\81B\r
+#  key D-TS-MAX-C-*A = &MouseHook(WindowMove, -2)\r
index 6837816..96496f5 100755 (executable)
-#include <windows.h>
-#include <process.h>
-#include <tchar.h>
-#include "../driver.h"
-#ifdef STS4MAYU
-#include "SynKit.h"
-#pragma comment(lib, "SynCom.lib")
-#endif /* STS4MAYU */
-#ifdef CTS4MAYU
-#include "Touchpad.h"
-#pragma comment(lib, "TouchPad.lib")
-#endif /* CTS4MAYU */
-
-static HANDLE s_instance;
-static UINT s_engineThreadId;
-
-#ifdef STS4MAYU
-static ISynAPI *s_synAPI;
-static ISynDevice *s_synDevice;
-static HANDLE s_notifyEvent;
-
-static int s_terminated;
-static HANDLE s_loopThread;
-static unsigned int s_loopThreadId;
-#endif /* STS4MAYU */
-#ifdef CTS4MAYU
-static HTOUCHPAD s_hTP[16];
-static int s_devNum;
-#endif /* CTS4MAYU */
-
-static void changeTouch(int i_isBreak)
-{
-  PostThreadMessage(s_engineThreadId, WM_APP + 201, i_isBreak ? 0 : 1, 0);
-}
-
-static void postEvent(WPARAM wParam, LPARAM lParam)
-{
-  PostThreadMessage(s_engineThreadId, WM_APP + 201, wParam, lParam);
-}
-
-#ifdef STS4MAYU
-static unsigned int WINAPI loop(void *dummy)
-{
-  HRESULT result;
-  SynPacket packet;
-  int isTouched = 0;
-
-  while (s_terminated == 0) {
-    WaitForSingleObject(s_notifyEvent, INFINITE);
-    if (s_terminated) {
-      break;
-    }
-
-    for (;;) {
-      long value;
-
-      result = s_synAPI->GetEventParameter(&value);
-      if (result != SYN_OK) {
-       break;
-      }
-      if (value == SE_Configuration_Changed) {
-       s_synDevice->SetEventNotification(s_notifyEvent);
-      }
-    }
-
-    for (;;) {
-      result = s_synDevice->LoadPacket(packet);
-      if (result == SYNE_FAIL) {
-       break;
-      }
-
-      if (isTouched) {
-       if (!(packet.FingerState() & SF_FingerTouch)) {
-         changeTouch(1);
-         isTouched = 0;
-       }
-      } else {
-       if (packet.FingerState() & SF_FingerTouch) {
-         changeTouch(0);
-         isTouched = 1;
-       }
-      }
-    }
-  }
-  _endthreadex(0);
-  return 0;
-}
-#endif /* STS4MAYU */
-#ifdef CTS4MAYU
-static void CALLBACK TouchpadFunc(HTOUCHPAD hTP, LPFEEDHDR lpFeedHdr, LPARAM i_lParam)
-{
-       LPRAWFEED lpRawFeed;
-       static int isTouched = 0;
-       static WPARAM s_wParam;
-       static LPARAM s_lParam;
-       WPARAM wParam;
-       LPARAM lParam;
-
-       lpRawFeed = (LPRAWFEED)(lpFeedHdr + 1);
-#if 1
-       wParam = lpRawFeed->wPressure;
-       lParam = lpRawFeed->y << 16 | lpRawFeed->x;
-       if (wParam != s_wParam || lParam != s_lParam) {
-         postEvent(wParam, lParam);
-         s_wParam = wParam;
-         s_lParam = lParam;
-       }
-#else
-       if (isTouched) {
-         if (!lpRawFeed->wPressure) {
-           changeTouch(1);
-           isTouched = 0;
-         }
-       } else {
-         if (lpRawFeed->wPressure) {
-           changeTouch(0);
-           isTouched = 1;
-         }
-       }
-#endif
-       EnableWindowsCursor(hTP, TRUE);
-}
-
-static BOOL CALLBACK DevicesFunc(LPGENERICDEVICE device, LPARAM lParam)
-{
-       HTOUCHPAD hTP = NULL;
-       BOOL ret = FALSE;
-
-       s_hTP[s_devNum] = GetPad(device->devicePort);
-       CreateCallback(s_hTP[s_devNum], TouchpadFunc,
-                      TPF_RAW | TPF_POSTMESSAGE, NULL);
-       StartFeed(s_hTP[s_devNum]);
-       ++s_devNum;
-       return TRUE;
-}
-#endif /* CTS4MAYU */
-
-bool WINAPI ts4mayuInit(UINT i_engineThreadId)
-{
-  s_engineThreadId = i_engineThreadId;
-
-#ifdef STS4MAYU
-  HRESULT result;
-  long hdl;
-
-  s_synAPI = NULL;
-  s_synDevice = NULL;
-  s_notifyEvent = NULL;
-
-  s_terminated = 0;
-
-  result = SynCreateAPI(&s_synAPI);
-  if (result != SYN_OK) {
-    goto error_on_init;
-  }
-
-  hdl = -1;
-  result = s_synAPI->FindDevice(SE_ConnectionAny, SE_DeviceTouchPad, &hdl);
-  if (result != SYN_OK) {
-    goto error_on_init;
-  }
-
-  result = s_synAPI->CreateDevice(hdl, &s_synDevice);
-  if (result != SYN_OK) {
-    goto error_on_init;
-  }
-
-  s_notifyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
-  if (s_notifyEvent == NULL) {
-    goto error_on_init;
-  }
-
-  s_synAPI->SetEventNotification(s_notifyEvent);
-  s_synDevice->SetEventNotification(s_notifyEvent);
-
-  s_loopThread =
-    (HANDLE)_beginthreadex(NULL, 0, loop, NULL, 0, &s_loopThreadId);
-  if (s_loopThread == 0) {
-    goto error_on_init;
-  }
-
-  return true;
-
-error_on_init:
-  if (s_notifyEvent) {
-    CloseHandle(s_notifyEvent);
-  }
-
-  if (s_synDevice) {
-    s_synDevice->Release();
-  }
-
-  if (s_synAPI) {
-    s_synAPI->Release();
-  }
-
-  return false;
-#endif /* STS4MAYU */
-#ifdef CTS4MAYU
-  // enumerate devices
-  EnumDevices(DevicesFunc, NULL);
-  return true;
-#endif /* CTS4MAYU */
-}
-
-
-bool WINAPI ts4mayuTerm()
-{
-#ifdef STS4MAYU
-  s_terminated = 1;
-
-  if (s_loopThread) {
-    SetEvent(s_notifyEvent);
-    WaitForSingleObject(s_loopThread, INFINITE);
-    CloseHandle(s_loopThread);
-  }
-
-  if (s_notifyEvent) {
-    CloseHandle(s_notifyEvent);
-  }
-
-  if (s_synDevice) {
-    s_synDevice->Release();
-  }
-
-  if (s_synAPI) {
-    s_synAPI->Release();
-  }
-
-  return true;
-#endif /* STS4MAYU */
-#ifdef CTS4MAYU
-  for (int i = 0; i < s_devNum; i++) {
-    StopFeed(s_hTP[i]);
-  }
-  return false;
-#endif /* CTS4MAYU */
-}
-
-
-BOOL WINAPI DllMain(HANDLE module, DWORD reason, LPVOID reserve)
-{
-    s_instance = (HINSTANCE)module;
-
-    return TRUE;
-}
+#include <windows.h>\r
+#include <process.h>\r
+#include <tchar.h>\r
+#include "../driver.h"\r
+#ifdef STS4MAYU\r
+#include "SynKit.h"\r
+#pragma comment(lib, "SynCom.lib")\r
+#endif /* STS4MAYU */\r
+#ifdef CTS4MAYU\r
+#include "Touchpad.h"\r
+#pragma comment(lib, "TouchPad.lib")\r
+#endif /* CTS4MAYU */\r
+\r
+static HANDLE s_instance;\r
+static UINT s_engineThreadId;\r
+\r
+#ifdef STS4MAYU\r
+static ISynAPI *s_synAPI;\r
+static ISynDevice *s_synDevice;\r
+static HANDLE s_notifyEvent;\r
+\r
+static int s_terminated;\r
+static HANDLE s_loopThread;\r
+static unsigned int s_loopThreadId;\r
+#endif /* STS4MAYU */\r
+#ifdef CTS4MAYU\r
+static HTOUCHPAD s_hTP[16];\r
+static int s_devNum;\r
+#endif /* CTS4MAYU */\r
+\r
+static void changeTouch(int i_isBreak)\r
+{\r
+  PostThreadMessage(s_engineThreadId, WM_APP + 201, i_isBreak ? 0 : 1, 0);\r
+}\r
+\r
+static void postEvent(WPARAM wParam, LPARAM lParam)\r
+{\r
+  PostThreadMessage(s_engineThreadId, WM_APP + 201, wParam, lParam);\r
+}\r
+\r
+#ifdef STS4MAYU\r
+static unsigned int WINAPI loop(void *dummy)\r
+{\r
+  HRESULT result;\r
+  SynPacket packet;\r
+  int isTouched = 0;\r
+\r
+  while (s_terminated == 0) {\r
+    WaitForSingleObject(s_notifyEvent, INFINITE);\r
+    if (s_terminated) {\r
+      break;\r
+    }\r
+\r
+    for (;;) {\r
+      long value;\r
+\r
+      result = s_synAPI->GetEventParameter(&value);\r
+      if (result != SYN_OK) {\r
+       break;\r
+      }\r
+      if (value == SE_Configuration_Changed) {\r
+       s_synDevice->SetEventNotification(s_notifyEvent);\r
+      }\r
+    }\r
+\r
+    for (;;) {\r
+      result = s_synDevice->LoadPacket(packet);\r
+      if (result == SYNE_FAIL) {\r
+       break;\r
+      }\r
+\r
+      if (isTouched) {\r
+       if (!(packet.FingerState() & SF_FingerTouch)) {\r
+         changeTouch(1);\r
+         isTouched = 0;\r
+       }\r
+      } else {\r
+       if (packet.FingerState() & SF_FingerTouch) {\r
+         changeTouch(0);\r
+         isTouched = 1;\r
+       }\r
+      }\r
+    }\r
+  }\r
+  _endthreadex(0);\r
+  return 0;\r
+}\r
+#endif /* STS4MAYU */\r
+#ifdef CTS4MAYU\r
+static void CALLBACK TouchpadFunc(HTOUCHPAD hTP, LPFEEDHDR lpFeedHdr, LPARAM i_lParam)\r
+{\r
+       LPRAWFEED lpRawFeed;\r
+       static int isTouched = 0;\r
+       static WPARAM s_wParam;\r
+       static LPARAM s_lParam;\r
+       WPARAM wParam;\r
+       LPARAM lParam;\r
+\r
+       lpRawFeed = (LPRAWFEED)(lpFeedHdr + 1);\r
+#if 1\r
+       wParam = lpRawFeed->wPressure;\r
+       lParam = lpRawFeed->y << 16 | lpRawFeed->x;\r
+       if (wParam != s_wParam || lParam != s_lParam) {\r
+         postEvent(wParam, lParam);\r
+         s_wParam = wParam;\r
+         s_lParam = lParam;\r
+       }\r
+#else\r
+       if (isTouched) {\r
+         if (!lpRawFeed->wPressure) {\r
+           changeTouch(1);\r
+           isTouched = 0;\r
+         }\r
+       } else {\r
+         if (lpRawFeed->wPressure) {\r
+           changeTouch(0);\r
+           isTouched = 1;\r
+         }\r
+       }\r
+#endif\r
+       EnableWindowsCursor(hTP, TRUE);\r
+}\r
+\r
+static BOOL CALLBACK DevicesFunc(LPGENERICDEVICE device, LPARAM lParam)\r
+{\r
+       HTOUCHPAD hTP = NULL;\r
+       BOOL ret = FALSE;\r
+\r
+       s_hTP[s_devNum] = GetPad(device->devicePort);\r
+       CreateCallback(s_hTP[s_devNum], TouchpadFunc,\r
+                      TPF_RAW | TPF_POSTMESSAGE, NULL);\r
+       StartFeed(s_hTP[s_devNum]);\r
+       ++s_devNum;\r
+       return TRUE;\r
+}\r
+#endif /* CTS4MAYU */\r
+\r
+bool WINAPI ts4mayuInit(UINT i_engineThreadId)\r
+{\r
+  s_engineThreadId = i_engineThreadId;\r
+\r
+#ifdef STS4MAYU\r
+  HRESULT result;\r
+  long hdl;\r
+\r
+  s_synAPI = NULL;\r
+  s_synDevice = NULL;\r
+  s_notifyEvent = NULL;\r
+\r
+  s_terminated = 0;\r
+\r
+  result = SynCreateAPI(&s_synAPI);\r
+  if (result != SYN_OK) {\r
+    goto error_on_init;\r
+  }\r
+\r
+  hdl = -1;\r
+  result = s_synAPI->FindDevice(SE_ConnectionAny, SE_DeviceTouchPad, &hdl);\r
+  if (result != SYN_OK) {\r
+    goto error_on_init;\r
+  }\r
+\r
+  result = s_synAPI->CreateDevice(hdl, &s_synDevice);\r
+  if (result != SYN_OK) {\r
+    goto error_on_init;\r
+  }\r
+\r
+  s_notifyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);\r
+  if (s_notifyEvent == NULL) {\r
+    goto error_on_init;\r
+  }\r
+\r
+  s_synAPI->SetEventNotification(s_notifyEvent);\r
+  s_synDevice->SetEventNotification(s_notifyEvent);\r
+\r
+  s_loopThread =\r
+    (HANDLE)_beginthreadex(NULL, 0, loop, NULL, 0, &s_loopThreadId);\r
+  if (s_loopThread == 0) {\r
+    goto error_on_init;\r
+  }\r
+\r
+  return true;\r
+\r
+error_on_init:\r
+  if (s_notifyEvent) {\r
+    CloseHandle(s_notifyEvent);\r
+  }\r
+\r
+  if (s_synDevice) {\r
+    s_synDevice->Release();\r
+  }\r
+\r
+  if (s_synAPI) {\r
+    s_synAPI->Release();\r
+  }\r
+\r
+  return false;\r
+#endif /* STS4MAYU */\r
+#ifdef CTS4MAYU\r
+  // enumerate devices\r
+  EnumDevices(DevicesFunc, NULL);\r
+  return true;\r
+#endif /* CTS4MAYU */\r
+}\r
+\r
+\r
+bool WINAPI ts4mayuTerm()\r
+{\r
+#ifdef STS4MAYU\r
+  s_terminated = 1;\r
+\r
+  if (s_loopThread) {\r
+    SetEvent(s_notifyEvent);\r
+    WaitForSingleObject(s_loopThread, INFINITE);\r
+    CloseHandle(s_loopThread);\r
+  }\r
+\r
+  if (s_notifyEvent) {\r
+    CloseHandle(s_notifyEvent);\r
+  }\r
+\r
+  if (s_synDevice) {\r
+    s_synDevice->Release();\r
+  }\r
+\r
+  if (s_synAPI) {\r
+    s_synAPI->Release();\r
+  }\r
+\r
+  return true;\r
+#endif /* STS4MAYU */\r
+#ifdef CTS4MAYU\r
+  for (int i = 0; i < s_devNum; i++) {\r
+    StopFeed(s_hTP[i]);\r
+  }\r
+  return false;\r
+#endif /* CTS4MAYU */\r
+}\r
+\r
+\r
+BOOL WINAPI DllMain(HANDLE module, DWORD reason, LPVOID reserve)\r
+{\r
+    s_instance = (HINSTANCE)module;\r
+\r
+    return TRUE;\r
+}\r
index 566250b..9b74537 100755 (executable)
@@ -1,3 +1,3 @@
-EXPORTS
-       ts4mayuInit     @1
-       ts4mayuTerm     @2
+EXPORTS\r
+       ts4mayuInit     @1\r
+       ts4mayuTerm     @2\r
index 64cac18..bd8584f 100644 (file)
-_TCHAR *VK2TCHAR[] = {
-       _T("VK_Unknown_0x00"),
-       _T("VK_LBUTTON"),
-       _T("VK_RBUTTON"),
-       _T("VK_CANCEL"),
-       _T("VK_MBUTTON"),
-       _T("VK_XBUTTON1"),
-       _T("VK_XBUTTON2"),
-       _T("VK_Undefined_0x07"),
-       _T("VK_BACK"),
-       _T("VK_TAB"),
-       _T("VK_Reserved_0xA"),
-       _T("VK_Reserved_0xB"),
-       _T("VK_CLEAR"),
-       _T("VK_RETURN"),
-       _T("VK_Undefined_0x0E"),
-       _T("VK_Undefined_0x0F"),
-       _T("VK_SHIFT"),
-       _T("VK_CONTROL"),
-       _T("VK_MENU"),
-       _T("VK_PAUSE"),
-       _T("VK_CAPITAL"),
-       _T("VK_KANA"),
-       _T("VK_Undefined_0x16"),
-       _T("VK_JUNJA"),
-       _T("VK_FINAL"),
-       _T("VK_KANJI"),
-       _T("VK_Undefined"),
-       _T("VK_ESCAPE"),
-       _T("VK_CONVERT"),
-       _T("VK_NONCONVERT"),
-       _T("VK_ACCEPT"),
-       _T("VK_MODECHANGE"),
-       _T("VK_SPACE"),
-       _T("VK_PRIOR"),
-       _T("VK_NEXT"),
-       _T("VK_END"),
-       _T("VK_HOME"),
-       _T("VK_LEFT"),
-       _T("VK_UP"),
-       _T("VK_RIGHT"),
-       _T("VK_DOWN"),
-       _T("VK_SELECT"),
-       _T("VK_PRINT"),
-       _T("VK_EXECUTE"),
-       _T("VK_SNAPSHOT"),
-       _T("VK_INSERT"),
-       _T("VK_DELETE"),
-       _T("VK_HELP"),
-       _T("VK_0"),
-       _T("VK_1"),
-       _T("VK_2"),
-       _T("VK_3"),
-       _T("VK_4"),
-       _T("VK_5"),
-       _T("VK_6"),
-       _T("VK_7"),
-       _T("VK_8"),
-       _T("VK_9"),
-       _T("VK_Undefined_0x3A"),
-       _T("VK_Undefined_0x3B"),
-       _T("VK_Undefined_0x3C"),
-       _T("VK_Undefined_0x3D"),
-       _T("VK_Undefined_0x3E"),
-       _T("VK_Undefined_0x3F"),
-       _T("VK_Undefined_0x40"),
-       _T("VK_A"),
-       _T("VK_B"),
-       _T("VK_C"),
-       _T("VK_D"),
-       _T("VK_E"),
-       _T("VK_F"),
-       _T("VK_G"),
-       _T("VK_H"),
-       _T("VK_I"),
-       _T("VK_J"),
-       _T("VK_K"),
-       _T("VK_L"),
-       _T("VK_M"),
-       _T("VK_N"),
-       _T("VK_O"),
-       _T("VK_P"),
-       _T("VK_Q"),
-       _T("VK_R"),
-       _T("VK_S"),
-       _T("VK_T"),
-       _T("VK_U"),
-       _T("VK_V"),
-       _T("VK_W"),
-       _T("VK_X"),
-       _T("VK_Y"),
-       _T("VK_Z"),
-       _T("VK_LWIN"),
-       _T("VK_RWIN"),
-       _T("VK_APPS"),
-       _T("VK_Reserved_0x5E"),
-       _T("VK_SLEEP"),
-       _T("VK_NUMPAD0"),
-       _T("VK_NUMPAD1"),
-       _T("VK_NUMPAD2"),
-       _T("VK_NUMPAD3"),
-       _T("VK_NUMPAD4"),
-       _T("VK_NUMPAD5"),
-       _T("VK_NUMPAD6"),
-       _T("VK_NUMPAD7"),
-       _T("VK_NUMPAD8"),
-       _T("VK_NUMPAD9"),
-       _T("VK_MULTIPLY"),
-       _T("VK_ADD"),
-       _T("VK_SEPARATOR"),
-       _T("VK_SUBTRACT"),
-       _T("VK_DECIMAL"),
-       _T("VK_DIVIDE"),
-       _T("VK_F1"),
-       _T("VK_F2"),
-       _T("VK_F3"),
-       _T("VK_F4"),
-       _T("VK_F5"),
-       _T("VK_F6"),
-       _T("VK_F7"),
-       _T("VK_F8"),
-       _T("VK_F9"),
-       _T("VK_F10"),
-       _T("VK_F11"),
-       _T("VK_F12"),
-       _T("VK_F13"),
-       _T("VK_F14"),
-       _T("VK_F15"),
-       _T("VK_F16"),
-       _T("VK_F17"),
-       _T("VK_F18"),
-       _T("VK_F19"),
-       _T("VK_F20"),
-       _T("VK_F21"),
-       _T("VK_F22"),
-       _T("VK_F23"),
-       _T("VK_F24"),
-       _T("VK_Unassigned_0x88"),
-       _T("VK_Unassigned_0x89"),
-       _T("VK_Unassigned_0x8A"),
-       _T("VK_Unassigned_0x8B"),
-       _T("VK_Unassigned_0x8C"),
-       _T("VK_Unassigned_0x8D"),
-       _T("VK_Unassigned_0x8E"),
-       _T("VK_Unassigned_0x8F"),
-       _T("VK_NUMLOCK"),
-       _T("VK_SCROLL"),
-       _T("VK_OEM_specific_0x92"),
-       _T("VK_OEM_specific_0x93"),
-       _T("VK_OEM_specific_0x94"),
-       _T("VK_OEM_specific_0x95"),
-       _T("VK_OEM_specific_0x96"),
-       _T("VK_Unassigned_0x97"),
-       _T("VK_Unassigned_0x98"),
-       _T("VK_Unassigned_0x99"),
-       _T("VK_Unassigned_0x9A"),
-       _T("VK_Unassigned_0x9B"),
-       _T("VK_Unassigned_0x9C"),
-       _T("VK_Unassigned_0x9D"),
-       _T("VK_Unassigned_0x9E"),
-       _T("VK_Unassigned_0x9F"),
-       _T("VK_LSHIFT"),
-       _T("VK_RSHIFT"),
-       _T("VK_LCONTROL"),
-       _T("VK_RCONTROL"),
-       _T("VK_LMENU"),
-       _T("VK_RMENU"),
-       _T("VK_BROWSER_BACK"),
-       _T("VK_BROWSER_FORWARD"),
-       _T("VK_BROWSER_REFRESH"),
-       _T("VK_BROWSER_STOP"),
-       _T("VK_BROWSER_SEARCH"),
-       _T("VK_BROWSER_FAVORITES"),
-       _T("VK_BROWSER_HOME"),
-       _T("VK_VOLUME_MUTE"),
-       _T("VK_VOLUME_DOWN"),
-       _T("VK_VOLUME_UP"),
-       _T("VK_MEDIA_NEXT_TRACK"),
-       _T("VK_MEDIA_PREV_TRACK"),
-       _T("VK_MEDIA_STOP"),
-       _T("VK_MEDIA_PLAY_PAUSE"),
-       _T("VK_LAUNCH_MAIL"),
-       _T("VK_LAUNCH_MEDIA_SELECT"),
-       _T("VK_LAUNCH_APP1"),
-       _T("VK_LAUNCH_APP2"),
-       _T("VK_Reserved_0xB8"),
-       _T("VK_Reserved_0xB9"),
-       _T("VK_OEM_1"),
-       _T("VK_OEM_PLUS"),
-       _T("VK_OEM_COMMA"),
-       _T("VK_OEM_MINUS"),
-       _T("VK_OEM_PERIOD"),
-       _T("VK_OEM_2"),
-       _T("VK_OEM_3"),
-       _T("VK_Reserved_0xC1"),
-       _T("VK_Reserved_0xC2"),
-       _T("VK_Reserved_0xC3"),
-       _T("VK_Reserved_0xC4"),
-       _T("VK_Reserved_0xC5"),
-       _T("VK_Reserved_0xC6"),
-       _T("VK_Reserved_0xC7"),
-       _T("VK_Reserved_0xC8"),
-       _T("VK_Reserved_0xC9"),
-       _T("VK_Reserved_0xCA"),
-       _T("VK_Reserved_0xCB"),
-       _T("VK_Reserved_0xCC"),
-       _T("VK_Reserved_0xCD"),
-       _T("VK_Reserved_0xCE"),
-       _T("VK_Reserved_0xCF"),
-       _T("VK_Reserved_0xD0"),
-       _T("VK_Reserved_0xD1"),
-       _T("VK_Reserved_0xD2"),
-       _T("VK_Reserved_0xD3"),
-       _T("VK_Reserved_0xD4"),
-       _T("VK_Reserved_0xD5"),
-       _T("VK_Reserved_0xD6"),
-       _T("VK_Reserved_0xD7"),
-       _T("VK_Unassigned_0xD8"),
-       _T("VK_Unassigned_0xD9"),
-       _T("VK_Unassigned_0xDA"),
-       _T("VK_OEM_4"),
-       _T("VK_OEM_5"),
-       _T("VK_OEM_6"),
-       _T("VK_OEM_7"),
-       _T("VK_OEM_8"),
-       _T("VK_Reserved_0xE0"),
-       _T("VK_OEM_specific_0xE1"),
-       _T("VK_OEM_102"),
-       _T("VK_OEM_specific_0xE3"),
-       _T("VK_OEM_specific_0xE4"),
-       _T("VK_PROCESSKEY"),
-       _T("VK_OEM_specific_0xE6"),
-       _T("VK_PACKET"),
-       _T("VK_Unassigned_0xE8"),
-       _T("VK_OEM_specific_0xE9"),
-       _T("VK_OEM_specific_0xEA"),
-       _T("VK_OEM_specific_0xEB"),
-       _T("VK_OEM_specific_0xEC"),
-       _T("VK_OEM_specific_0xED"),
-       _T("VK_OEM_specific_0xEE"),
-       _T("VK_OEM_specific_0xEF"),
-       _T("VK_OEM_specific_0xF0"),
-       _T("VK_OEM_specific_0xF1"),
-       _T("VK_OEM_specific_0xF2"),
-       _T("VK_OEM_specific_0xF3"),
-       _T("VK_OEM_specific_0xF4"),
-       _T("VK_OEM_specific_0xF5"),
-       _T("VK_ATTN"),
-       _T("VK_CRSEL"),
-       _T("VK_EXSEL"),
-       _T("VK_EREOF"),
-       _T("VK_PLAY"),
-       _T("VK_ZOOM"),
-       _T("VK_NONAME"),
-       _T("VK_PA1"),
-       _T("VK_OEM_CLEAR"),
-       _T("VK_Unknown_0xFF"),
-};
+_TCHAR *VK2TCHAR[] = {\r
+       _T("VK_Unknown_0x00"),\r
+       _T("VK_LBUTTON"),\r
+       _T("VK_RBUTTON"),\r
+       _T("VK_CANCEL"),\r
+       _T("VK_MBUTTON"),\r
+       _T("VK_XBUTTON1"),\r
+       _T("VK_XBUTTON2"),\r
+       _T("VK_Undefined_0x07"),\r
+       _T("VK_BACK"),\r
+       _T("VK_TAB"),\r
+       _T("VK_Reserved_0xA"),\r
+       _T("VK_Reserved_0xB"),\r
+       _T("VK_CLEAR"),\r
+       _T("VK_RETURN"),\r
+       _T("VK_Undefined_0x0E"),\r
+       _T("VK_Undefined_0x0F"),\r
+       _T("VK_SHIFT"),\r
+       _T("VK_CONTROL"),\r
+       _T("VK_MENU"),\r
+       _T("VK_PAUSE"),\r
+       _T("VK_CAPITAL"),\r
+       _T("VK_KANA"),\r
+       _T("VK_Undefined_0x16"),\r
+       _T("VK_JUNJA"),\r
+       _T("VK_FINAL"),\r
+       _T("VK_KANJI"),\r
+       _T("VK_Undefined"),\r
+       _T("VK_ESCAPE"),\r
+       _T("VK_CONVERT"),\r
+       _T("VK_NONCONVERT"),\r
+       _T("VK_ACCEPT"),\r
+       _T("VK_MODECHANGE"),\r
+       _T("VK_SPACE"),\r
+       _T("VK_PRIOR"),\r
+       _T("VK_NEXT"),\r
+       _T("VK_END"),\r
+       _T("VK_HOME"),\r
+       _T("VK_LEFT"),\r
+       _T("VK_UP"),\r
+       _T("VK_RIGHT"),\r
+       _T("VK_DOWN"),\r
+       _T("VK_SELECT"),\r
+       _T("VK_PRINT"),\r
+       _T("VK_EXECUTE"),\r
+       _T("VK_SNAPSHOT"),\r
+       _T("VK_INSERT"),\r
+       _T("VK_DELETE"),\r
+       _T("VK_HELP"),\r
+       _T("VK_0"),\r
+       _T("VK_1"),\r
+       _T("VK_2"),\r
+       _T("VK_3"),\r
+       _T("VK_4"),\r
+       _T("VK_5"),\r
+       _T("VK_6"),\r
+       _T("VK_7"),\r
+       _T("VK_8"),\r
+       _T("VK_9"),\r
+       _T("VK_Undefined_0x3A"),\r
+       _T("VK_Undefined_0x3B"),\r
+       _T("VK_Undefined_0x3C"),\r
+       _T("VK_Undefined_0x3D"),\r
+       _T("VK_Undefined_0x3E"),\r
+       _T("VK_Undefined_0x3F"),\r
+       _T("VK_Undefined_0x40"),\r
+       _T("VK_A"),\r
+       _T("VK_B"),\r
+       _T("VK_C"),\r
+       _T("VK_D"),\r
+       _T("VK_E"),\r
+       _T("VK_F"),\r
+       _T("VK_G"),\r
+       _T("VK_H"),\r
+       _T("VK_I"),\r
+       _T("VK_J"),\r
+       _T("VK_K"),\r
+       _T("VK_L"),\r
+       _T("VK_M"),\r
+       _T("VK_N"),\r
+       _T("VK_O"),\r
+       _T("VK_P"),\r
+       _T("VK_Q"),\r
+       _T("VK_R"),\r
+       _T("VK_S"),\r
+       _T("VK_T"),\r
+       _T("VK_U"),\r
+       _T("VK_V"),\r
+       _T("VK_W"),\r
+       _T("VK_X"),\r
+       _T("VK_Y"),\r
+       _T("VK_Z"),\r
+       _T("VK_LWIN"),\r
+       _T("VK_RWIN"),\r
+       _T("VK_APPS"),\r
+       _T("VK_Reserved_0x5E"),\r
+       _T("VK_SLEEP"),\r
+       _T("VK_NUMPAD0"),\r
+       _T("VK_NUMPAD1"),\r
+       _T("VK_NUMPAD2"),\r
+       _T("VK_NUMPAD3"),\r
+       _T("VK_NUMPAD4"),\r
+       _T("VK_NUMPAD5"),\r
+       _T("VK_NUMPAD6"),\r
+       _T("VK_NUMPAD7"),\r
+       _T("VK_NUMPAD8"),\r
+       _T("VK_NUMPAD9"),\r
+       _T("VK_MULTIPLY"),\r
+       _T("VK_ADD"),\r
+       _T("VK_SEPARATOR"),\r
+       _T("VK_SUBTRACT"),\r
+       _T("VK_DECIMAL"),\r
+       _T("VK_DIVIDE"),\r
+       _T("VK_F1"),\r
+       _T("VK_F2"),\r
+       _T("VK_F3"),\r
+       _T("VK_F4"),\r
+       _T("VK_F5"),\r
+       _T("VK_F6"),\r
+       _T("VK_F7"),\r
+       _T("VK_F8"),\r
+       _T("VK_F9"),\r
+       _T("VK_F10"),\r
+       _T("VK_F11"),\r
+       _T("VK_F12"),\r
+       _T("VK_F13"),\r
+       _T("VK_F14"),\r
+       _T("VK_F15"),\r
+       _T("VK_F16"),\r
+       _T("VK_F17"),\r
+       _T("VK_F18"),\r
+       _T("VK_F19"),\r
+       _T("VK_F20"),\r
+       _T("VK_F21"),\r
+       _T("VK_F22"),\r
+       _T("VK_F23"),\r
+       _T("VK_F24"),\r
+       _T("VK_Unassigned_0x88"),\r
+       _T("VK_Unassigned_0x89"),\r
+       _T("VK_Unassigned_0x8A"),\r
+       _T("VK_Unassigned_0x8B"),\r
+       _T("VK_Unassigned_0x8C"),\r
+       _T("VK_Unassigned_0x8D"),\r
+       _T("VK_Unassigned_0x8E"),\r
+       _T("VK_Unassigned_0x8F"),\r
+       _T("VK_NUMLOCK"),\r
+       _T("VK_SCROLL"),\r
+       _T("VK_OEM_specific_0x92"),\r
+       _T("VK_OEM_specific_0x93"),\r
+       _T("VK_OEM_specific_0x94"),\r
+       _T("VK_OEM_specific_0x95"),\r
+       _T("VK_OEM_specific_0x96"),\r
+       _T("VK_Unassigned_0x97"),\r
+       _T("VK_Unassigned_0x98"),\r
+       _T("VK_Unassigned_0x99"),\r
+       _T("VK_Unassigned_0x9A"),\r
+       _T("VK_Unassigned_0x9B"),\r
+       _T("VK_Unassigned_0x9C"),\r
+       _T("VK_Unassigned_0x9D"),\r
+       _T("VK_Unassigned_0x9E"),\r
+       _T("VK_Unassigned_0x9F"),\r
+       _T("VK_LSHIFT"),\r
+       _T("VK_RSHIFT"),\r
+       _T("VK_LCONTROL"),\r
+       _T("VK_RCONTROL"),\r
+       _T("VK_LMENU"),\r
+       _T("VK_RMENU"),\r
+       _T("VK_BROWSER_BACK"),\r
+       _T("VK_BROWSER_FORWARD"),\r
+       _T("VK_BROWSER_REFRESH"),\r
+       _T("VK_BROWSER_STOP"),\r
+       _T("VK_BROWSER_SEARCH"),\r
+       _T("VK_BROWSER_FAVORITES"),\r
+       _T("VK_BROWSER_HOME"),\r
+       _T("VK_VOLUME_MUTE"),\r
+       _T("VK_VOLUME_DOWN"),\r
+       _T("VK_VOLUME_UP"),\r
+       _T("VK_MEDIA_NEXT_TRACK"),\r
+       _T("VK_MEDIA_PREV_TRACK"),\r
+       _T("VK_MEDIA_STOP"),\r
+       _T("VK_MEDIA_PLAY_PAUSE"),\r
+       _T("VK_LAUNCH_MAIL"),\r
+       _T("VK_LAUNCH_MEDIA_SELECT"),\r
+       _T("VK_LAUNCH_APP1"),\r
+       _T("VK_LAUNCH_APP2"),\r
+       _T("VK_Reserved_0xB8"),\r
+       _T("VK_Reserved_0xB9"),\r
+       _T("VK_OEM_1"),\r
+       _T("VK_OEM_PLUS"),\r
+       _T("VK_OEM_COMMA"),\r
+       _T("VK_OEM_MINUS"),\r
+       _T("VK_OEM_PERIOD"),\r
+       _T("VK_OEM_2"),\r
+       _T("VK_OEM_3"),\r
+       _T("VK_Reserved_0xC1"),\r
+       _T("VK_Reserved_0xC2"),\r
+       _T("VK_Reserved_0xC3"),\r
+       _T("VK_Reserved_0xC4"),\r
+       _T("VK_Reserved_0xC5"),\r
+       _T("VK_Reserved_0xC6"),\r
+       _T("VK_Reserved_0xC7"),\r
+       _T("VK_Reserved_0xC8"),\r
+       _T("VK_Reserved_0xC9"),\r
+       _T("VK_Reserved_0xCA"),\r
+       _T("VK_Reserved_0xCB"),\r
+       _T("VK_Reserved_0xCC"),\r
+       _T("VK_Reserved_0xCD"),\r
+       _T("VK_Reserved_0xCE"),\r
+       _T("VK_Reserved_0xCF"),\r
+       _T("VK_Reserved_0xD0"),\r
+       _T("VK_Reserved_0xD1"),\r
+       _T("VK_Reserved_0xD2"),\r
+       _T("VK_Reserved_0xD3"),\r
+       _T("VK_Reserved_0xD4"),\r
+       _T("VK_Reserved_0xD5"),\r
+       _T("VK_Reserved_0xD6"),\r
+       _T("VK_Reserved_0xD7"),\r
+       _T("VK_Unassigned_0xD8"),\r
+       _T("VK_Unassigned_0xD9"),\r
+       _T("VK_Unassigned_0xDA"),\r
+       _T("VK_OEM_4"),\r
+       _T("VK_OEM_5"),\r
+       _T("VK_OEM_6"),\r
+       _T("VK_OEM_7"),\r
+       _T("VK_OEM_8"),\r
+       _T("VK_Reserved_0xE0"),\r
+       _T("VK_OEM_specific_0xE1"),\r
+       _T("VK_OEM_102"),\r
+       _T("VK_OEM_specific_0xE3"),\r
+       _T("VK_OEM_specific_0xE4"),\r
+       _T("VK_PROCESSKEY"),\r
+       _T("VK_OEM_specific_0xE6"),\r
+       _T("VK_PACKET"),\r
+       _T("VK_Unassigned_0xE8"),\r
+       _T("VK_OEM_specific_0xE9"),\r
+       _T("VK_OEM_specific_0xEA"),\r
+       _T("VK_OEM_specific_0xEB"),\r
+       _T("VK_OEM_specific_0xEC"),\r
+       _T("VK_OEM_specific_0xED"),\r
+       _T("VK_OEM_specific_0xEE"),\r
+       _T("VK_OEM_specific_0xEF"),\r
+       _T("VK_OEM_specific_0xF0"),\r
+       _T("VK_OEM_specific_0xF1"),\r
+       _T("VK_OEM_specific_0xF2"),\r
+       _T("VK_OEM_specific_0xF3"),\r
+       _T("VK_OEM_specific_0xF4"),\r
+       _T("VK_OEM_specific_0xF5"),\r
+       _T("VK_ATTN"),\r
+       _T("VK_CRSEL"),\r
+       _T("VK_EXSEL"),\r
+       _T("VK_EREOF"),\r
+       _T("VK_PLAY"),\r
+       _T("VK_ZOOM"),\r
+       _T("VK_NONAME"),\r
+       _T("VK_PA1"),\r
+       _T("VK_OEM_CLEAR"),\r
+       _T("VK_Unknown_0xFF"),\r
+};\r
index dec3257..7a40695 100644 (file)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// vkeytable.cpp
-
-
-#include "vkeytable.h"
-#include <ime.h>
-
-
-// Vkey table (terminated by NULL)
-const VKeyTable g_vkeyTable[] =
-{
-#define VK(name) { VK_##name, _T(#name) }
-
-/*
- * from WinUser.h
- */
-
-  VK(LBUTTON),         // 0x01
-  VK(RBUTTON),         // 0x02
-  VK(CANCEL),          // 0x03
-  VK(MBUTTON),         // 0x04    /* NOT contiguous with L & RBUTTON */
-
-  VK(XBUTTON1),                // 0x05    /* NOT contiguous with L & RBUTTON */
-  VK(XBUTTON2),                // 0x06    /* NOT contiguous with L & RBUTTON */
-
-/*
- * 0x07 : unassigned
- */
-
-  VK(BACK),            // 0x08
-  VK(TAB),             // 0x09
-
-/*
- * 0x0A - 0x0B : reserved
- */
-
-  VK(CLEAR),           // 0x0C
-  VK(RETURN),          // 0x0D
-
-  VK(SHIFT),           // 0x10
-  VK(CONTROL),         // 0x11
-  VK(MENU),            // 0x12
-  VK(PAUSE),           // 0x13
-  VK(CAPITAL),         // 0x14
-
-  VK(KANA),            // 0x15
-  VK(HANGEUL),         // 0x15  /* old name - should be here for compatibility */
-  VK(HANGUL),          // 0x15
-  VK(JUNJA),           // 0x17
-  VK(FINAL),           // 0x18
-  VK(HANJA),           // 0x19
-  VK(KANJI),           // 0x19
-
-  VK(ESCAPE),          // 0x1B
-
-  VK(CONVERT),         // 0x1C
-  VK(NONCONVERT),      // 0x1D
-  VK(ACCEPT),          // 0x1E
-  VK(MODECHANGE),      // 0x1F
-
-  VK(SPACE),           // 0x20
-  VK(PRIOR),           // 0x21
-  VK(NEXT),            // 0x22
-  VK(END),             // 0x23
-  VK(HOME),            // 0x24
-  VK(LEFT),            // 0x25
-  VK(UP),              // 0x26
-  VK(RIGHT),           // 0x27
-  VK(DOWN),            // 0x28
-  VK(SELECT),          // 0x29
-  VK(PRINT),           // 0x2A
-  VK(EXECUTE),         // 0x2B
-  VK(SNAPSHOT),                // 0x2C
-  VK(INSERT),          // 0x2D
-  VK(DELETE),          // 0x2E
-  VK(HELP),            // 0x2F
-
-/*
- * VK_0 - VK_9 are the same as ASCII '0' - '9' (0x30 - 0x39)
- * 0x40 : unassigned
- * VK_A - VK_Z are the same as ASCII 'A' - 'Z' (0x41 - 0x5A)
- */
-
-  { _T('0'), _T("_0") },               // 30 0
-  { _T('1'), _T("_1") },               // 31 1
-  { _T('2'), _T("_2") },               // 32 2
-  { _T('3'), _T("_3") },               // 33 3
-  { _T('4'), _T("_4") },               // 34 4
-  { _T('5'), _T("_5") },               // 35 5
-  { _T('6'), _T("_6") },               // 36 6
-  { _T('7'), _T("_7") },               // 37 7
-  { _T('8'), _T("_8") },               // 38 8
-  { _T('9'), _T("_9") },               // 39 9
-
-  { _T('A'), _T("A") },                        // 41 A
-  { _T('B'), _T("B") },                        // 42 B
-  { _T('C'), _T("C") },                        // 43 C
-  { _T('D'), _T("D") },                        // 44 D
-  { _T('E'), _T("E") },                        // 45 E
-  { _T('F'), _T("F") },                        // 46 F
-  { _T('G'), _T("G") },                        // 47 G
-  { _T('H'), _T("H") },                        // 48 H
-  { _T('I'), _T("I") },                        // 49 I
-  { _T('J'), _T("J") },                        // 4A J
-  { _T('K'), _T("K") },                        // 4B K
-  { _T('L'), _T("L") },                        // 4C L
-  { _T('M'), _T("M") },                        // 4D M
-  { _T('N'), _T("N") },                        // 4E N
-  { _T('O'), _T("O") },                        // 4F O
-  { _T('P'), _T("P") },                        // 50 P
-  { _T('Q'), _T("Q") },                        // 51 Q
-  { _T('R'), _T("R") },                        // 52 R
-  { _T('S'), _T("S") },                        // 53 S
-  { _T('T'), _T("T") },                        // 54 T
-  { _T('U'), _T("U") },                        // 55 U
-  { _T('V'), _T("V") },                        // 56 V
-  { _T('W'), _T("W") },                        // 57 W
-  { _T('X'), _T("X") },                        // 58 X
-  { _T('Y'), _T("Y") },                        // 59 Y
-  { _T('Z'), _T("Z") },                        // 5A Z
-
-  VK(LWIN),            // 0x5B
-  VK(RWIN),            // 0x5C
-  VK(APPS),            // 0x5D
-
-/*
- * 0x5E : reserved
- */
-
-  VK(SLEEP),           // 0x5F
-
-  VK(NUMPAD0),         // 0x60
-  VK(NUMPAD1),         // 0x61
-  VK(NUMPAD2),         // 0x62
-  VK(NUMPAD3),         // 0x63
-  VK(NUMPAD4),         // 0x64
-  VK(NUMPAD5),         // 0x65
-  VK(NUMPAD6),         // 0x66
-  VK(NUMPAD7),         // 0x67
-  VK(NUMPAD8),         // 0x68
-  VK(NUMPAD9),         // 0x69
-  VK(MULTIPLY),                // 0x6A
-  VK(ADD),             // 0x6B
-  VK(SEPARATOR),       // 0x6C
-  VK(SUBTRACT),                // 0x6D
-  VK(DECIMAL),         // 0x6E
-  VK(DIVIDE),          // 0x6F
-  VK(F1),              // 0x70
-  VK(F2),              // 0x71
-  VK(F3),              // 0x72
-  VK(F4),              // 0x73
-  VK(F5),              // 0x74
-  VK(F6),              // 0x75
-  VK(F7),              // 0x76
-  VK(F8),              // 0x77
-  VK(F9),              // 0x78
-  VK(F10),             // 0x79
-  VK(F11),             // 0x7A
-  VK(F12),             // 0x7B
-  VK(F13),             // 0x7C
-  VK(F14),             // 0x7D
-  VK(F15),             // 0x7E
-  VK(F16),             // 0x7F
-  VK(F17),             // 0x80
-  VK(F18),             // 0x81
-  VK(F19),             // 0x82
-  VK(F20),             // 0x83
-  VK(F21),             // 0x84
-  VK(F22),             // 0x85
-  VK(F23),             // 0x86
-  VK(F24),             // 0x87
-
-/*
- * 0x88 - 0x8F : unassigned
- */
-
-  VK(NUMLOCK),         // 0x90
-  VK(SCROLL),          // 0x91
-
-/*
- * NEC PC-9800 kbd definitions
- */
-  VK(OEM_NEC_EQUAL),   // 0x92 // '=' key on numpad
-
-/*
- * Fujitsu/OASYS kbd definitions
- */
-  VK(OEM_FJ_JISHO),    // 0x92 // 'Dictionary' key
-  VK(OEM_FJ_MASSHOU),  // 0x93 // 'Unregister word' key
-  VK(OEM_FJ_TOUROKU),  // 0x94 // 'Register word' key
-  VK(OEM_FJ_LOYA),     // 0x95 // 'Left OYAYUBI' key
-  VK(OEM_FJ_ROYA),     // 0x96 // 'Right OYAYUBI' key
-
-/*
- * 0x97 - 0x9F : unassigned
- */
-
-/*
- * VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys.
- * Used only as parameters to GetAsyncKeyState() and GetKeyState().
- * No other API or message will distinguish left and right keys in this way.
- */
-  VK(LSHIFT),          // 0xA0
-  VK(RSHIFT),          // 0xA1
-  VK(LCONTROL),                // 0xA2
-  VK(RCONTROL),                // 0xA3
-  VK(LMENU),           // 0xA4
-  VK(RMENU),           // 0xA5
-
-  VK(BROWSER_BACK),    // 0xA6
-  VK(BROWSER_FORWARD), // 0xA7
-  VK(BROWSER_REFRESH), // 0xA8
-  VK(BROWSER_STOP),    // 0xA9
-  VK(BROWSER_SEARCH),  // 0xAA
-  VK(BROWSER_FAVORITES),// 0xAB
-  VK(BROWSER_HOME),    // 0xAC
-
-  VK(VOLUME_MUTE),     // 0xAD
-  VK(VOLUME_DOWN),     // 0xAE
-  VK(VOLUME_UP),       // 0xAF
-  VK(MEDIA_NEXT_TRACK),        // 0xB0
-  VK(MEDIA_PREV_TRACK),        // 0xB1
-  VK(MEDIA_STOP),      // 0xB2
-  VK(MEDIA_PLAY_PAUSE),        // 0xB3
-  VK(LAUNCH_MAIL),     // 0xB4
-  VK(LAUNCH_MEDIA_SELECT),     // 0xB5
-  VK(LAUNCH_APP1),      // 0xB6
-  VK(LAUNCH_APP2),      // 0xB7
-
-/*
- * 0xB8 - 0xB9 : reserved
- */
-
-  VK(OEM_1),           // 0xBA // ';:' for US
-  VK(OEM_PLUS),                // 0xBB // '+' any country
-  VK(OEM_COMMA),       // 0xBC // ',' any country
-  VK(OEM_MINUS),       // 0xBD // '-' any country
-  VK(OEM_PERIOD),      // 0xBE // '.' any country
-  VK(OEM_2),           // 0xBF // '/?' for US
-  VK(OEM_3),           // 0xC0 // '`~' for US
-
-/*
- * 0xC1 - 0xD7 : reserved
- */
-
-/*
- * 0xD8 - 0xDA : unassigned
- */
-
-  VK(OEM_4),           // 0xDB //  '[{' for US
-  VK(OEM_5),           // 0xDC //  '\|' for US
-  VK(OEM_6),           // 0xDD //  ']}' for US
-  VK(OEM_7),           // 0xDE //  ''"' for US
-  VK(OEM_8),           // 0xDF
-
-/*
- * 0xE0 : reserved
- */
-
-/*
- * Various extended or enhanced keyboards
- */
-  VK(OEM_AX),          // 0xE1 //  'AX' key on Japanese AX kbd
-  VK(OEM_102),         // 0xE2 //  "<>" or "\|" on RT 102-key kbd.
-  VK(ICO_HELP),                // 0xE3 //  Help key on ICO
-  VK(ICO_00),          // 0xE4 //  00 key on ICO
-
-  VK(PROCESSKEY),      // 0xE5
-
-  VK(ICO_CLEAR),       // 0xE6
-
-  VK(PACKET),          // 0xE7
-
-/*
- * 0xE8 : unassigned
- */
-
-/*
- * Nokia/Ericsson definitions
- */
-  VK(OEM_RESET),       // 0xE9
-  VK(OEM_JUMP),                // 0xEA
-  VK(OEM_PA1),         // 0xEB
-  VK(OEM_PA2),         // 0xEC
-  VK(OEM_PA3),         // 0xED
-  VK(OEM_WSCTRL),      // 0xEE
-  VK(OEM_CUSEL),       // 0xEF
-  VK(OEM_ATTN),                // 0xF0
-  VK(OEM_FINISH),      // 0xF1
-  VK(OEM_COPY),                // 0xF2
-  VK(OEM_AUTO),                // 0xF3
-  VK(OEM_ENLW),                // 0xF4
-  VK(OEM_BACKTAB),     // 0xF5
-
-  VK(ATTN),            // 0xF6
-  VK(CRSEL),           // 0xF7
-  VK(EXSEL),           // 0xF8
-  VK(EREOF),           // 0xF9
-  VK(PLAY),            // 0xFA
-  VK(ZOOM),            // 0xFB
-  VK(NONAME),          // 0xFC
-  VK(PA1),             // 0xFD
-  VK(OEM_CLEAR),       // 0xFE
-
-/*
- * from Ime.h
- */
-
-#if !defined(VK_DBE_ALPHANUMERIC)
-  VK(DBE_ALPHANUMERIC),                        // 0x0f0
-  VK(DBE_KATAKANA),                    // 0x0f1
-  VK(DBE_HIRAGANA),                    // 0x0f2
-  VK(DBE_SBCSCHAR),                    // 0x0f3
-  VK(DBE_DBCSCHAR),                    // 0x0f4
-  VK(DBE_ROMAN),                       // 0x0f5
-  VK(DBE_NOROMAN),                     // 0x0f6
-  VK(DBE_ENTERWORDREGISTERMODE),       // 0x0f7
-  VK(DBE_ENTERIMECONFIGMODE),          // 0x0f8
-  VK(DBE_FLUSHSTRING),                 // 0x0f9
-  VK(DBE_CODEINPUT),                   // 0x0fa
-  VK(DBE_NOCODEINPUT),                 // 0x0fb
-  VK(DBE_DETERMINESTRING),             // 0x0fc
-  VK(DBE_ENTERDLGCONVERSIONMODE),      // 0x0fd
-#endif
-
-  { 0, NULL },
-#undef VK
-};
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// vkeytable.cpp\r
+\r
+\r
+#include "vkeytable.h"\r
+#include <ime.h>\r
+\r
+\r
+// Vkey table (terminated by NULL)\r
+const VKeyTable g_vkeyTable[] =\r
+{\r
+#define VK(name) { VK_##name, _T(#name) }\r
+\r
+/*\r
+ * from WinUser.h\r
+ */\r
+\r
+  VK(LBUTTON),         // 0x01\r
+  VK(RBUTTON),         // 0x02\r
+  VK(CANCEL),          // 0x03\r
+  VK(MBUTTON),         // 0x04    /* NOT contiguous with L & RBUTTON */\r
+\r
+  VK(XBUTTON1),                // 0x05    /* NOT contiguous with L & RBUTTON */\r
+  VK(XBUTTON2),                // 0x06    /* NOT contiguous with L & RBUTTON */\r
+\r
+/*\r
+ * 0x07 : unassigned\r
+ */\r
+\r
+  VK(BACK),            // 0x08\r
+  VK(TAB),             // 0x09\r
+\r
+/*\r
+ * 0x0A - 0x0B : reserved\r
+ */\r
+\r
+  VK(CLEAR),           // 0x0C\r
+  VK(RETURN),          // 0x0D\r
+\r
+  VK(SHIFT),           // 0x10\r
+  VK(CONTROL),         // 0x11\r
+  VK(MENU),            // 0x12\r
+  VK(PAUSE),           // 0x13\r
+  VK(CAPITAL),         // 0x14\r
+\r
+  VK(KANA),            // 0x15\r
+  VK(HANGEUL),         // 0x15  /* old name - should be here for compatibility */\r
+  VK(HANGUL),          // 0x15\r
+  VK(JUNJA),           // 0x17\r
+  VK(FINAL),           // 0x18\r
+  VK(HANJA),           // 0x19\r
+  VK(KANJI),           // 0x19\r
+\r
+  VK(ESCAPE),          // 0x1B\r
+\r
+  VK(CONVERT),         // 0x1C\r
+  VK(NONCONVERT),      // 0x1D\r
+  VK(ACCEPT),          // 0x1E\r
+  VK(MODECHANGE),      // 0x1F\r
+\r
+  VK(SPACE),           // 0x20\r
+  VK(PRIOR),           // 0x21\r
+  VK(NEXT),            // 0x22\r
+  VK(END),             // 0x23\r
+  VK(HOME),            // 0x24\r
+  VK(LEFT),            // 0x25\r
+  VK(UP),              // 0x26\r
+  VK(RIGHT),           // 0x27\r
+  VK(DOWN),            // 0x28\r
+  VK(SELECT),          // 0x29\r
+  VK(PRINT),           // 0x2A\r
+  VK(EXECUTE),         // 0x2B\r
+  VK(SNAPSHOT),                // 0x2C\r
+  VK(INSERT),          // 0x2D\r
+  VK(DELETE),          // 0x2E\r
+  VK(HELP),            // 0x2F\r
+\r
+/*\r
+ * VK_0 - VK_9 are the same as ASCII '0' - '9' (0x30 - 0x39)\r
+ * 0x40 : unassigned\r
+ * VK_A - VK_Z are the same as ASCII 'A' - 'Z' (0x41 - 0x5A)\r
+ */\r
+\r
+  { _T('0'), _T("_0") },               // 30 0\r
+  { _T('1'), _T("_1") },               // 31 1\r
+  { _T('2'), _T("_2") },               // 32 2\r
+  { _T('3'), _T("_3") },               // 33 3\r
+  { _T('4'), _T("_4") },               // 34 4\r
+  { _T('5'), _T("_5") },               // 35 5\r
+  { _T('6'), _T("_6") },               // 36 6\r
+  { _T('7'), _T("_7") },               // 37 7\r
+  { _T('8'), _T("_8") },               // 38 8\r
+  { _T('9'), _T("_9") },               // 39 9\r
+\r
+  { _T('A'), _T("A") },                        // 41 A\r
+  { _T('B'), _T("B") },                        // 42 B\r
+  { _T('C'), _T("C") },                        // 43 C\r
+  { _T('D'), _T("D") },                        // 44 D\r
+  { _T('E'), _T("E") },                        // 45 E\r
+  { _T('F'), _T("F") },                        // 46 F\r
+  { _T('G'), _T("G") },                        // 47 G\r
+  { _T('H'), _T("H") },                        // 48 H\r
+  { _T('I'), _T("I") },                        // 49 I\r
+  { _T('J'), _T("J") },                        // 4A J\r
+  { _T('K'), _T("K") },                        // 4B K\r
+  { _T('L'), _T("L") },                        // 4C L\r
+  { _T('M'), _T("M") },                        // 4D M\r
+  { _T('N'), _T("N") },                        // 4E N\r
+  { _T('O'), _T("O") },                        // 4F O\r
+  { _T('P'), _T("P") },                        // 50 P\r
+  { _T('Q'), _T("Q") },                        // 51 Q\r
+  { _T('R'), _T("R") },                        // 52 R\r
+  { _T('S'), _T("S") },                        // 53 S\r
+  { _T('T'), _T("T") },                        // 54 T\r
+  { _T('U'), _T("U") },                        // 55 U\r
+  { _T('V'), _T("V") },                        // 56 V\r
+  { _T('W'), _T("W") },                        // 57 W\r
+  { _T('X'), _T("X") },                        // 58 X\r
+  { _T('Y'), _T("Y") },                        // 59 Y\r
+  { _T('Z'), _T("Z") },                        // 5A Z\r
+\r
+  VK(LWIN),            // 0x5B\r
+  VK(RWIN),            // 0x5C\r
+  VK(APPS),            // 0x5D\r
+\r
+/*\r
+ * 0x5E : reserved\r
+ */\r
+\r
+  VK(SLEEP),           // 0x5F\r
+\r
+  VK(NUMPAD0),         // 0x60\r
+  VK(NUMPAD1),         // 0x61\r
+  VK(NUMPAD2),         // 0x62\r
+  VK(NUMPAD3),         // 0x63\r
+  VK(NUMPAD4),         // 0x64\r
+  VK(NUMPAD5),         // 0x65\r
+  VK(NUMPAD6),         // 0x66\r
+  VK(NUMPAD7),         // 0x67\r
+  VK(NUMPAD8),         // 0x68\r
+  VK(NUMPAD9),         // 0x69\r
+  VK(MULTIPLY),                // 0x6A\r
+  VK(ADD),             // 0x6B\r
+  VK(SEPARATOR),       // 0x6C\r
+  VK(SUBTRACT),                // 0x6D\r
+  VK(DECIMAL),         // 0x6E\r
+  VK(DIVIDE),          // 0x6F\r
+  VK(F1),              // 0x70\r
+  VK(F2),              // 0x71\r
+  VK(F3),              // 0x72\r
+  VK(F4),              // 0x73\r
+  VK(F5),              // 0x74\r
+  VK(F6),              // 0x75\r
+  VK(F7),              // 0x76\r
+  VK(F8),              // 0x77\r
+  VK(F9),              // 0x78\r
+  VK(F10),             // 0x79\r
+  VK(F11),             // 0x7A\r
+  VK(F12),             // 0x7B\r
+  VK(F13),             // 0x7C\r
+  VK(F14),             // 0x7D\r
+  VK(F15),             // 0x7E\r
+  VK(F16),             // 0x7F\r
+  VK(F17),             // 0x80\r
+  VK(F18),             // 0x81\r
+  VK(F19),             // 0x82\r
+  VK(F20),             // 0x83\r
+  VK(F21),             // 0x84\r
+  VK(F22),             // 0x85\r
+  VK(F23),             // 0x86\r
+  VK(F24),             // 0x87\r
+\r
+/*\r
+ * 0x88 - 0x8F : unassigned\r
+ */\r
+\r
+  VK(NUMLOCK),         // 0x90\r
+  VK(SCROLL),          // 0x91\r
+\r
+/*\r
+ * NEC PC-9800 kbd definitions\r
+ */\r
+  VK(OEM_NEC_EQUAL),   // 0x92 // '=' key on numpad\r
+\r
+/*\r
+ * Fujitsu/OASYS kbd definitions\r
+ */\r
+  VK(OEM_FJ_JISHO),    // 0x92 // 'Dictionary' key\r
+  VK(OEM_FJ_MASSHOU),  // 0x93 // 'Unregister word' key\r
+  VK(OEM_FJ_TOUROKU),  // 0x94 // 'Register word' key\r
+  VK(OEM_FJ_LOYA),     // 0x95 // 'Left OYAYUBI' key\r
+  VK(OEM_FJ_ROYA),     // 0x96 // 'Right OYAYUBI' key\r
+\r
+/*\r
+ * 0x97 - 0x9F : unassigned\r
+ */\r
+\r
+/*\r
+ * VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys.\r
+ * Used only as parameters to GetAsyncKeyState() and GetKeyState().\r
+ * No other API or message will distinguish left and right keys in this way.\r
+ */\r
+  VK(LSHIFT),          // 0xA0\r
+  VK(RSHIFT),          // 0xA1\r
+  VK(LCONTROL),                // 0xA2\r
+  VK(RCONTROL),                // 0xA3\r
+  VK(LMENU),           // 0xA4\r
+  VK(RMENU),           // 0xA5\r
+\r
+  VK(BROWSER_BACK),    // 0xA6\r
+  VK(BROWSER_FORWARD), // 0xA7\r
+  VK(BROWSER_REFRESH), // 0xA8\r
+  VK(BROWSER_STOP),    // 0xA9\r
+  VK(BROWSER_SEARCH),  // 0xAA\r
+  VK(BROWSER_FAVORITES),// 0xAB\r
+  VK(BROWSER_HOME),    // 0xAC\r
+\r
+  VK(VOLUME_MUTE),     // 0xAD\r
+  VK(VOLUME_DOWN),     // 0xAE\r
+  VK(VOLUME_UP),       // 0xAF\r
+  VK(MEDIA_NEXT_TRACK),        // 0xB0\r
+  VK(MEDIA_PREV_TRACK),        // 0xB1\r
+  VK(MEDIA_STOP),      // 0xB2\r
+  VK(MEDIA_PLAY_PAUSE),        // 0xB3\r
+  VK(LAUNCH_MAIL),     // 0xB4\r
+  VK(LAUNCH_MEDIA_SELECT),     // 0xB5\r
+  VK(LAUNCH_APP1),      // 0xB6\r
+  VK(LAUNCH_APP2),      // 0xB7\r
+\r
+/*\r
+ * 0xB8 - 0xB9 : reserved\r
+ */\r
+\r
+  VK(OEM_1),           // 0xBA // ';:' for US\r
+  VK(OEM_PLUS),                // 0xBB // '+' any country\r
+  VK(OEM_COMMA),       // 0xBC // ',' any country\r
+  VK(OEM_MINUS),       // 0xBD // '-' any country\r
+  VK(OEM_PERIOD),      // 0xBE // '.' any country\r
+  VK(OEM_2),           // 0xBF // '/?' for US\r
+  VK(OEM_3),           // 0xC0 // '`~' for US\r
+\r
+/*\r
+ * 0xC1 - 0xD7 : reserved\r
+ */\r
+\r
+/*\r
+ * 0xD8 - 0xDA : unassigned\r
+ */\r
+\r
+  VK(OEM_4),           // 0xDB //  '[{' for US\r
+  VK(OEM_5),           // 0xDC //  '\|' for US\r
+  VK(OEM_6),           // 0xDD //  ']}' for US\r
+  VK(OEM_7),           // 0xDE //  ''"' for US\r
+  VK(OEM_8),           // 0xDF\r
+\r
+/*\r
+ * 0xE0 : reserved\r
+ */\r
+\r
+/*\r
+ * Various extended or enhanced keyboards\r
+ */\r
+  VK(OEM_AX),          // 0xE1 //  'AX' key on Japanese AX kbd\r
+  VK(OEM_102),         // 0xE2 //  "<>" or "\|" on RT 102-key kbd.\r
+  VK(ICO_HELP),                // 0xE3 //  Help key on ICO\r
+  VK(ICO_00),          // 0xE4 //  00 key on ICO\r
+\r
+  VK(PROCESSKEY),      // 0xE5\r
+\r
+  VK(ICO_CLEAR),       // 0xE6\r
+\r
+  VK(PACKET),          // 0xE7\r
+\r
+/*\r
+ * 0xE8 : unassigned\r
+ */\r
+\r
+/*\r
+ * Nokia/Ericsson definitions\r
+ */\r
+  VK(OEM_RESET),       // 0xE9\r
+  VK(OEM_JUMP),                // 0xEA\r
+  VK(OEM_PA1),         // 0xEB\r
+  VK(OEM_PA2),         // 0xEC\r
+  VK(OEM_PA3),         // 0xED\r
+  VK(OEM_WSCTRL),      // 0xEE\r
+  VK(OEM_CUSEL),       // 0xEF\r
+  VK(OEM_ATTN),                // 0xF0\r
+  VK(OEM_FINISH),      // 0xF1\r
+  VK(OEM_COPY),                // 0xF2\r
+  VK(OEM_AUTO),                // 0xF3\r
+  VK(OEM_ENLW),                // 0xF4\r
+  VK(OEM_BACKTAB),     // 0xF5\r
+\r
+  VK(ATTN),            // 0xF6\r
+  VK(CRSEL),           // 0xF7\r
+  VK(EXSEL),           // 0xF8\r
+  VK(EREOF),           // 0xF9\r
+  VK(PLAY),            // 0xFA\r
+  VK(ZOOM),            // 0xFB\r
+  VK(NONAME),          // 0xFC\r
+  VK(PA1),             // 0xFD\r
+  VK(OEM_CLEAR),       // 0xFE\r
+\r
+/*\r
+ * from Ime.h\r
+ */\r
+\r
+#if !defined(VK_DBE_ALPHANUMERIC)\r
+  VK(DBE_ALPHANUMERIC),                        // 0x0f0\r
+  VK(DBE_KATAKANA),                    // 0x0f1\r
+  VK(DBE_HIRAGANA),                    // 0x0f2\r
+  VK(DBE_SBCSCHAR),                    // 0x0f3\r
+  VK(DBE_DBCSCHAR),                    // 0x0f4\r
+  VK(DBE_ROMAN),                       // 0x0f5\r
+  VK(DBE_NOROMAN),                     // 0x0f6\r
+  VK(DBE_ENTERWORDREGISTERMODE),       // 0x0f7\r
+  VK(DBE_ENTERIMECONFIGMODE),          // 0x0f8\r
+  VK(DBE_FLUSHSTRING),                 // 0x0f9\r
+  VK(DBE_CODEINPUT),                   // 0x0fa\r
+  VK(DBE_NOCODEINPUT),                 // 0x0fb\r
+  VK(DBE_DETERMINESTRING),             // 0x0fc\r
+  VK(DBE_ENTERDLGCONVERSIONMODE),      // 0x0fd\r
+#endif\r
+\r
+  { 0, NULL },\r
+#undef VK\r
+};\r
index a2267a0..ed62e86 100644 (file)
@@ -1,24 +1,24 @@
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// vkeytable.h
-
-
-#ifndef _VKEYTABLE_H
-#  define _VKEYTABLE_H
-
-#  include "misc.h"
-#  include <tchar.h>
-
-
-/// define virtual key code and its name
-class VKeyTable
-{
-public:
-  u_int8 m_code;                               /// VKey code
-  const _TCHAR *m_name;                                /// VKey name
-};
-
-extern const VKeyTable g_vkeyTable[];          /** Vkey table (terminated by
-                                                   NULL) */
-
-
-#endif // !_VKEYTABLE_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// vkeytable.h\r
+\r
+\r
+#ifndef _VKEYTABLE_H\r
+#  define _VKEYTABLE_H\r
+\r
+#  include "misc.h"\r
+#  include <tchar.h>\r
+\r
+\r
+/// define virtual key code and its name\r
+class VKeyTable\r
+{\r
+public:\r
+  u_int8 m_code;                               /// VKey code\r
+  const _TCHAR *m_name;                                /// VKey name\r
+};\r
+\r
+extern const VKeyTable g_vkeyTable[];          /** Vkey table (terminated by\r
+                                                   NULL) */\r
+\r
+\r
+#endif // !_VKEYTABLE_H\r
index 1fe5915..6d7ea12 100644 (file)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// windowstool.cpp
-
-
-#include "misc.h"
-
-#include "windowstool.h"
-#include "array.h"
-
-#include <windowsx.h>
-#include <malloc.h>
-#include <shlwapi.h>
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Global variables
-
-
-// instance handle of this application
-HINSTANCE g_hInst = NULL;
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Functions
-
-
-// load resource string
-tstring loadString(UINT i_id)
-{
-  _TCHAR buf[1024];
-  if (LoadString(g_hInst, i_id, buf, NUMBER_OF(buf)))
-    return tstring(buf);
-  else
-    return _T("");
-}
-
-
-// load small icon resource
-HICON loadSmallIcon(UINT i_id)
-{
-  return reinterpret_cast<HICON>(
-    LoadImage(g_hInst, MAKEINTRESOURCE(i_id), IMAGE_ICON, 16, 16, 0));
-}
-
-
-// load big icon resource
-HICON loadBigIcon(UINT i_id)
-{
-  return reinterpret_cast<HICON>(
-    LoadImage(g_hInst, MAKEINTRESOURCE(i_id), IMAGE_ICON, 32, 32, 0));
-}
-
-
-// set small icon to the specified window.
-// @return handle of previous icon or NULL
-HICON setSmallIcon(HWND i_hwnd, UINT i_id)
-{
-  HICON hicon = (i_id == static_cast<UINT>(-1)) ? NULL : loadSmallIcon(i_id);
-  return reinterpret_cast<HICON>(
-    SendMessage(i_hwnd, WM_SETICON, static_cast<WPARAM>(ICON_SMALL),
-               reinterpret_cast<LPARAM>(hicon)));
-}
-
-
-// set big icon to the specified window.
-// @return handle of previous icon or NULL
-HICON setBigIcon(HWND i_hwnd, UINT i_id)
-{
-  HICON hicon = (i_id == static_cast<UINT>(-1)) ? NULL : loadBigIcon(i_id);
-  return reinterpret_cast<HICON>(
-    SendMessage(i_hwnd, WM_SETICON, static_cast<WPARAM>(ICON_BIG),
-               reinterpret_cast<LPARAM>(hicon)));
-}
-
-
-// remove icon from a window that is set by setSmallIcon
-void unsetSmallIcon(HWND i_hwnd)
-{
-  HICON hicon = setSmallIcon(i_hwnd, -1);
-  if (hicon)
-    CHECK_TRUE( DestroyIcon(hicon) );
-}
-
-
-// remove icon from a window that is set by setBigIcon
-void unsetBigIcon(HWND i_hwnd)
-{
-  HICON hicon = setBigIcon(i_hwnd, -1);
-  if (hicon)
-    CHECK_TRUE( DestroyIcon(hicon) );
-}
-
-
-// resize the window (it does not move the window)
-bool resizeWindow(HWND i_hwnd, int i_w, int i_h, bool i_doRepaint)
-{
-  UINT flag = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER;
-  if (!i_doRepaint)
-    flag |= SWP_NOREDRAW;
-  return !!SetWindowPos(i_hwnd, NULL, 0, 0, i_w, i_h, flag);
-}
-
-
-// get rect of the window in client coordinates
-// @return rect of the window in client coordinates
-bool getChildWindowRect(HWND i_hwnd, RECT *o_rc)
-{
-  if (!GetWindowRect(i_hwnd, o_rc))
-    return false;
-  POINT p = { o_rc->left, o_rc->top };
-  HWND phwnd = GetParent(i_hwnd);
-  if (!phwnd)
-    return false;
-  if (!ScreenToClient(phwnd, &p))
-    return false;
-  o_rc->left = p.x;
-  o_rc->top = p.y;
-  p.x = o_rc->right;
-  p.y = o_rc->bottom;
-  ScreenToClient(phwnd, &p);
-  o_rc->right = p.x;
-  o_rc->bottom = p.y;
-  return true;
-}
-
-
-// get toplevel (non-child) window
-HWND getToplevelWindow(HWND i_hwnd, bool *io_isMDI)
-{
-  while (i_hwnd)
-  {
-#ifdef MAYU64
-    LONG_PTR style = GetWindowLongPtr(i_hwnd, GWL_STYLE);
-#else
-    LONG style = GetWindowLong(i_hwnd, GWL_STYLE);
-#endif
-    if ((style & WS_CHILD) == 0)
-      break;
-    if (io_isMDI && *io_isMDI)
-    {
-#ifdef MAYU64
-      LONG_PTR exStyle = GetWindowLongPtr(i_hwnd, GWL_EXSTYLE);
-#else
-      LONG exStyle = GetWindowLong(i_hwnd, GWL_EXSTYLE);
-#endif
-      if (exStyle & WS_EX_MDICHILD)
-       return i_hwnd;
-    }
-    i_hwnd = GetParent(i_hwnd);
-  }
-  if (io_isMDI)
-    *io_isMDI = false;
-  return i_hwnd;
-}
-
-
-// move window asynchronously
-void asyncMoveWindow(HWND i_hwnd, int i_x, int i_y)
-{
-  SetWindowPos(i_hwnd, NULL, i_x, i_y, 0, 0,
-              SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE | SWP_NOOWNERZORDER |
-              SWP_NOSIZE | SWP_NOZORDER);
-}
-
-
-// move window asynchronously
-void asyncMoveWindow(HWND i_hwnd, int i_x, int i_y, int i_w, int i_h)
-{
-  SetWindowPos(i_hwnd, NULL, i_x, i_y, i_w, i_h,
-              SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE | SWP_NOOWNERZORDER |
-              SWP_NOZORDER);
-}
-
-
-// resize asynchronously
-void asyncResize(HWND i_hwnd, int i_w, int i_h)
-{
-  SetWindowPos(i_hwnd, NULL, 0, 0, i_w, i_h,
-              SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE | SWP_NOOWNERZORDER |
-              SWP_NOMOVE | SWP_NOZORDER);
-}
-
-
-// get dll version
-DWORD getDllVersion(const _TCHAR *i_dllname)
-{
-  DWORD dwVersion = 0;
-  
-  if (HINSTANCE hinstDll = LoadLibrary(i_dllname))
-  {
-    DLLGETVERSIONPROC pDllGetVersion
-      = (DLLGETVERSIONPROC)GetProcAddress(hinstDll, "DllGetVersion");
-    /* Because some DLLs may not implement this function, you
-     * must test for it explicitly. Depending on the particular 
-     * DLL, the lack of a DllGetVersion function may
-     * be a useful indicator of the version.
-     */
-    if (pDllGetVersion)
-    {
-      DLLVERSIONINFO dvi;
-      ZeroMemory(&dvi, sizeof(dvi));
-      dvi.cbSize = sizeof(dvi);
-
-      HRESULT hr = (*pDllGetVersion)(&dvi);
-      if (SUCCEEDED(hr))
-       dwVersion = PACKVERSION(dvi.dwMajorVersion, dvi.dwMinorVersion);
-    }
-        
-    FreeLibrary(hinstDll);
-  }
-  return dwVersion;
-}
-
-
-// workaround of SetForegroundWindow
-bool setForegroundWindow(HWND i_hwnd)
-{
-  int nForegroundID = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
-  int nTargetID = GetWindowThreadProcessId(i_hwnd, NULL);
-  
-  //if (!AttachThreadInput(nTargetID, nForegroundID, TRUE))
-  //return false;
-  AttachThreadInput(nTargetID, nForegroundID, TRUE);
-
-  DWORD sp_time;
-  SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, &sp_time, 0);
-  SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (void *)0, 0);
-
-  SetForegroundWindow(i_hwnd);
-
-  SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (void *)sp_time, 0);
-  
-  AttachThreadInput(nTargetID, nForegroundID, FALSE);
-  return true;
-}
-
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// edit control
-
-
-// get edit control's text size
-// @return bytes of text
-size_t editGetTextBytes(HWND i_hwnd)
-{
-  return Edit_GetTextLength(i_hwnd);
-}
-
-
-// delete a line
-void editDeleteLine(HWND i_hwnd, size_t i_n)
-{
-  int len = Edit_LineLength(i_hwnd, i_n);
-  if (len < 0)
-    return;
-  len += 2;
-  int index = Edit_LineIndex(i_hwnd, i_n);
-  Edit_SetSel(i_hwnd, index, index + len);
-  Edit_ReplaceSel(i_hwnd, _T(""));
-}
-  
-
-// insert text at last
-void editInsertTextAtLast(HWND i_hwnd, const tstring &i_text,
-                         size_t i_threshold)
-{
-  if (i_text.empty())
-    return;
-  
-  size_t len = editGetTextBytes(i_hwnd);
-  
-  if (i_threshold < len)
-  {
-    Edit_SetSel(i_hwnd, 0, len / 3 * 2);
-    Edit_ReplaceSel(i_hwnd, _T(""));
-    editDeleteLine(i_hwnd, 0);
-    len = editGetTextBytes(i_hwnd);
-  }
-  
-  Edit_SetSel(i_hwnd, len, len);
-  
-  // \n -> \r\n
-  Array<_TCHAR> buf(i_text.size() * 2 + 1);
-  _TCHAR *d = buf.get();
-  const _TCHAR *str = i_text.c_str();
-  for (const _TCHAR *s = str; s < str + i_text.size(); ++ s)
-  {
-    if (*s == _T('\n'))
-      *d++ = _T('\r');
-    *d++ = *s;
-  }
-  *d = _T('\0');
-  
-  Edit_ReplaceSel(i_hwnd, buf.get());
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Windows2000/XP specific API
-
-
-// initialize layerd window
-static BOOL WINAPI initalizeLayerdWindow(
-  HWND i_hwnd, COLORREF i_crKey, BYTE i_bAlpha, DWORD i_dwFlags)
-{
-  HMODULE hModule = GetModuleHandle(_T("user32.dll"));
-  if (!hModule) {
-    return FALSE;
-  }
-  SetLayeredWindowAttributes_t proc = 
-    reinterpret_cast<SetLayeredWindowAttributes_t>(
-      GetProcAddress(hModule, "SetLayeredWindowAttributes"));
-  if (setLayeredWindowAttributes) {
-    setLayeredWindowAttributes = proc;
-    return setLayeredWindowAttributes(i_hwnd, i_crKey, i_bAlpha, i_dwFlags);
-  } else {
-    return FALSE;
-  }
-}
-
-
-// SetLayeredWindowAttributes API
-SetLayeredWindowAttributes_t setLayeredWindowAttributes
-  = initalizeLayerdWindow;
-
-
-// emulate MonitorFromWindow API
-static HMONITOR WINAPI emulateMonitorFromWindow(HWND hwnd, DWORD dwFlags)
-{
-  return reinterpret_cast<HMONITOR>(1); // dummy HMONITOR
-}
-
-// initialize MonitorFromWindow API
-static HMONITOR WINAPI initializeMonitorFromWindow(HWND hwnd, DWORD dwFlags)
-{
-  HMODULE hModule = GetModuleHandle(_T("user32.dll"));
-  if (!hModule)
-    return FALSE;
-
-  FARPROC proc = GetProcAddress(hModule, "MonitorFromWindow");
-  if(proc)
-    monitorFromWindow =
-      reinterpret_cast<HMONITOR (WINAPI *)(HWND, DWORD)>(proc);
-  else
-    monitorFromWindow = emulateMonitorFromWindow;
-
-  return monitorFromWindow(hwnd, dwFlags);
-}
-
-// MonitorFromWindow API
-HMONITOR (WINAPI *monitorFromWindow)(HWND hwnd, DWORD dwFlags)
-    = initializeMonitorFromWindow;
-
-
-// emulate GetMonitorInfo API
-static BOOL WINAPI emulateGetMonitorInfo(HMONITOR hMonitor, LPMONITORINFO lpmi)
-{
-  if(lpmi->cbSize != sizeof(MONITORINFO))
-    return FALSE;
-
-  lpmi->rcMonitor.left = 0;
-  lpmi->rcMonitor.top = 0;
-  lpmi->rcMonitor.right = GetSystemMetrics(SM_CXFULLSCREEN);
-  lpmi->rcMonitor.bottom = GetSystemMetrics(SM_CYFULLSCREEN);
-  SystemParametersInfo(SPI_GETWORKAREA, 0,
-                       reinterpret_cast<PVOID>(&lpmi->rcWork), FALSE);
-  lpmi->dwFlags = MONITORINFOF_PRIMARY;
-
-  return TRUE;
-}
-
-// initialize GetMonitorInfo API
-static
-BOOL WINAPI initializeGetMonitorInfo(HMONITOR hMonitor, LPMONITORINFO lpmi)
-{
-  HMODULE hModule = GetModuleHandle(_T("user32.dll"));
-  if (!hModule)
-    return FALSE;
-
-  FARPROC proc = GetProcAddress(hModule, "GetMonitorInfoA");
-  if(proc)
-    getMonitorInfo =
-      reinterpret_cast<BOOL (WINAPI *)(HMONITOR, LPMONITORINFO)>(proc);
-  else
-    getMonitorInfo = emulateGetMonitorInfo;
-
-  return getMonitorInfo(hMonitor, lpmi);
-}
-
-// GetMonitorInfo API
-BOOL (WINAPI *getMonitorInfo)(HMONITOR hMonitor, LPMONITORINFO lpmi)
-  = initializeGetMonitorInfo;
-
-
-// enumalte EnumDisplayMonitors API
-static BOOL WINAPI emulateEnumDisplayMonitors(
-  HDC hdc, LPRECT lprcClip, MONITORENUMPROC lpfnEnum, LPARAM dwData)
-{
-  lpfnEnum(reinterpret_cast<HMONITOR>(1), hdc, lprcClip, dwData);
-  return TRUE;
-}
-
-// initialize EnumDisplayMonitors API
-static BOOL WINAPI initializeEnumDisplayMonitors(
-  HDC hdc, LPRECT lprcClip, MONITORENUMPROC lpfnEnum, LPARAM dwData)
-{
-  HMODULE hModule = GetModuleHandle(_T("user32.dll"));
-  if (!hModule)
-    return FALSE;
-
-  FARPROC proc = GetProcAddress(hModule, "EnumDisplayMonitors");
-  if(proc)
-    enumDisplayMonitors =
-      reinterpret_cast<BOOL (WINAPI *)(HDC, LPRECT, MONITORENUMPROC, LPARAM)>
-      (proc);
-  else
-    enumDisplayMonitors = emulateEnumDisplayMonitors;
-
-  return enumDisplayMonitors(hdc, lprcClip, lpfnEnum, dwData);
-}
-
-// EnumDisplayMonitors API
-BOOL (WINAPI *enumDisplayMonitors)
-    (HDC hdc, LPRECT lprcClip, MONITORENUMPROC lpfnEnum, LPARAM dwData)
-  = initializeEnumDisplayMonitors;
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Windows2000/XP specific API
-
-
-static BOOL WINAPI
-initializeWTSRegisterSessionNotification(HWND hWnd, DWORD dwFlags)
-{
-  LoadLibrary(_T("wtsapi32.dll"));
-  HMODULE hModule = GetModuleHandle(_T("wtsapi32.dll"));
-  if (!hModule) {
-    return FALSE;
-  }
-  WTSRegisterSessionNotification_t proc = 
-    reinterpret_cast<WTSRegisterSessionNotification_t>(
-      GetProcAddress(hModule, "WTSRegisterSessionNotification"));
-  if (proc) {
-    wtsRegisterSessionNotification = proc;
-    return wtsRegisterSessionNotification(hWnd, dwFlags);
-  } else {
-    return 0;
-  }
-}
-
-// WTSRegisterSessionNotification API
-WTSRegisterSessionNotification_t wtsRegisterSessionNotification
-  = initializeWTSRegisterSessionNotification;
-
-
-static BOOL WINAPI initializeWTSUnRegisterSessionNotification(HWND hWnd)
-{
-  HMODULE hModule = GetModuleHandle(_T("wtsapi32.dll"));
-  if (!hModule) {
-    return FALSE;
-  }
-  WTSUnRegisterSessionNotification_t proc = 
-    reinterpret_cast<WTSUnRegisterSessionNotification_t>(
-      GetProcAddress(hModule, "WTSUnRegisterSessionNotification"));
-  if (proc) {
-    wtsUnRegisterSessionNotification = proc;
-    return wtsUnRegisterSessionNotification(hWnd);
-  } else {
-    return 0;
-  }
-}
-
-// WTSUnRegisterSessionNotification API
-WTSUnRegisterSessionNotification_t wtsUnRegisterSessionNotification
-  = initializeWTSUnRegisterSessionNotification;
-
-
-static DWORD WINAPI initializeWTSGetActiveConsoleSessionId(void)
-{
-  HMODULE hModule = GetModuleHandle(_T("kernel32.dll"));
-  if (!hModule) {
-    return FALSE;
-  }
-  WTSGetActiveConsoleSessionId_t proc = 
-    reinterpret_cast<WTSGetActiveConsoleSessionId_t>(
-      GetProcAddress(hModule, "WTSGetActiveConsoleSessionId"));
-  if (proc) {
-    wtsGetActiveConsoleSessionId = proc;
-    return wtsGetActiveConsoleSessionId();
-  } else {
-    return 0;
-  }
-}
-
-// WTSGetActiveConsoleSessionId API
-WTSGetActiveConsoleSessionId_t wtsGetActiveConsoleSessionId
-  = initializeWTSGetActiveConsoleSessionId;
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Utility
-
-// PathRemoveFileSpec()
-tstring pathRemoveFileSpec(const tstring &i_path)
-{
-  const _TCHAR *str = i_path.c_str();
-  const _TCHAR *b = _tcsrchr(str, _T('\\'));
-  const _TCHAR *s = _tcsrchr(str, _T('/'));
-  if (b && s)
-    return tstring(str, MIN(b, s));
-  if (b)
-    return tstring(str, b);
-  if (s)
-    return tstring(str, s);
-  if (const _TCHAR *c = _tcsrchr(str, _T(':')))
-    return tstring(str, c + 1);
-  return i_path;
-}
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// windowstool.cpp\r
+\r
+\r
+#include "misc.h"\r
+\r
+#include "windowstool.h"\r
+#include "array.h"\r
+\r
+#include <windowsx.h>\r
+#include <malloc.h>\r
+#include <shlwapi.h>\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Global variables\r
+\r
+\r
+// instance handle of this application\r
+HINSTANCE g_hInst = NULL;\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Functions\r
+\r
+\r
+// load resource string\r
+tstring loadString(UINT i_id)\r
+{\r
+  _TCHAR buf[1024];\r
+  if (LoadString(g_hInst, i_id, buf, NUMBER_OF(buf)))\r
+    return tstring(buf);\r
+  else\r
+    return _T("");\r
+}\r
+\r
+\r
+// load small icon resource\r
+HICON loadSmallIcon(UINT i_id)\r
+{\r
+  return reinterpret_cast<HICON>(\r
+    LoadImage(g_hInst, MAKEINTRESOURCE(i_id), IMAGE_ICON, 16, 16, 0));\r
+}\r
+\r
+\r
+// load big icon resource\r
+HICON loadBigIcon(UINT i_id)\r
+{\r
+  return reinterpret_cast<HICON>(\r
+    LoadImage(g_hInst, MAKEINTRESOURCE(i_id), IMAGE_ICON, 32, 32, 0));\r
+}\r
+\r
+\r
+// set small icon to the specified window.\r
+// @return handle of previous icon or NULL\r
+HICON setSmallIcon(HWND i_hwnd, UINT i_id)\r
+{\r
+  HICON hicon = (i_id == static_cast<UINT>(-1)) ? NULL : loadSmallIcon(i_id);\r
+  return reinterpret_cast<HICON>(\r
+    SendMessage(i_hwnd, WM_SETICON, static_cast<WPARAM>(ICON_SMALL),\r
+               reinterpret_cast<LPARAM>(hicon)));\r
+}\r
+\r
+\r
+// set big icon to the specified window.\r
+// @return handle of previous icon or NULL\r
+HICON setBigIcon(HWND i_hwnd, UINT i_id)\r
+{\r
+  HICON hicon = (i_id == static_cast<UINT>(-1)) ? NULL : loadBigIcon(i_id);\r
+  return reinterpret_cast<HICON>(\r
+    SendMessage(i_hwnd, WM_SETICON, static_cast<WPARAM>(ICON_BIG),\r
+               reinterpret_cast<LPARAM>(hicon)));\r
+}\r
+\r
+\r
+// remove icon from a window that is set by setSmallIcon\r
+void unsetSmallIcon(HWND i_hwnd)\r
+{\r
+  HICON hicon = setSmallIcon(i_hwnd, -1);\r
+  if (hicon)\r
+    CHECK_TRUE( DestroyIcon(hicon) );\r
+}\r
+\r
+\r
+// remove icon from a window that is set by setBigIcon\r
+void unsetBigIcon(HWND i_hwnd)\r
+{\r
+  HICON hicon = setBigIcon(i_hwnd, -1);\r
+  if (hicon)\r
+    CHECK_TRUE( DestroyIcon(hicon) );\r
+}\r
+\r
+\r
+// resize the window (it does not move the window)\r
+bool resizeWindow(HWND i_hwnd, int i_w, int i_h, bool i_doRepaint)\r
+{\r
+  UINT flag = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER;\r
+  if (!i_doRepaint)\r
+    flag |= SWP_NOREDRAW;\r
+  return !!SetWindowPos(i_hwnd, NULL, 0, 0, i_w, i_h, flag);\r
+}\r
+\r
+\r
+// get rect of the window in client coordinates\r
+// @return rect of the window in client coordinates\r
+bool getChildWindowRect(HWND i_hwnd, RECT *o_rc)\r
+{\r
+  if (!GetWindowRect(i_hwnd, o_rc))\r
+    return false;\r
+  POINT p = { o_rc->left, o_rc->top };\r
+  HWND phwnd = GetParent(i_hwnd);\r
+  if (!phwnd)\r
+    return false;\r
+  if (!ScreenToClient(phwnd, &p))\r
+    return false;\r
+  o_rc->left = p.x;\r
+  o_rc->top = p.y;\r
+  p.x = o_rc->right;\r
+  p.y = o_rc->bottom;\r
+  ScreenToClient(phwnd, &p);\r
+  o_rc->right = p.x;\r
+  o_rc->bottom = p.y;\r
+  return true;\r
+}\r
+\r
+\r
+// get toplevel (non-child) window\r
+HWND getToplevelWindow(HWND i_hwnd, bool *io_isMDI)\r
+{\r
+  while (i_hwnd)\r
+  {\r
+#ifdef MAYU64\r
+    LONG_PTR style = GetWindowLongPtr(i_hwnd, GWL_STYLE);\r
+#else\r
+    LONG style = GetWindowLong(i_hwnd, GWL_STYLE);\r
+#endif\r
+    if ((style & WS_CHILD) == 0)\r
+      break;\r
+    if (io_isMDI && *io_isMDI)\r
+    {\r
+#ifdef MAYU64\r
+      LONG_PTR exStyle = GetWindowLongPtr(i_hwnd, GWL_EXSTYLE);\r
+#else\r
+      LONG exStyle = GetWindowLong(i_hwnd, GWL_EXSTYLE);\r
+#endif\r
+      if (exStyle & WS_EX_MDICHILD)\r
+       return i_hwnd;\r
+    }\r
+    i_hwnd = GetParent(i_hwnd);\r
+  }\r
+  if (io_isMDI)\r
+    *io_isMDI = false;\r
+  return i_hwnd;\r
+}\r
+\r
+\r
+// move window asynchronously\r
+void asyncMoveWindow(HWND i_hwnd, int i_x, int i_y)\r
+{\r
+  SetWindowPos(i_hwnd, NULL, i_x, i_y, 0, 0,\r
+              SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE | SWP_NOOWNERZORDER |\r
+              SWP_NOSIZE | SWP_NOZORDER);\r
+}\r
+\r
+\r
+// move window asynchronously\r
+void asyncMoveWindow(HWND i_hwnd, int i_x, int i_y, int i_w, int i_h)\r
+{\r
+  SetWindowPos(i_hwnd, NULL, i_x, i_y, i_w, i_h,\r
+              SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE | SWP_NOOWNERZORDER |\r
+              SWP_NOZORDER);\r
+}\r
+\r
+\r
+// resize asynchronously\r
+void asyncResize(HWND i_hwnd, int i_w, int i_h)\r
+{\r
+  SetWindowPos(i_hwnd, NULL, 0, 0, i_w, i_h,\r
+              SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE | SWP_NOOWNERZORDER |\r
+              SWP_NOMOVE | SWP_NOZORDER);\r
+}\r
+\r
+\r
+// get dll version\r
+DWORD getDllVersion(const _TCHAR *i_dllname)\r
+{\r
+  DWORD dwVersion = 0;\r
+  \r
+  if (HINSTANCE hinstDll = LoadLibrary(i_dllname))\r
+  {\r
+    DLLGETVERSIONPROC pDllGetVersion\r
+      = (DLLGETVERSIONPROC)GetProcAddress(hinstDll, "DllGetVersion");\r
+    /* Because some DLLs may not implement this function, you\r
+     * must test for it explicitly. Depending on the particular \r
+     * DLL, the lack of a DllGetVersion function may\r
+     * be a useful indicator of the version.\r
+     */\r
+    if (pDllGetVersion)\r
+    {\r
+      DLLVERSIONINFO dvi;\r
+      ZeroMemory(&dvi, sizeof(dvi));\r
+      dvi.cbSize = sizeof(dvi);\r
+\r
+      HRESULT hr = (*pDllGetVersion)(&dvi);\r
+      if (SUCCEEDED(hr))\r
+       dwVersion = PACKVERSION(dvi.dwMajorVersion, dvi.dwMinorVersion);\r
+    }\r
+        \r
+    FreeLibrary(hinstDll);\r
+  }\r
+  return dwVersion;\r
+}\r
+\r
+\r
+// workaround of SetForegroundWindow\r
+bool setForegroundWindow(HWND i_hwnd)\r
+{\r
+  int nForegroundID = GetWindowThreadProcessId(GetForegroundWindow(), NULL);\r
+  int nTargetID = GetWindowThreadProcessId(i_hwnd, NULL);\r
+  \r
+  //if (!AttachThreadInput(nTargetID, nForegroundID, TRUE))\r
+  //return false;\r
+  AttachThreadInput(nTargetID, nForegroundID, TRUE);\r
+\r
+  DWORD sp_time;\r
+  SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, &sp_time, 0);\r
+  SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (void *)0, 0);\r
+\r
+  SetForegroundWindow(i_hwnd);\r
+\r
+  SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (void *)sp_time, 0);\r
+  \r
+  AttachThreadInput(nTargetID, nForegroundID, FALSE);\r
+  return true;\r
+}\r
+\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// edit control\r
+\r
+\r
+// get edit control's text size\r
+// @return bytes of text\r
+size_t editGetTextBytes(HWND i_hwnd)\r
+{\r
+  return Edit_GetTextLength(i_hwnd);\r
+}\r
+\r
+\r
+// delete a line\r
+void editDeleteLine(HWND i_hwnd, size_t i_n)\r
+{\r
+  int len = Edit_LineLength(i_hwnd, i_n);\r
+  if (len < 0)\r
+    return;\r
+  len += 2;\r
+  int index = Edit_LineIndex(i_hwnd, i_n);\r
+  Edit_SetSel(i_hwnd, index, index + len);\r
+  Edit_ReplaceSel(i_hwnd, _T(""));\r
+}\r
+  \r
+\r
+// insert text at last\r
+void editInsertTextAtLast(HWND i_hwnd, const tstring &i_text,\r
+                         size_t i_threshold)\r
+{\r
+  if (i_text.empty())\r
+    return;\r
+  \r
+  size_t len = editGetTextBytes(i_hwnd);\r
+  \r
+  if (i_threshold < len)\r
+  {\r
+    Edit_SetSel(i_hwnd, 0, len / 3 * 2);\r
+    Edit_ReplaceSel(i_hwnd, _T(""));\r
+    editDeleteLine(i_hwnd, 0);\r
+    len = editGetTextBytes(i_hwnd);\r
+  }\r
+  \r
+  Edit_SetSel(i_hwnd, len, len);\r
+  \r
+  // \n -> \r\n\r
+  Array<_TCHAR> buf(i_text.size() * 2 + 1);\r
+  _TCHAR *d = buf.get();\r
+  const _TCHAR *str = i_text.c_str();\r
+  for (const _TCHAR *s = str; s < str + i_text.size(); ++ s)\r
+  {\r
+    if (*s == _T('\n'))\r
+      *d++ = _T('\r');\r
+    *d++ = *s;\r
+  }\r
+  *d = _T('\0');\r
+  \r
+  Edit_ReplaceSel(i_hwnd, buf.get());\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Windows2000/XP specific API\r
+\r
+\r
+// initialize layerd window\r
+static BOOL WINAPI initalizeLayerdWindow(\r
+  HWND i_hwnd, COLORREF i_crKey, BYTE i_bAlpha, DWORD i_dwFlags)\r
+{\r
+  HMODULE hModule = GetModuleHandle(_T("user32.dll"));\r
+  if (!hModule) {\r
+    return FALSE;\r
+  }\r
+  SetLayeredWindowAttributes_t proc = \r
+    reinterpret_cast<SetLayeredWindowAttributes_t>(\r
+      GetProcAddress(hModule, "SetLayeredWindowAttributes"));\r
+  if (setLayeredWindowAttributes) {\r
+    setLayeredWindowAttributes = proc;\r
+    return setLayeredWindowAttributes(i_hwnd, i_crKey, i_bAlpha, i_dwFlags);\r
+  } else {\r
+    return FALSE;\r
+  }\r
+}\r
+\r
+\r
+// SetLayeredWindowAttributes API\r
+SetLayeredWindowAttributes_t setLayeredWindowAttributes\r
+  = initalizeLayerdWindow;\r
+\r
+\r
+// emulate MonitorFromWindow API\r
+static HMONITOR WINAPI emulateMonitorFromWindow(HWND hwnd, DWORD dwFlags)\r
+{\r
+  return reinterpret_cast<HMONITOR>(1); // dummy HMONITOR\r
+}\r
+\r
+// initialize MonitorFromWindow API\r
+static HMONITOR WINAPI initializeMonitorFromWindow(HWND hwnd, DWORD dwFlags)\r
+{\r
+  HMODULE hModule = GetModuleHandle(_T("user32.dll"));\r
+  if (!hModule)\r
+    return FALSE;\r
+\r
+  FARPROC proc = GetProcAddress(hModule, "MonitorFromWindow");\r
+  if(proc)\r
+    monitorFromWindow =\r
+      reinterpret_cast<HMONITOR (WINAPI *)(HWND, DWORD)>(proc);\r
+  else\r
+    monitorFromWindow = emulateMonitorFromWindow;\r
+\r
+  return monitorFromWindow(hwnd, dwFlags);\r
+}\r
+\r
+// MonitorFromWindow API\r
+HMONITOR (WINAPI *monitorFromWindow)(HWND hwnd, DWORD dwFlags)\r
+    = initializeMonitorFromWindow;\r
+\r
+\r
+// emulate GetMonitorInfo API\r
+static BOOL WINAPI emulateGetMonitorInfo(HMONITOR hMonitor, LPMONITORINFO lpmi)\r
+{\r
+  if(lpmi->cbSize != sizeof(MONITORINFO))\r
+    return FALSE;\r
+\r
+  lpmi->rcMonitor.left = 0;\r
+  lpmi->rcMonitor.top = 0;\r
+  lpmi->rcMonitor.right = GetSystemMetrics(SM_CXFULLSCREEN);\r
+  lpmi->rcMonitor.bottom = GetSystemMetrics(SM_CYFULLSCREEN);\r
+  SystemParametersInfo(SPI_GETWORKAREA, 0,\r
+                       reinterpret_cast<PVOID>(&lpmi->rcWork), FALSE);\r
+  lpmi->dwFlags = MONITORINFOF_PRIMARY;\r
+\r
+  return TRUE;\r
+}\r
+\r
+// initialize GetMonitorInfo API\r
+static\r
+BOOL WINAPI initializeGetMonitorInfo(HMONITOR hMonitor, LPMONITORINFO lpmi)\r
+{\r
+  HMODULE hModule = GetModuleHandle(_T("user32.dll"));\r
+  if (!hModule)\r
+    return FALSE;\r
+\r
+  FARPROC proc = GetProcAddress(hModule, "GetMonitorInfoA");\r
+  if(proc)\r
+    getMonitorInfo =\r
+      reinterpret_cast<BOOL (WINAPI *)(HMONITOR, LPMONITORINFO)>(proc);\r
+  else\r
+    getMonitorInfo = emulateGetMonitorInfo;\r
+\r
+  return getMonitorInfo(hMonitor, lpmi);\r
+}\r
+\r
+// GetMonitorInfo API\r
+BOOL (WINAPI *getMonitorInfo)(HMONITOR hMonitor, LPMONITORINFO lpmi)\r
+  = initializeGetMonitorInfo;\r
+\r
+\r
+// enumalte EnumDisplayMonitors API\r
+static BOOL WINAPI emulateEnumDisplayMonitors(\r
+  HDC hdc, LPRECT lprcClip, MONITORENUMPROC lpfnEnum, LPARAM dwData)\r
+{\r
+  lpfnEnum(reinterpret_cast<HMONITOR>(1), hdc, lprcClip, dwData);\r
+  return TRUE;\r
+}\r
+\r
+// initialize EnumDisplayMonitors API\r
+static BOOL WINAPI initializeEnumDisplayMonitors(\r
+  HDC hdc, LPRECT lprcClip, MONITORENUMPROC lpfnEnum, LPARAM dwData)\r
+{\r
+  HMODULE hModule = GetModuleHandle(_T("user32.dll"));\r
+  if (!hModule)\r
+    return FALSE;\r
+\r
+  FARPROC proc = GetProcAddress(hModule, "EnumDisplayMonitors");\r
+  if(proc)\r
+    enumDisplayMonitors =\r
+      reinterpret_cast<BOOL (WINAPI *)(HDC, LPRECT, MONITORENUMPROC, LPARAM)>\r
+      (proc);\r
+  else\r
+    enumDisplayMonitors = emulateEnumDisplayMonitors;\r
+\r
+  return enumDisplayMonitors(hdc, lprcClip, lpfnEnum, dwData);\r
+}\r
+\r
+// EnumDisplayMonitors API\r
+BOOL (WINAPI *enumDisplayMonitors)\r
+    (HDC hdc, LPRECT lprcClip, MONITORENUMPROC lpfnEnum, LPARAM dwData)\r
+  = initializeEnumDisplayMonitors;\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Windows2000/XP specific API\r
+\r
+\r
+static BOOL WINAPI\r
+initializeWTSRegisterSessionNotification(HWND hWnd, DWORD dwFlags)\r
+{\r
+  LoadLibrary(_T("wtsapi32.dll"));\r
+  HMODULE hModule = GetModuleHandle(_T("wtsapi32.dll"));\r
+  if (!hModule) {\r
+    return FALSE;\r
+  }\r
+  WTSRegisterSessionNotification_t proc = \r
+    reinterpret_cast<WTSRegisterSessionNotification_t>(\r
+      GetProcAddress(hModule, "WTSRegisterSessionNotification"));\r
+  if (proc) {\r
+    wtsRegisterSessionNotification = proc;\r
+    return wtsRegisterSessionNotification(hWnd, dwFlags);\r
+  } else {\r
+    return 0;\r
+  }\r
+}\r
+\r
+// WTSRegisterSessionNotification API\r
+WTSRegisterSessionNotification_t wtsRegisterSessionNotification\r
+  = initializeWTSRegisterSessionNotification;\r
+\r
+\r
+static BOOL WINAPI initializeWTSUnRegisterSessionNotification(HWND hWnd)\r
+{\r
+  HMODULE hModule = GetModuleHandle(_T("wtsapi32.dll"));\r
+  if (!hModule) {\r
+    return FALSE;\r
+  }\r
+  WTSUnRegisterSessionNotification_t proc = \r
+    reinterpret_cast<WTSUnRegisterSessionNotification_t>(\r
+      GetProcAddress(hModule, "WTSUnRegisterSessionNotification"));\r
+  if (proc) {\r
+    wtsUnRegisterSessionNotification = proc;\r
+    return wtsUnRegisterSessionNotification(hWnd);\r
+  } else {\r
+    return 0;\r
+  }\r
+}\r
+\r
+// WTSUnRegisterSessionNotification API\r
+WTSUnRegisterSessionNotification_t wtsUnRegisterSessionNotification\r
+  = initializeWTSUnRegisterSessionNotification;\r
+\r
+\r
+static DWORD WINAPI initializeWTSGetActiveConsoleSessionId(void)\r
+{\r
+  HMODULE hModule = GetModuleHandle(_T("kernel32.dll"));\r
+  if (!hModule) {\r
+    return FALSE;\r
+  }\r
+  WTSGetActiveConsoleSessionId_t proc = \r
+    reinterpret_cast<WTSGetActiveConsoleSessionId_t>(\r
+      GetProcAddress(hModule, "WTSGetActiveConsoleSessionId"));\r
+  if (proc) {\r
+    wtsGetActiveConsoleSessionId = proc;\r
+    return wtsGetActiveConsoleSessionId();\r
+  } else {\r
+    return 0;\r
+  }\r
+}\r
+\r
+// WTSGetActiveConsoleSessionId API\r
+WTSGetActiveConsoleSessionId_t wtsGetActiveConsoleSessionId\r
+  = initializeWTSGetActiveConsoleSessionId;\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Utility\r
+\r
+// PathRemoveFileSpec()\r
+tstring pathRemoveFileSpec(const tstring &i_path)\r
+{\r
+  const _TCHAR *str = i_path.c_str();\r
+  const _TCHAR *b = _tcsrchr(str, _T('\\'));\r
+  const _TCHAR *s = _tcsrchr(str, _T('/'));\r
+  if (b && s)\r
+    return tstring(str, MIN(b, s));\r
+  if (b)\r
+    return tstring(str, b);\r
+  if (s)\r
+    return tstring(str, s);\r
+  if (const _TCHAR *c = _tcsrchr(str, _T(':')))\r
+    return tstring(str, c + 1);\r
+  return i_path;\r
+}\r
index bb06975..c8c662b 100644 (file)
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// windowstool.h
-
-
-#ifndef _WINDOWSTOOL_H
-#  define _WINDOWSTOOL_H
-
-
-#  include "stringtool.h"
-#  include <windows.h>
-
-
-/// instance handle of this application
-extern HINSTANCE g_hInst;
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// resource
-
-/// load resource string
-extern tstring loadString(UINT i_id);
-
-/// load small icon resource (it must be deleted by DestroyIcon())
-extern HICON loadSmallIcon(UINT i_id);
-
-///load big icon resource (it must be deleted by DestroyIcon())
-extern HICON loadBigIcon(UINT i_id);
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// window
-
-/// resize the window (it does not move the window)
-extern bool resizeWindow(HWND i_hwnd, int i_w, int i_h, bool i_doRepaint);
-
-/** get rect of the window in client coordinates.
-    @return rect of the window in client coordinates */
-extern bool getChildWindowRect(HWND i_hwnd, RECT *o_rc);
-
-/** set small icon to the specified window.
-    @return handle of previous icon or NULL */
-extern HICON setSmallIcon(HWND i_hwnd, UINT i_id);
-
-/** set big icon to the specified window.
-    @return handle of previous icon or NULL */
-extern HICON setBigIcon(HWND i_hwnd, UINT i_id);
-
-/// remove icon from a window that is set by setSmallIcon
-extern void unsetSmallIcon(HWND i_hwnd);
-
-/// remove icon from a window that is set by setBigIcon
-extern void unsetBigIcon(HWND i_hwnd);
-
-/// get toplevel (non-child) window
-extern HWND getToplevelWindow(HWND i_hwnd, bool *io_isMDI);
-
-/// move window asynchronously
-extern void asyncMoveWindow(HWND i_hwnd, int i_x, int i_y);
-
-/// move window asynchronously
-extern void asyncMoveWindow(HWND i_hwnd, int i_x, int i_y, int i_w, int i_h);
-
-/// resize asynchronously
-extern void asyncResize(HWND i_hwnd, int i_w, int i_h);
-
-/// get dll version
-extern DWORD getDllVersion(const _TCHAR *i_dllname);
-#define PACKVERSION(major, minor) MAKELONG(minor, major)
-
-// workaround of SetForegroundWindow
-extern bool setForegroundWindow(HWND i_hwnd);
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// dialog
-
-/// get/set GWL_USERDATA
-template <class T> inline T getUserData(HWND i_hwnd, T *i_wc)
-{
-#ifdef MAYU64
-  return (*i_wc = reinterpret_cast<T>(GetWindowLongPtr(i_hwnd, GWLP_USERDATA)));
-#else
-  return (*i_wc = reinterpret_cast<T>(GetWindowLong(i_hwnd, GWL_USERDATA)));
-#endif
-}
-
-///
-template <class T> inline T setUserData(HWND i_hwnd, T i_wc)
-{
-#ifdef MAYU64
-  SetWindowLongPtr(i_hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(i_wc));
-#else
-  SetWindowLong(i_hwnd, GWL_USERDATA, reinterpret_cast<long>(i_wc));
-#endif
-  return i_wc;
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// RECT
-
-///
-inline int rcWidth(const RECT *i_rc) { return i_rc->right - i_rc->left; }
-
-///
-inline int rcHeight(const RECT *i_rc) { return i_rc->bottom - i_rc->top; }
-
-///
-inline bool isRectInRect(const RECT *i_rcin, const RECT *i_rcout)
-{
-  return (i_rcout->left <= i_rcin->left &&
-         i_rcin->right <= i_rcout->right &&
-         i_rcout->top <= i_rcin->top &&
-         i_rcin->bottom <= i_rcout->bottom);
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// edit control
-
-/// returns bytes of text
-extern size_t editGetTextBytes(HWND i_hwnd);
-
-/// delete a line
-extern void editDeleteLine(HWND i_hwnd, size_t i_n);
-
-/// insert text at last
-extern void editInsertTextAtLast(HWND i_hwnd, const tstring &i_text,
-                                size_t i_threshold);
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Windows2000/XP specific API
-
-/// SetLayeredWindowAttributes API
-typedef BOOL (WINAPI *SetLayeredWindowAttributes_t)
-  (HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
-extern SetLayeredWindowAttributes_t setLayeredWindowAttributes;
-
-/// MonitorFromWindow API
-extern HMONITOR (WINAPI *monitorFromWindow)(HWND hwnd, DWORD dwFlags);
-
-/// GetMonitorInfo API
-extern BOOL (WINAPI *getMonitorInfo)(HMONITOR hMonitor, LPMONITORINFO lpmi);
-
-/// EnumDisplayMonitors API
-extern BOOL (WINAPI *enumDisplayMonitors)
-  (HDC hdc, LPRECT lprcClip, MONITORENUMPROC lpfnEnum, LPARAM dwData);
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// WindowsXP specific API
-
-/// WTSRegisterSessionNotification API
-typedef BOOL (WINAPI *WTSRegisterSessionNotification_t)
-  (HWND hWnd, DWORD dwFlags);
-extern WTSRegisterSessionNotification_t wtsRegisterSessionNotification;
-
-/// WTSUnRegisterSessionNotification API
-typedef BOOL (WINAPI *WTSUnRegisterSessionNotification_t)(HWND hWnd);
-extern WTSUnRegisterSessionNotification_t wtsUnRegisterSessionNotification;
-
-/// WTSGetActiveConsoleSessionId API
-typedef DWORD (WINAPI *WTSGetActiveConsoleSessionId_t)(void);
-extern WTSGetActiveConsoleSessionId_t wtsGetActiveConsoleSessionId;
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Utility
-
-// PathRemoveFileSpec()
-tstring pathRemoveFileSpec(const tstring &i_path);
-
-
-#endif // _WINDOWSTOOL_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// windowstool.h\r
+\r
+\r
+#ifndef _WINDOWSTOOL_H\r
+#  define _WINDOWSTOOL_H\r
+\r
+\r
+#  include "stringtool.h"\r
+#  include <windows.h>\r
+\r
+\r
+/// instance handle of this application\r
+extern HINSTANCE g_hInst;\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// resource\r
+\r
+/// load resource string\r
+extern tstring loadString(UINT i_id);\r
+\r
+/// load small icon resource (it must be deleted by DestroyIcon())\r
+extern HICON loadSmallIcon(UINT i_id);\r
+\r
+///load big icon resource (it must be deleted by DestroyIcon())\r
+extern HICON loadBigIcon(UINT i_id);\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// window\r
+\r
+/// resize the window (it does not move the window)\r
+extern bool resizeWindow(HWND i_hwnd, int i_w, int i_h, bool i_doRepaint);\r
+\r
+/** get rect of the window in client coordinates.\r
+    @return rect of the window in client coordinates */\r
+extern bool getChildWindowRect(HWND i_hwnd, RECT *o_rc);\r
+\r
+/** set small icon to the specified window.\r
+    @return handle of previous icon or NULL */\r
+extern HICON setSmallIcon(HWND i_hwnd, UINT i_id);\r
+\r
+/** set big icon to the specified window.\r
+    @return handle of previous icon or NULL */\r
+extern HICON setBigIcon(HWND i_hwnd, UINT i_id);\r
+\r
+/// remove icon from a window that is set by setSmallIcon\r
+extern void unsetSmallIcon(HWND i_hwnd);\r
+\r
+/// remove icon from a window that is set by setBigIcon\r
+extern void unsetBigIcon(HWND i_hwnd);\r
+\r
+/// get toplevel (non-child) window\r
+extern HWND getToplevelWindow(HWND i_hwnd, bool *io_isMDI);\r
+\r
+/// move window asynchronously\r
+extern void asyncMoveWindow(HWND i_hwnd, int i_x, int i_y);\r
+\r
+/// move window asynchronously\r
+extern void asyncMoveWindow(HWND i_hwnd, int i_x, int i_y, int i_w, int i_h);\r
+\r
+/// resize asynchronously\r
+extern void asyncResize(HWND i_hwnd, int i_w, int i_h);\r
+\r
+/// get dll version\r
+extern DWORD getDllVersion(const _TCHAR *i_dllname);\r
+#define PACKVERSION(major, minor) MAKELONG(minor, major)\r
+\r
+// workaround of SetForegroundWindow\r
+extern bool setForegroundWindow(HWND i_hwnd);\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// dialog\r
+\r
+/// get/set GWL_USERDATA\r
+template <class T> inline T getUserData(HWND i_hwnd, T *i_wc)\r
+{\r
+#ifdef MAYU64\r
+  return (*i_wc = reinterpret_cast<T>(GetWindowLongPtr(i_hwnd, GWLP_USERDATA)));\r
+#else\r
+  return (*i_wc = reinterpret_cast<T>(GetWindowLong(i_hwnd, GWL_USERDATA)));\r
+#endif\r
+}\r
+\r
+///\r
+template <class T> inline T setUserData(HWND i_hwnd, T i_wc)\r
+{\r
+#ifdef MAYU64\r
+  SetWindowLongPtr(i_hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(i_wc));\r
+#else\r
+  SetWindowLong(i_hwnd, GWL_USERDATA, reinterpret_cast<long>(i_wc));\r
+#endif\r
+  return i_wc;\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// RECT\r
+\r
+///\r
+inline int rcWidth(const RECT *i_rc) { return i_rc->right - i_rc->left; }\r
+\r
+///\r
+inline int rcHeight(const RECT *i_rc) { return i_rc->bottom - i_rc->top; }\r
+\r
+///\r
+inline bool isRectInRect(const RECT *i_rcin, const RECT *i_rcout)\r
+{\r
+  return (i_rcout->left <= i_rcin->left &&\r
+         i_rcin->right <= i_rcout->right &&\r
+         i_rcout->top <= i_rcin->top &&\r
+         i_rcin->bottom <= i_rcout->bottom);\r
+}\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// edit control\r
+\r
+/// returns bytes of text\r
+extern size_t editGetTextBytes(HWND i_hwnd);\r
+\r
+/// delete a line\r
+extern void editDeleteLine(HWND i_hwnd, size_t i_n);\r
+\r
+/// insert text at last\r
+extern void editInsertTextAtLast(HWND i_hwnd, const tstring &i_text,\r
+                                size_t i_threshold);\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Windows2000/XP specific API\r
+\r
+/// SetLayeredWindowAttributes API\r
+typedef BOOL (WINAPI *SetLayeredWindowAttributes_t)\r
+  (HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);\r
+extern SetLayeredWindowAttributes_t setLayeredWindowAttributes;\r
+\r
+/// MonitorFromWindow API\r
+extern HMONITOR (WINAPI *monitorFromWindow)(HWND hwnd, DWORD dwFlags);\r
+\r
+/// GetMonitorInfo API\r
+extern BOOL (WINAPI *getMonitorInfo)(HMONITOR hMonitor, LPMONITORINFO lpmi);\r
+\r
+/// EnumDisplayMonitors API\r
+extern BOOL (WINAPI *enumDisplayMonitors)\r
+  (HDC hdc, LPRECT lprcClip, MONITORENUMPROC lpfnEnum, LPARAM dwData);\r
+\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// WindowsXP specific API\r
+\r
+/// WTSRegisterSessionNotification API\r
+typedef BOOL (WINAPI *WTSRegisterSessionNotification_t)\r
+  (HWND hWnd, DWORD dwFlags);\r
+extern WTSRegisterSessionNotification_t wtsRegisterSessionNotification;\r
+\r
+/// WTSUnRegisterSessionNotification API\r
+typedef BOOL (WINAPI *WTSUnRegisterSessionNotification_t)(HWND hWnd);\r
+extern WTSUnRegisterSessionNotification_t wtsUnRegisterSessionNotification;\r
+\r
+/// WTSGetActiveConsoleSessionId API\r
+typedef DWORD (WINAPI *WTSGetActiveConsoleSessionId_t)(void);\r
+extern WTSGetActiveConsoleSessionId_t wtsGetActiveConsoleSessionId;\r
+\r
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// Utility\r
+\r
+// PathRemoveFileSpec()\r
+tstring pathRemoveFileSpec(const tstring &i_path);\r
+\r
+\r
+#endif // _WINDOWSTOOL_H\r
index 51d49fe..be64fc9 100755 (executable)
--- a/yamy.cpp
+++ b/yamy.cpp
@@ -1,60 +1,60 @@
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// yamy.cpp
-
-#include <windows.h>
-#include <tchar.h>
-#include "mayurc.h"
-
-/// main
-int WINAPI _tWinMain(HINSTANCE i_hInstance, HINSTANCE /* i_hPrevInstance */,
-                    LPTSTR /* i_lpszCmdLine */, int /* i_nCmdShow */)
-{
-  typedef BOOL (WINAPI* ISWOW64PROCESS)(HANDLE hProcess, PBOOL Wow64Process);
-  BOOL isWow64;
-  ISWOW64PROCESS pIsWow64Process;
-  STARTUPINFO si;
-  PROCESS_INFORMATION pi;
-  BOOL result;
-  TCHAR *yamyPath = _T("yamy32");
-
-  pIsWow64Process =
-    (ISWOW64PROCESS)::GetProcAddress(::GetModuleHandle(_T("kernel32.dll")),
-                                    "IsWow64Process");
-  ZeroMemory(&pi,sizeof(pi));
-  ZeroMemory(&si,sizeof(si));
-  si.cb=sizeof(si);
-
-  if (pIsWow64Process)
-  {
-    result = pIsWow64Process(::GetCurrentProcess(), &isWow64);
-    if (result != FALSE && isWow64 == TRUE)
-    {
-      yamyPath = _T("yamy64");
-    }
-  }
-
-  result = CreateProcess(yamyPath, yamyPath, NULL, NULL, FALSE,
-                        NORMAL_PRIORITY_CLASS, 0, NULL, &si, &pi);
-
-  if (result == FALSE)
-  {
-    TCHAR buf[1024];
-    TCHAR text[1024];
-    TCHAR title[1024];
-
-    LoadString(i_hInstance, IDS_cannotInvoke,
-              text, sizeof(text)/sizeof(text[0]));
-    LoadString(i_hInstance, IDS_mayu,
-              title, sizeof(title)/sizeof(title[0]));
-    _stprintf_s(buf, sizeof(buf)/sizeof(buf[0]),
-               text, yamyPath, GetLastError());
-    MessageBox((HWND)NULL, buf, title, MB_OK | MB_ICONSTOP);
-  }
-  else
-  {
-    CloseHandle(pi.hThread);
-    CloseHandle(pi.hProcess);
-  }
-
-  return 0;
-}
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// yamy.cpp\r
+\r
+#include <windows.h>\r
+#include <tchar.h>\r
+#include "mayurc.h"\r
+\r
+/// main\r
+int WINAPI _tWinMain(HINSTANCE i_hInstance, HINSTANCE /* i_hPrevInstance */,\r
+                    LPTSTR /* i_lpszCmdLine */, int /* i_nCmdShow */)\r
+{\r
+  typedef BOOL (WINAPI* ISWOW64PROCESS)(HANDLE hProcess, PBOOL Wow64Process);\r
+  BOOL isWow64;\r
+  ISWOW64PROCESS pIsWow64Process;\r
+  STARTUPINFO si;\r
+  PROCESS_INFORMATION pi;\r
+  BOOL result;\r
+  TCHAR *yamyPath = _T("yamy32");\r
+\r
+  pIsWow64Process =\r
+    (ISWOW64PROCESS)::GetProcAddress(::GetModuleHandle(_T("kernel32.dll")),\r
+                                    "IsWow64Process");\r
+  ZeroMemory(&pi,sizeof(pi));\r
+  ZeroMemory(&si,sizeof(si));\r
+  si.cb=sizeof(si);\r
+\r
+  if (pIsWow64Process)\r
+  {\r
+    result = pIsWow64Process(::GetCurrentProcess(), &isWow64);\r
+    if (result != FALSE && isWow64 == TRUE)\r
+    {\r
+      yamyPath = _T("yamy64");\r
+    }\r
+  }\r
+\r
+  result = CreateProcess(yamyPath, yamyPath, NULL, NULL, FALSE,\r
+                        NORMAL_PRIORITY_CLASS, 0, NULL, &si, &pi);\r
+\r
+  if (result == FALSE)\r
+  {\r
+    TCHAR buf[1024];\r
+    TCHAR text[1024];\r
+    TCHAR title[1024];\r
+\r
+    LoadString(i_hInstance, IDS_cannotInvoke,\r
+              text, sizeof(text)/sizeof(text[0]));\r
+    LoadString(i_hInstance, IDS_mayu,\r
+              title, sizeof(title)/sizeof(title[0]));\r
+    _stprintf_s(buf, sizeof(buf)/sizeof(buf[0]),\r
+               text, yamyPath, GetLastError());\r
+    MessageBox((HWND)NULL, buf, title, MB_OK | MB_ICONSTOP);\r
+  }\r
+  else\r
+  {\r
+    CloseHandle(pi.hThread);\r
+    CloseHandle(pi.hProcess);\r
+  }\r
+\r
+  return 0;\r
+}\r
index 547fad1..001ea41 100644 (file)
--- a/yamyd.cpp
+++ b/yamyd.cpp
@@ -1,25 +1,25 @@
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// yamyd.cpp
-
-#include "mayu.h"
-#include "hook.h"
-
-/// main
-int WINAPI _tWinMain(HINSTANCE /* i_hInstance */, HINSTANCE /* i_hPrevInstance */,
-                    LPTSTR /* i_lpszCmdLine */, int /* i_nCmdShow */)
-{
-  HANDLE mutex = OpenMutex(SYNCHRONIZE, FALSE, MUTEX_MAYU_EXCLUSIVE_RUNNING);
-  if (mutex != NULL)
-  {
-    CHECK_FALSE( installHooks(NULL, NULL) );
-
-    // wait for master process exit
-    WaitForSingleObject(mutex, INFINITE);
-    ReleaseMutex(mutex);
-
-    CHECK_FALSE( uninstallHooks() );
-    SendMessage(HWND_BROADCAST, WM_NULL, 0, 0);
-  }
-
-  return 0;
-}
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+// yamyd.cpp\r
+\r
+#include "mayu.h"\r
+#include "hook.h"\r
+\r
+/// main\r
+int WINAPI _tWinMain(HINSTANCE /* i_hInstance */, HINSTANCE /* i_hPrevInstance */,\r
+                    LPTSTR /* i_lpszCmdLine */, int /* i_nCmdShow */)\r
+{\r
+  HANDLE mutex = OpenMutex(SYNCHRONIZE, FALSE, MUTEX_MAYU_EXCLUSIVE_RUNNING);\r
+  if (mutex != NULL)\r
+  {\r
+    CHECK_FALSE( installHooks(NULL, NULL) );\r
+\r
+    // wait for master process exit\r
+    WaitForSingleObject(mutex, INFINITE);\r
+    ReleaseMutex(mutex);\r
+\r
+    CHECK_FALSE( uninstallHooks() );\r
+    SendMessage(HWND_BROADCAST, WM_NULL, 0, 0);\r
+  }\r
+\r
+  return 0;\r
+}\r