aboutsummaryrefslogtreecommitdiff
path: root/tt.layout.ahk
blob: 700afa4aa81c5f49a13cd4ff6446e0bbf0e3f707 (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
;; Quickly change keyboard layout ---------------------------------------------

;; -> body

LWin & LShift::
LShift & LWin:: ; (my CapsLock is mapped to LWin)
PostMessage, 0x50, 2, 0,, A ; WM_INPUTLANGCHANGEREQUEST
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) }
ShowLayout()

;; -> library

ShowLayout(hwnd := "")
{
	global layouts
	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")
	for k, v in layouts
	{
		if (layout = v)
		{
			if (FileExist(k ".ico"))
			  Menu, Tray, Icon, %k%.ico
			break
		}
	}
	SetFormat, Integer, %f%
}

;; 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}"
}