aboutsummaryrefslogtreecommitdiff
path: root/tt.layout.ahk
blob: a9f87595b1a6cfdbbc7a3e19aa0433bf2e774d22 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
;; Quickly change keyboard layout ---------------------------------------------

;; -> body

LWin & SC029:: ; key left of 1
if (GetKeyState("Shift"))
	new := altlayout
else
{
	new := activelayouts[1]
	current := Layout()
	for k, v in activelayouts
	{
		if (v = current)
			new := activelayouts[k+1]
	}
	if (new = "")
		new := activelayouts[1]
}
DllCall("SendMessage", "UInt", WinActive("A"), "UInt", 80, "UInt", 1, "UInt", new)
Sleep, 100
ShowLayout() ; display new layout in tray icon
return

;; Display keyboard layout in tray icon ---------------------------------------

;; -> init

layouts := { ru: DllCall("LoadKeyboardLayout", "Str", "00000419", "Int", 1)
			     , sv: DllCall("LoadKeyboardLayout", "Str", "0000041D", "Int", 1)
				 , us: DllCall("LoadKeyboardLayout", "Str", "00000409", "Int", 1) }
activelayouts := [layouts.us, layouts.ru]
altlayout := layouts.sv

ShowLayout()

;; -> library

Layout() {
	f := A_FormatInteger
	SetFormat, Integer, H
	if (hwnd = "")
		WinGet, hwnd, id, A
	thread := DllCall("GetWindowThreadProcessId", "UInt",hwnd, "UInt",0)
	layout := DllCall("user32.dll\GetKeyboardLayout", "UInt",thread, "UInt")
	SetFormat, Integer, %f%
	return layout
}

ShowLayout(hwnd := "")
{
	global layouts
	layout := Layout()
	for k, v in layouts
	{
		if (layout = v)
		{
			if (FileExist(k ".ico"))
				Menu, Tray, Icon, %k%.ico
			break
		}
	}
}

;; Update layout display on window change -------------------------------------

;; -> library

LayoutWindowMessage(wParam, lParam)
{
	if (wParam = 4 or wParam = 32772) ; HSHELL_WINDOW_ACTIVATED | HSHELL_RUDEAPPACTIVATED
	{
		ShowLayout(lParam)
		WinSet, AlwaysOnTop, On, OSD
	}
}

;; -> init

WindowMessageHandlers.Push("LayoutWindowMessage")

;; Click tray icon to open Text Services and Input Languages ------------------

;; -> init

OnMessage(0x404, "NotifyIcon")

;; -> library

NotifyIcon(wParam, lParam)
{
	if (lParam = 0x202) ; WM_LBUTTONUP
		Run, % "Rundll32 Shell32.dll,Control_RunDLL input.dll,,{C07337D3-DB2C-4D0B-9A93-B722A6C106E2}"
}