-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# 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
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \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
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \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\8ap \8a¿\8e\9a Kanji = 0x29 # \94¼\8ap/\91S\8ap \8a¿\8e\9a
-def key E0\94¼\8ap/\91S\8ap E0\8a¿\8e\9a E0Kanji = E0-0x29 # \94¼\8ap/\91S\8ap \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\83i \83\8d\81[\83}\8e\9a
-def key E0\82Ð\82ç\82ª\82È E0Hiragana = E0-0x70 # \82Ð\82ç\82ª\82È \83J\83^\83J\83i \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\8ap \8a¿\8e\9a Kanji = 0x29 # \94¼\8ap/\91S\8ap \8a¿\8e\9a\r
+def key E0\94¼\8ap/\91S\8ap E0\8a¿\8e\9a E0Kanji = E0-0x29 # \94¼\8ap/\91S\8ap \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\83i \83\8d\81[\83}\8e\9a\r
+def key E0\82Ð\82ç\82ª\82È E0Hiragana = E0-0x70 # \82Ð\82ç\82ª\82È \83J\83^\83J\83i \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
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \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
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \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
-#
-# 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
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \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
-#
-# 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
-#
-# 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
-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
-\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
-
-
- \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ê\93x
- 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ê\93x \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
-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
-///////////////////////////////////////////////////////////////////////////////
-// 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
-///////////////////////////////////////////////////////////////////////////////
-// 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, ¤tIrql);
- 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, ¤tIrql);
- // 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, ¤tIrql);
- // 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, ¤tIrql);
- devExt->irpq = NULL;
- KeReleaseSpinLock(&devExt->lock, currentIrql);
- IoReleaseCancelSpinLock(irp->CancelIrql);
- DEBUG_LOG(("detourReadCancel:"));
-#if 0
- KeAcquireSpinLock(&devExt->lock, ¤tIrql);
- 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, ¤tIrql);
- filterDevExt->irpq = NULL;
- KeReleaseSpinLock(&filterDevExt->lock, currentIrql);
- if (irp->PendingReturned) {
- status = STATUS_PENDING;
- IoMarkIrpPending(irp);
- } else {
- status = STATUS_SUCCESS;
- }
-
- KeAcquireSpinLock(&detourDevExt->lock, ¤tIrql);
- 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, ¤tIrql);
- 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, ¤tIrql);
- 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, ¤tIrql);
- 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, ¤tIrql);
- 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, ¤tIrql);
- 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, ¤tIrql);
- filterDevObj = detourDevExt->filterDevObj;
- KeReleaseSpinLock(&detourDevExt->lock, currentIrql);
- // enque filter que
- if (filterDevObj) {
- FilterDeviceExtension *filterDevExt =
- (FilterDeviceExtension*)filterDevObj->DeviceExtension;
- PDEVICE_OBJECT kbdClassDevObj;
-
- KeAcquireSpinLock(&filterDevExt->lock, ¤tIrql);
-
- 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, ¤tIrql);
- 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, ¤tIrql);
- 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, ¤tIrql);
- 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, ¤tIrql);
- 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, ¤tIrql);
- 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, ¤tIrql);
- 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, ¤tIrql);
- 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, ¤tIrql);
- 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, ¤tIrql);
- // 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, ¤tIrql);
- 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, ¤tIrql);
- // 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, ¤tIrql);
- // 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, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\r
+ devExt->irpq = NULL;\r
+ KeReleaseSpinLock(&devExt->lock, currentIrql);\r
+ IoReleaseCancelSpinLock(irp->CancelIrql);\r
+ DEBUG_LOG(("detourReadCancel:"));\r
+#if 0\r
+ KeAcquireSpinLock(&devExt->lock, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\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, ¤tIrql);\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
-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
-///////////////////////////////////////////////////////////////////////////////
-// 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
-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
-///////////////////////////////////////////////////////////////////////////////
-// 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
-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
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# \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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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, ¶m);
-
- 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, ¶m);\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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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->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 &WindowHMaximize, &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 &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 &OtherWindowClass
- <dd>currentKeymap becoms currentKeymaps[++ Current::i]
- <dt>when &KeymapParent
- <dd>currentKeymap becoms currentKeyamp->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 &KeymapPrevPrefix
- EmacsEditKillLine m_emacsEditKillLine; /// for &EmacsEditKillLine
- const ActionFunction *m_afShellExecute; /// for &ShellExecute
-
- WindowPositions m_windowPositions; ///
- WindowsWithAlpha m_windowsWithAlpha; ///
-
- tstring m_helpMessage; /// for &HelpMessage
- tstring m_helpTitle; /// for &HelpMessage
- int m_variable; /// for &Variable,
- /// &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->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 &WindowHMaximize, &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 &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 &OtherWindowClass\r
+ <dd>currentKeymap becoms currentKeymaps[++ Current::i]\r
+ <dt>when &KeymapParent\r
+ <dd>currentKeymap becoms currentKeyamp->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 &KeymapPrevPrefix\r
+ EmacsEditKillLine m_emacsEditKillLine; /// for &EmacsEditKillLine\r
+ const ActionFunction *m_afShellExecute; /// for &ShellExecute\r
+ \r
+ WindowPositions m_windowPositions; ///\r
+ WindowsWithAlpha m_windowsWithAlpha; ///\r
+ \r
+ tstring m_helpMessage; /// for &HelpMessage\r
+ tstring m_helpTitle; /// for &HelpMessage\r
+ int m_variable; /// for &Variable,\r
+ /// &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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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): "" => buf + "\r\n", Delete
-0: EDIT Control (other C-K): "(.+)" => buf + "\1"
-0: IE FORM TEXTAREA (at EOL C-K): "\r\n" => buf + "\r\n"
-2: IE FORM TEXTAREA (other C-K): "(.+)\r\n" => 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): "" => buf + "\r\n", Delete \r
+0: EDIT Control (other C-K): "(.+)" => buf + "\1" \r
+0: IE FORM TEXTAREA (at EOL C-K): "\r\n" => buf + "\r\n" \r
+2: IE FORM TEXTAREA (other C-K): "(.+)\r\n" => 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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, /// <BASIC_MODIFIER>
- Type_Alt, /// <BASIC_MODIFIER>
- Type_Control, /// <BASIC_MODIFIER>
- Type_Windows, /// <BASIC_MODIFIER>
- Type_BASIC, ///
-
- Type_Up = Type_BASIC, /// <KEYSEQ_MODIFIER>
- Type_Down, /// <KEYSEQ_MODIFIER>
- Type_KEYSEQ, ///
-
- Type_Repeat = Type_KEYSEQ, /// <ASSIGN_MODIFIER>
- Type_ImeLock, /// <ASSIGN_MODIFIER>
- Type_ImeComp, /// <ASSIGN_MODIFIER>
- Type_NumLock, /// <ASSIGN_MODIFIER>
- Type_CapsLock, /// <ASSIGN_MODIFIER>
- Type_ScrollLock, /// <ASSIGN_MODIFIER>
- Type_KanaLock, /// <ASSIGN_MODIFIER>
- Type_Maximized, /// <ASSIGN_MODIFIER>
- Type_Minimized, /// <ASSIGN_MODIFIER>
- Type_MdiMaximized, /// <ASSIGN_MODIFIER>
- Type_MdiMinimized, /// <ASSIGN_MODIFIER>
- Type_Touchpad, /// <ASSIGN_MODIFIER>
- Type_TouchpadSticky, /// <ASSIGN_MODIFIER>
- Type_Mod0, /// <ASSIGN_MODIFIER>
- Type_Mod1, /// <ASSIGN_MODIFIER>
- Type_Mod2, /// <ASSIGN_MODIFIER>
- Type_Mod3, /// <ASSIGN_MODIFIER>
- Type_Mod4, /// <ASSIGN_MODIFIER>
- Type_Mod5, /// <ASSIGN_MODIFIER>
- Type_Mod6, /// <ASSIGN_MODIFIER>
- Type_Mod7, /// <ASSIGN_MODIFIER>
- Type_Mod8, /// <ASSIGN_MODIFIER>
- Type_Mod9, /// <ASSIGN_MODIFIER>
- Type_Lock0, /// <ASSIGN_MODIFIER>
- Type_Lock1, /// <ASSIGN_MODIFIER>
- Type_Lock2, /// <ASSIGN_MODIFIER>
- Type_Lock3, /// <ASSIGN_MODIFIER>
- Type_Lock4, /// <ASSIGN_MODIFIER>
- Type_Lock5, /// <ASSIGN_MODIFIER>
- Type_Lock6, /// <ASSIGN_MODIFIER>
- Type_Lock7, /// <ASSIGN_MODIFIER>
- Type_Lock8, /// <ASSIGN_MODIFIER>
- Type_Lock9, /// <ASSIGN_MODIFIER>
- 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, /// <BASIC_MODIFIER>\r
+ Type_Alt, /// <BASIC_MODIFIER>\r
+ Type_Control, /// <BASIC_MODIFIER>\r
+ Type_Windows, /// <BASIC_MODIFIER>\r
+ Type_BASIC, ///\r
+ \r
+ Type_Up = Type_BASIC, /// <KEYSEQ_MODIFIER>\r
+ Type_Down, /// <KEYSEQ_MODIFIER>\r
+ Type_KEYSEQ, ///\r
+\r
+ Type_Repeat = Type_KEYSEQ, /// <ASSIGN_MODIFIER>\r
+ Type_ImeLock, /// <ASSIGN_MODIFIER>\r
+ Type_ImeComp, /// <ASSIGN_MODIFIER>\r
+ Type_NumLock, /// <ASSIGN_MODIFIER>\r
+ Type_CapsLock, /// <ASSIGN_MODIFIER>\r
+ Type_ScrollLock, /// <ASSIGN_MODIFIER>\r
+ Type_KanaLock, /// <ASSIGN_MODIFIER>\r
+ Type_Maximized, /// <ASSIGN_MODIFIER>\r
+ Type_Minimized, /// <ASSIGN_MODIFIER>\r
+ Type_MdiMaximized, /// <ASSIGN_MODIFIER>\r
+ Type_MdiMinimized, /// <ASSIGN_MODIFIER>\r
+ Type_Touchpad, /// <ASSIGN_MODIFIER>\r
+ Type_TouchpadSticky, /// <ASSIGN_MODIFIER>\r
+ Type_Mod0, /// <ASSIGN_MODIFIER>\r
+ Type_Mod1, /// <ASSIGN_MODIFIER>\r
+ Type_Mod2, /// <ASSIGN_MODIFIER>\r
+ Type_Mod3, /// <ASSIGN_MODIFIER>\r
+ Type_Mod4, /// <ASSIGN_MODIFIER>\r
+ Type_Mod5, /// <ASSIGN_MODIFIER>\r
+ Type_Mod6, /// <ASSIGN_MODIFIER>\r
+ Type_Mod7, /// <ASSIGN_MODIFIER>\r
+ Type_Mod8, /// <ASSIGN_MODIFIER>\r
+ Type_Mod9, /// <ASSIGN_MODIFIER>\r
+ Type_Lock0, /// <ASSIGN_MODIFIER>\r
+ Type_Lock1, /// <ASSIGN_MODIFIER>\r
+ Type_Lock2, /// <ASSIGN_MODIFIER>\r
+ Type_Lock3, /// <ASSIGN_MODIFIER>\r
+ Type_Lock4, /// <ASSIGN_MODIFIER>\r
+ Type_Lock5, /// <ASSIGN_MODIFIER>\r
+ Type_Lock6, /// <ASSIGN_MODIFIER>\r
+ Type_Lock7, /// <ASSIGN_MODIFIER>\r
+ Type_Lock8, /// <ASSIGN_MODIFIER>\r
+ Type_Lock9, /// <ASSIGN_MODIFIER>\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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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 &&
- 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 &&\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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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 <= 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 <= 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-#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
-///////////////////////////////////////////////////////////////////////////////
-// 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
-///////////////////////////////////////////////////////////////////////////////
-// 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
-///////////////////////////////////////////////////////////////////////////////
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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);
-}
-
-
-// <ARGUMENT>
-void SettingLoader::load_ARGUMENT(bool *o_arg)
-{
- *o_arg = !(*getToken() == _T("false"));
-}
-
-
-// <ARGUMENT>
-void SettingLoader::load_ARGUMENT(int *o_arg)
-{
- *o_arg = getToken()->getNumber();
-}
-
-
-// <ARGUMENT>
-void SettingLoader::load_ARGUMENT(unsigned int *o_arg)
-{
- *o_arg = getToken()->getNumber();
-}
-
-
-// <ARGUMENT>
-void SettingLoader::load_ARGUMENT(long *o_arg)
-{
- *o_arg = getToken()->getNumber();
-}
-
-
-// <ARGUMENT>
-void SettingLoader::load_ARGUMENT(unsigned __int64 *o_arg)
-{
- *o_arg = getToken()->getNumber();
-}
-
-
-// <ARGUMENT>
-void SettingLoader::load_ARGUMENT(__int64 *o_arg)
-{
- *o_arg = getToken()->getNumber();
-}
-
-
-// <ARGUMENT>
-void SettingLoader::load_ARGUMENT(tstringq *o_arg)
-{
- *o_arg = getToken()->getString();
-}
-
-
-// <ARGUMENT>
-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();
- }
-}
-
-
-// <ARGUMENT>
-void SettingLoader::load_ARGUMENT(tregex *o_arg)
-{
- *o_arg = getToken()->getRegexp();
-}
-
-
-// <ARGUMENT_VK>
-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);
-}
-
-
-// <ARGUMENT_WINDOW>
-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.");
-}
-
-
-// <ARGUMENT>
-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.");
-}
-
-
-// <ARGUMENT>
-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.");
-}
-
-
-// <ARGUMENT>
-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.");
-}
-
-
-// <ARGUMENT_LOCK>
-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.");
-}
-
-
-// <ARGUMENT_LOCK>
-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.");
-}
-
-
-// <ARGUMENT_SHOW_WINDOW>
-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.");
-}
-
-
-// <ARGUMENT_TARGET_WINDOW>
-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.");
-}
-
-
-// <bool>
-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.");
-}
-
-
-// <ARGUMENT>
-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'.");
-}
-
-
-// <ARGUMENT>
-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);
-}
-
-
-// <ARGUMENT>
-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.");
-}
-
-
-// <ARGUMENT>
-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.");
-}
-
-
-// <ARGUMENT>
-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);
-}
-
-
-// <ARGUMENT>
-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
+// <ARGUMENT>\r
+void SettingLoader::load_ARGUMENT(bool *o_arg)\r
+{\r
+ *o_arg = !(*getToken() == _T("false"));\r
+}\r
+\r
+\r
+// <ARGUMENT>\r
+void SettingLoader::load_ARGUMENT(int *o_arg)\r
+{\r
+ *o_arg = getToken()->getNumber();\r
+}\r
+\r
+\r
+// <ARGUMENT>\r
+void SettingLoader::load_ARGUMENT(unsigned int *o_arg)\r
+{\r
+ *o_arg = getToken()->getNumber();\r
+}\r
+\r
+\r
+// <ARGUMENT>\r
+void SettingLoader::load_ARGUMENT(long *o_arg)\r
+{\r
+ *o_arg = getToken()->getNumber();\r
+}\r
+\r
+\r
+// <ARGUMENT>\r
+void SettingLoader::load_ARGUMENT(unsigned __int64 *o_arg)\r
+{\r
+ *o_arg = getToken()->getNumber();\r
+}\r
+\r
+\r
+// <ARGUMENT>\r
+void SettingLoader::load_ARGUMENT(__int64 *o_arg)\r
+{\r
+ *o_arg = getToken()->getNumber();\r
+}\r
+\r
+\r
+// <ARGUMENT>\r
+void SettingLoader::load_ARGUMENT(tstringq *o_arg)\r
+{\r
+ *o_arg = getToken()->getString();\r
+}\r
+\r
+\r
+// <ARGUMENT>\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
+// <ARGUMENT>\r
+void SettingLoader::load_ARGUMENT(tregex *o_arg)\r
+{\r
+ *o_arg = getToken()->getRegexp();\r
+}\r
+\r
+\r
+// <ARGUMENT_VK>\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
+// <ARGUMENT_WINDOW>\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
+// <ARGUMENT>\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
+// <ARGUMENT>\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
+// <ARGUMENT>\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
+// <ARGUMENT_LOCK>\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
+// <ARGUMENT_LOCK>\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
+// <ARGUMENT_SHOW_WINDOW>\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
+// <ARGUMENT_TARGET_WINDOW>\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
+// <bool>\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
+// <ARGUMENT>\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
+// <ARGUMENT>\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
+// <ARGUMENT>\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
+// <ARGUMENT>\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
+// <ARGUMENT>\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
+// <ARGUMENT>\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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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 <COND_SYMBOL>
-
- Modifier m_defaultAssignModifier; /** default
- <ASSIGN_MODIFIER> */
- Modifier m_defaultKeySeqModifier; /** default
- <KEYSEQ_MODIFIER> */
-
-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(); /// <LINE>
- void load_DEFINE(); /// <DEFINE>
- void load_IF(); /// <IF>
- void load_ELSE(bool i_isElseIf, const tstringi &i_token);
- /// <ELSE> <ELSEIF>
- bool load_ENDIF(const tstringi &i_token); /// <ENDIF>
- void load_INCLUDE(); /// <INCLUDE>
- void load_SCAN_CODES(Key *o_key); /// <SCAN_CODES>
- void load_DEFINE_KEY(); /// <DEFINE_KEY>
- void load_DEFINE_MODIFIER(); /// <DEFINE_MODIFIER>
- void load_DEFINE_SYNC_KEY(); /// <DEFINE_SYNC_KEY>
- void load_DEFINE_ALIAS(); /// <DEFINE_ALIAS>
- void load_DEFINE_SUBSTITUTE(); /// <DEFINE_SUBSTITUTE>
- void load_DEFINE_OPTION(); /// <DEFINE_OPTION>
- void load_KEYBOARD_DEFINITION(); /// <KEYBOARD_DEFINITION>
- Modifier load_MODIFIER(Modifier::Type i_mode, Modifier i_modifier,
- Modifier::Type *o_mode = NULL);
- /// <..._MODIFIER>
- Key *load_KEY_NAME(); /// <KEY_NAME>
- void load_KEYMAP_DEFINITION(const Token *i_which);
- /// <KEYMAP_DEFINITION>
- void load_ARGUMENT(bool *o_arg); /// <ARGUMENT>
- void load_ARGUMENT(int *o_arg); /// <ARGUMENT>
- void load_ARGUMENT(unsigned int *o_arg); /// <ARGUMENT>
- void load_ARGUMENT(long *o_arg); /// <ARGUMENT>
- void load_ARGUMENT(unsigned __int64 *o_arg); /// <ARGUMENT>
- void load_ARGUMENT(__int64 *o_arg); /// <ARGUMENT>
- void load_ARGUMENT(tstringq *o_arg); /// <ARGUMENT>
- void load_ARGUMENT(std::list<tstringq> *o_arg); /// <ARGUMENT>
- void load_ARGUMENT(tregex *o_arg); /// <ARGUMENT>
- void load_ARGUMENT(VKey *o_arg); /// <ARGUMENT_VK>
- void load_ARGUMENT(ToWindowType *o_arg); /// <ARGUMENT_WINDOW>
- void load_ARGUMENT(GravityType *o_arg); /// <ARGUMENT>
- void load_ARGUMENT(MouseHookType *o_arg); /// <ARGUMENT>
- void load_ARGUMENT(MayuDialogType *o_arg); /// <ARGUMENT>
- void load_ARGUMENT(ModifierLockType *o_arg); /// <ARGUMENT_LOCK>
- void load_ARGUMENT(ToggleType *o_arg); /// <ARGUMENT>
- void load_ARGUMENT(ShowCommandType *o_arg); ///<ARGUMENT_SHOW_WINDOW>
- void load_ARGUMENT(TargetWindowType *o_arg);
- /// <ARGUMENT_TARGET_WINDOW_TYPE>
- void load_ARGUMENT(BooleanType *o_arg); /// <bool>
- void load_ARGUMENT(LogicalOperatorType *o_arg);/// <ARGUMENT>
- void load_ARGUMENT(Modifier *o_arg); /// <ARGUMENT>
- void load_ARGUMENT(const Keymap **o_arg); /// <ARGUMENT>
- void load_ARGUMENT(const KeySeq **o_arg); /// <ARGUMENT>
- void load_ARGUMENT(StrExprArg *o_arg); /// <ARGUMENT>
- void load_ARGUMENT(WindowMonitorFromType *o_arg); /// <ARGUMENT>
- KeySeq *load_KEY_SEQUENCE(
- const tstringi &i_name = _T(""), bool i_isInParen = false,
- Modifier::Type i_mode = Modifier::Type_KEYSEQ); /// <KEY_SEQUENCE>
- void load_KEY_ASSIGN(); /// <KEY_ASSIGN>
- void load_EVENT_ASSIGN(); /// <EVENT_ASSIGN>
- void load_MODIFIER_ASSIGNMENT(); /// <MODIFIER_ASSIGN>
- void load_LOCK_ASSIGNMENT(); /// <LOCK_ASSIGN>
- void load_KEYSEQ_DEFINITION(); /// <KEYSEQ_DEFINITION>
-
- /// 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 <COND_SYMBOL>\r
+\r
+ Modifier m_defaultAssignModifier; /** default\r
+ <ASSIGN_MODIFIER> */\r
+ Modifier m_defaultKeySeqModifier; /** default\r
+ <KEYSEQ_MODIFIER> */\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(); /// <LINE>\r
+ void load_DEFINE(); /// <DEFINE>\r
+ void load_IF(); /// <IF>\r
+ void load_ELSE(bool i_isElseIf, const tstringi &i_token);\r
+ /// <ELSE> <ELSEIF>\r
+ bool load_ENDIF(const tstringi &i_token); /// <ENDIF>\r
+ void load_INCLUDE(); /// <INCLUDE>\r
+ void load_SCAN_CODES(Key *o_key); /// <SCAN_CODES>\r
+ void load_DEFINE_KEY(); /// <DEFINE_KEY>\r
+ void load_DEFINE_MODIFIER(); /// <DEFINE_MODIFIER>\r
+ void load_DEFINE_SYNC_KEY(); /// <DEFINE_SYNC_KEY>\r
+ void load_DEFINE_ALIAS(); /// <DEFINE_ALIAS>\r
+ void load_DEFINE_SUBSTITUTE(); /// <DEFINE_SUBSTITUTE>\r
+ void load_DEFINE_OPTION(); /// <DEFINE_OPTION>\r
+ void load_KEYBOARD_DEFINITION(); /// <KEYBOARD_DEFINITION>\r
+ Modifier load_MODIFIER(Modifier::Type i_mode, Modifier i_modifier,\r
+ Modifier::Type *o_mode = NULL);\r
+ /// <..._MODIFIER>\r
+ Key *load_KEY_NAME(); /// <KEY_NAME>\r
+ void load_KEYMAP_DEFINITION(const Token *i_which);\r
+ /// <KEYMAP_DEFINITION>\r
+ void load_ARGUMENT(bool *o_arg); /// <ARGUMENT>\r
+ void load_ARGUMENT(int *o_arg); /// <ARGUMENT>\r
+ void load_ARGUMENT(unsigned int *o_arg); /// <ARGUMENT>\r
+ void load_ARGUMENT(long *o_arg); /// <ARGUMENT>\r
+ void load_ARGUMENT(unsigned __int64 *o_arg); /// <ARGUMENT>\r
+ void load_ARGUMENT(__int64 *o_arg); /// <ARGUMENT>\r
+ void load_ARGUMENT(tstringq *o_arg); /// <ARGUMENT>\r
+ void load_ARGUMENT(std::list<tstringq> *o_arg); /// <ARGUMENT>\r
+ void load_ARGUMENT(tregex *o_arg); /// <ARGUMENT>\r
+ void load_ARGUMENT(VKey *o_arg); /// <ARGUMENT_VK>\r
+ void load_ARGUMENT(ToWindowType *o_arg); /// <ARGUMENT_WINDOW>\r
+ void load_ARGUMENT(GravityType *o_arg); /// <ARGUMENT>\r
+ void load_ARGUMENT(MouseHookType *o_arg); /// <ARGUMENT>\r
+ void load_ARGUMENT(MayuDialogType *o_arg); /// <ARGUMENT>\r
+ void load_ARGUMENT(ModifierLockType *o_arg); /// <ARGUMENT_LOCK>\r
+ void load_ARGUMENT(ToggleType *o_arg); /// <ARGUMENT>\r
+ void load_ARGUMENT(ShowCommandType *o_arg); ///<ARGUMENT_SHOW_WINDOW>\r
+ void load_ARGUMENT(TargetWindowType *o_arg);\r
+ /// <ARGUMENT_TARGET_WINDOW_TYPE>\r
+ void load_ARGUMENT(BooleanType *o_arg); /// <bool>\r
+ void load_ARGUMENT(LogicalOperatorType *o_arg);/// <ARGUMENT>\r
+ void load_ARGUMENT(Modifier *o_arg); /// <ARGUMENT>\r
+ void load_ARGUMENT(const Keymap **o_arg); /// <ARGUMENT>\r
+ void load_ARGUMENT(const KeySeq **o_arg); /// <ARGUMENT>\r
+ void load_ARGUMENT(StrExprArg *o_arg); /// <ARGUMENT>\r
+ void load_ARGUMENT(WindowMonitorFromType *o_arg); /// <ARGUMENT>\r
+ KeySeq *load_KEY_SEQUENCE(\r
+ const tstringi &i_name = _T(""), bool i_isInParen = false,\r
+ Modifier::Type i_mode = Modifier::Type_KEYSEQ); /// <KEY_SEQUENCE>\r
+ void load_KEY_ASSIGN(); /// <KEY_ASSIGN>\r
+ void load_EVENT_ASSIGN(); /// <EVENT_ASSIGN>\r
+ void load_MODIFIER_ASSIGNMENT(); /// <MODIFIER_ASSIGN>\r
+ void load_LOCK_ASSIGNMENT(); /// <LOCK_ASSIGN>\r
+ void load_KEYSEQ_DEFINITION(); /// <KEYSEQ_DEFINITION>\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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-# 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
-#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
-EXPORTS
- ts4mayuInit @1
- ts4mayuTerm @2
+EXPORTS\r
+ ts4mayuInit @1\r
+ ts4mayuTerm @2\r
-_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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// 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