-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMShift.lua
More file actions
144 lines (138 loc) · 6.25 KB
/
MShift.lua
File metadata and controls
144 lines (138 loc) · 6.25 KB
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
function OnEvent(event, arg)
--OutputLogMessage("event = %s, arg = %s\n", event, arg);
--===================================================
--
--This script converts the M1-3 keys to FN keys, rather than toggle keys. I have named this MShift, as it emulates the functionality of GShift on Logitech's mice. It also converts the current M-key to an extra key, and adds back togglability via G-keys in any M-layer, or even while MShifted for the all 30 possible buttons in a layer to be re-mapped without worrying about losing access to M-layers.
--
--This script also adds the toggling M-layers to keys, and can be customized to allow for a single key to be mapped to enable MShift, and then from within MShift, to be toggled-on. For example purposes, the following G-keys are configured as such, where the format is Button[M-State]:
--G24[M1, M2, M3] mapped to M2Shift
--G9[M2] mapped to M2 Toggle
--Current M-key mapped to LCtrl
--(i.e.: M1[M1], M2[M2], M3[M3])
--And all M-keys that are not the current M-state are now MShifts instead of toggles.
--(i.e.: M2[M1], M3[M1], M1[M2], M3[M2], M1[M3], M2[M3])
--To use this functionality (and allow the maximum number of buttons available in M1 by only having MShift mapped, and no "MToggle"), if - in M1 (or M3) - M2 is held, and then G9 is pressed, when M2 is released, M2 will stay toggled on.
--This also allows for binding the current M-State's button to an additional key, essentially making it G30 (see next comment section for details)
--
--===================================================
--
--This is all that needs to be changed for assigning a keypress to the current M-state's M-key; e.g.: in M1, if M1 is pressed - an extra re-mappable button!
--To map this, follow the syntax as defined in the Appendix A of https://douile.github.io/logitech-toggle-keys/APIDocs.pdf ; i.e.: keep the quotes for the keyname, or remove them for the scancode. e.g.:
--MMap = 0x1d
--
MMap = "lctrl"
--
--To map the G-key to toggle between different M-states, you will have to edit the code after the following block of comments.
--
--===================================================
--
--G1-22 are labelled, G23 is the left thumb button, and G24 is the bottom thumb button.
--When the joystick is not assigned as a joystick, the click is G25, then starting from Up, going clockwise, is G26-G29. Visually, this looks like:
--
-- Click G25
-- Up G26
-- Right G27
-- Down G28
--Left G29
--
--But I find it more useful in a top-down view of the joystick:
--
-- Up G26
--Left G29
-- Click G25
-- Right G27
-- Down G28
--
--===================================================
--
--Side note: if you have a Logitech mouse in addition to a device with M-layers (like the G13 and G15), you can map functions that are only available from either device onto the other, for example: mapping GShift onto the G22 key will allow you to hold down G22 with your left hand, and use a single finger on your right hand to press a key that is mapped in GShift.
--
--More specifically to my use case, with the mouse emulation the G13 offers, it enables horizontal scrolling to be mapped onto the G600 in Logitech Gaming Software. (G HUB does allow horizontal scrolling to be mapped natively, but G HUB doesn't support the G13.)
--
--===================================================
--
--Add toggling M-States back; MShift disables this functionality by default
--Note: M-states act as if they are constantly held down, until a new M-state is assigned. This is why a separate variable, "MShift", in addition to "MKeyState", must be assigned. Without this additional variable to compare to, MShift would only work in one M-state. Additionally, this enables the possiblility of toggling M-states.
if event == "G_PRESSED" then
MShiftRevert = 1
--OutputLogMessage("G_PRESSED!\n")
MShift = GetMKeyState("lhc")
--M1 Toggle
if MShift == 1 then
--G24
if arg == 24 then
--Toggle to M2
MKeyState = 2
SetMKeyState(MKeyState, "lhc")
end
--M2 Toggle
elseif MShift == 2 then
--G24
if arg == 24 then
--Toggle to M1
MKeyState = 1
SetMKeyState(MKeyState, "lhc")
--Stay on M2
elseif arg == 9 then
--Ends MShift on this layer
MKeyState = 2
end
--M3 Toggle
elseif MShift == 3 then
--G24
if arg == 24 then
--Toggle to M1
MKeyState = 1
SetMKeyState(MKeyState, "lhc")
end
end
end
--===================================================
--The following code need not be edited, and is what converts M-keys into MShifts.
--===================================================
--More detailed code explanation
--===================================================
--When MShift is released, the M-key for the current locked state is quickly toggled. As a result, the MShiftRevert variable keeps track of when this happens, to ensure that whatever is mapped to current M-State is not triggered erroneously.
--===================================================
--Set variables on launch so everything works
if event == "PROFILE_ACTIVATED" then
--Store MKeyState in variable "MKeyState"
MKeyState = GetMKeyState("lhc")
--Don't ignore next M-Key activation
MShiftRevert = 0
end
--Add Current-mode M-key as additional key
if event == "M_PRESSED" then
if arg == MKeyState then
if MShiftRevert == 2 then
MShiftRevert = 0
end
if MShiftRevert == 0 then
--OutputLogMessage("M-Remap_PRESSED\n")
PressKey(MMap)
end
end
end
--MShift; on release, revert to MKeyState [ignore current state]
if event == "M_RELEASED" then
--Ensures the binding to the current M-state M-key is not pressed when it is toggled or MShifted.
if MShiftRevert == 2 then
MShiftRevert = 0
elseif MShiftRevert == 1 then
MShiftRevert = 2
end
--M2-Shift
if arg == MKeyState then
--Add Current-mode M-key as additional key
--Current M-key bind release
if MShiftRevert == 0 then
--OutputLogMessage("M-Remap_RELEASED\n")
ReleaseKey(MMap)
end
else
--Ignore next M-Key activation
MShiftRevert = 1
SetMKeyState(MKeyState, "lhc")
end
end
end