├── .gitignore ├── ModuleParameter.py ├── README.md └── main.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Project exclude paths 2 | /venv/ -------------------------------------------------------------------------------- /ModuleParameter.py: -------------------------------------------------------------------------------- 1 | class ModuleParameter: 2 | parameterName = "" 3 | parameterValue = "" 4 | 5 | def __init__(self, name): 6 | self.parameterName = name 7 | f = open("/sys/module/leetmouse/parameters/" + self.parameterName, "r") 8 | self.parameterValue = f.read().strip(' \t\n\r') 9 | 10 | def set(self, val): 11 | self.parameterValue = val 12 | f = open("/sys/module/leetmouse/parameters/" + self.parameterName, "w") 13 | f.write(self.parameterValue) 14 | f.close() -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # leetmouse-gui 2 | Simple GUI for my fork of leetmouse (https://github.com/Skyl3r/leetmouse). This program assumes you've already installed the leetmouse driver. 3 | Please note it lacks form validation. All fields should be formatted as floats with an 'f' appended to the end, as in the example photo below. 4 | 5 | ![image](https://i.imgur.com/RFpL59Z.png) 6 | 7 | ## Requirements 8 | - PySimpleGUIQt 9 | 10 | ``` sudo pip install pysimpleguiqt ``` 11 | 12 | ## Use 13 | 14 | Since this program must change module parameters it needs root access: 15 | ``` sudo python3 main.py ``` 16 | 17 | 18 | ## Todo 19 | - Form validation 20 | - Error catching and handling for file I/O 21 | - Graph to display acceleration curve (output vs input) 22 | - Restructure so that fields are ordered in a way that makes sense, IE mode & mode specific options together, general options together 23 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import PySimpleGUIQt as sg 2 | import os.path 3 | from ModuleParameter import ModuleParameter 4 | 5 | Parameters = { 6 | "Acceleration": ModuleParameter("Acceleration"), 7 | "Sensitivity": ModuleParameter("Sensitivity"), 8 | "Speed Cap": ModuleParameter("SpeedCap"), 9 | "Sensitivity Cap": ModuleParameter("SensitivityCap"), 10 | "Offset": ModuleParameter("Offset"), 11 | "Scrolls per Tick": ModuleParameter("ScrollsPerTick"), 12 | "Midpoint": ModuleParameter("Midpoint") 13 | } 14 | 15 | Parameters["Exponent"] = ModuleParameter("Exponent") 16 | 17 | ModeLookup = { 18 | "Linear": 1, 19 | "Classic": 2, 20 | "Motivity": 3 21 | } 22 | 23 | # Special cases 24 | UpdateParameter = ModuleParameter("update") 25 | AccelerationModeParameter = ModuleParameter("AccelerationMode") 26 | AccelerationMode = AccelerationModeParameter.parameterValue 27 | AccelerationModePlainText = "Linear" 28 | 29 | # get the acceleration mode to set the combo box 30 | for mode, key in ModeLookup.items(): 31 | if str(AccelerationMode) == str(key): 32 | AccelerationModePlainText = mode 33 | 34 | layout = [[sg.Text("LEETMOUSE")]] 35 | layout.append([sg.Text("Mode: "), 36 | sg.Combo(["Linear", "Classic", "Motivity"], default_value=AccelerationModePlainText, enable_events=True, key="modecombo")]) 37 | 38 | for param in Parameters: 39 | layout.append([sg.Text(param), sg.InputText(default_text=Parameters[param].parameterValue, key=Parameters[param].parameterName)]) 40 | 41 | layout.append([sg.Button("Update")]) 42 | 43 | window = sg.Window(title="leetmouse GUI", layout=layout) 44 | 45 | while True: 46 | event, values = window.read() 47 | 48 | if event == "Update": 49 | # Update parameters 50 | for param in Parameters: 51 | Parameters[param].set(window[Parameters[param].parameterName].get()) 52 | AccelerationModeParameter.set(str(AccelerationMode)) 53 | 54 | # Set update flag so LEETMOUSE knows to read changes 55 | UpdateParameter.set("1") 56 | 57 | if event == "modecombo": 58 | # Mode was changed 59 | mode = values["modecombo"] 60 | # Save change but don't write it yet 61 | AccelerationMode = ModeLookup[mode] 62 | 63 | if event == sg.WIN_CLOSED: 64 | break 65 | 66 | 67 | 68 | window.close() --------------------------------------------------------------------------------