aboutsummaryrefslogtreecommitdiff
path: root/tt.layout.ahk
blob: 4ce61b07b9e8f5fe59274cfe07ffb4615f3ee883 (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}"
}