def Process(self, btn, idx, split_line): # while this looks like validation, it is just a warning if btn.symbols[SYM_MOUSE] == tuple(): print( "[" + lib + "] " + btn.coords + " Line:" + str(idx + 1) + " No 'M_STORE' command has been run, cannot do 'M_RECALL'") else: print("[" + lib + "] " + btn.coords + " Line:" + str(idx + 1) + " Recall mouse position " + str(btn.symbols[SYM_MOUSE])) x1, y1 = btn.symbols[SYM_MOUSE] delay = None if self.Has_param(btn, 1): delay = float(self.Get_param(btn, 1)) / 1000.0 skip = self.Get_param(btn, 1, 1) x_C, y_C = ms.get_pos() points = ms.line_coords(x_C, y_C, x1, y1) for x_M, y_M in points[::skip]: if btn.Check_kill(): return -1 ms.set_pos(x_M, y_M) if (delay != None) and (delay > 0): if not btn.Safe_sleep(delay): return -1
def Process(self, btn, idx, split_line): # while this looks like validation, it is really just the info. Putting it here is easy if btn.symbols[SYM_MOUSE] == tuple(): print( "[" + lib + "] " + btn.coords + " Line:" + str(idx + 1) + " No 'M_STORE' command has been run, cannot do 'M_RECALL'") else: print("[" + lib + "] " + btn.coords + " Line:" + str(idx + 1) + " Recall mouse position " + str(btn.symbols[SYM_MOUSE])) ms.set_pos(btn.symbols[SYM_MOUSE][0], btn.symbols[SYM_MOUSE][1])
def Process(self, btn, idx, split_line): hwnd = self.Get_param( btn, 1) # get the window handle from the passed variable (or constant) old_x, old_y = ms.get_pos() # save the position of the mouse self.restore_window(hwnd) # show the window # positioning the mouse on the form while we make it the foreground seems to help x, y = win32gui.ClientToScreen( hwnd, (10, 10)) # get a position just inside the window ms.set_pos(x, y) # put the mouse on the form win32gui.SetForegroundWindow(hwnd) # Make the window current ms.set_pos(old_x, old_y) # restore the mouse position
def Process(self, btn, idx, split_line): delay = None if self.Has_param(btn, 3): delay = float(self.Get_param(btn, 3)) / 1000.0 skip = int(self.Get_param(btn, 4, 1)) x_C, y_C = ms.get_pos() x_N, y_N = x_C + self.Get_param(btn, 1), y_C + self.Get_param(btn, 2) points = ms.line_coords(x_C, y_C, x_N, y_N) for x_M, y_M in points[::skip]: if btn.Check_kill(): return -1 ms.set_pos(x_M, y_M) if (delay != None) and (delay > 0): if not btn.Safe_sleep(delay): return -1
def Process(self, btn, idx, split_line): delay = None # default value of parameter if self.Has_param( btn, 3): # can't use the default param because if we have one delay = float(self.Get_param( btn, 3)) / 1000.0 # we need to do math on it skip = self.Get_param(btn, 4, 1) # skip parameter has a default value of 1 x_C, y_C = ms.get_pos() # where are we now? points = ms.line_coords(x_C, y_C, self.Get_param( btn, 1), self.Get_param(btn, 2)) # how do we get to where we want to be for x_M, y_M in points[::skip]: # For each point we're going to use if btn.Check_kill(): # Just make sure we should still be running return -1 ms.set_pos(x_M, y_M) # set the position if (delay != None) and (delay > 0): # if we have a delay if not btn.Safe_sleep(delay): # delay "safely" return -1
def Process(self, btn, idx, split_line): delay = None if self.Has_param(btn, 5): delay = float(self.Get_param(btn, 5)) / 1000.0 skip = self.Get_param(btn, 6, 1) x1 = self.Get_param(btn, 1) y1 = self.Get_param(btn, 2) x2 = self.Get_param(btn, 3) y2 = self.Get_param(btn, 4) points = ms.line_coords(x1, y1, x2, y2) for x_M, y_M in points[::skip]: if btn.Check_kill(): return -1 ms.set_pos(x_M, y_M) if (delay != None) and (delay > 0): if not btn.Safe_sleep(delay): return -1
def main_logic(idx): nonlocal m_pos if check_kill(x, y, is_async): return idx + 1 line = script_lines[idx] if line == "": return idx + 1 if line[0] == "-": print("[scripts] " + coords + " Comment: " + line[1:]) else: split_line = line.split(" ") if split_line[0] == "STRING": type_string = " ".join(split_line[1:]) print("[scripts] " + coords + " Type out string " + type_string) kb.write(type_string) elif split_line[0] == "DELAY": print("[scripts] " + coords + " Delay for " + split_line[1] + " seconds") delay = float(split_line[1]) if not safe_sleep(delay, x, y, is_async): return -1 elif split_line[0] == "TAP": key = kb.sp(split_line[1]) releasefunc = lambda: kb.release(key) if len(split_line) <= 2: print("[scripts] " + coords + " Tap key " + split_line[1]) kb.tap(key) elif len(split_line) <= 3: print("[scripts] " + coords + " Tap key " + split_line[1] + " " + split_line[2] + " times") taps = int(split_line[2]) for tap in range(taps): if check_kill(x, y, is_async, releasefunc): return idx + 1 kb.tap(key) else: print("[scripts] " + coords + " Tap key " + split_line[1] + " " + split_line[2] + " times for " + str(split_line[3]) + " seconds each") taps = int(split_line[2]) delay = float(split_line[3]) for tap in range(taps): if check_kill(x, y, is_async, releasefunc): return -1 kb.press(key) if not safe_sleep(delay, x, y, is_async, releasefunc): return -1 elif split_line[0] == "PRESS": print("[scripts] " + coords + " Press key " + split_line[1]) key = kb.sp(split_line[1]) kb.press(key) elif split_line[0] == "RELEASE": print("[scripts] " + coords + " Release key " + split_line[1]) key = kb.sp(split_line[1]) kb.release(key) elif split_line[0] == "WEB": link = split_line[1] if "http" not in link: link = "http://" + link print("[scripts] " + coords + " Open website " + link + " in default browser") webbrowser.open(link) elif split_line[0] == "WEB_NEW": link = split_line[1] if "http" not in link: link = "http://" + link print("[scripts] " + coords + " Open website " + link + " in default browser, try to make a new window") webbrowser.open_new(link) elif split_line[0] == "CODE": args = " ".join(split_line[1:]) print("[scripts] " + coords + " Running code: " + args) try: subprocess.run(args) except Exception as e: print("[scripts] " + coords + " Error with running code: " + str(e)) elif split_line[0] == "SOUND": if len(split_line) > 2: print("[scripts] " + coords + " Play sound file " + split_line[1] + " at volume " + str(split_line[2])) sound.play(split_line[1], float(split_line[2])) else: print("[scripts] " + coords + " Play sound file " + split_line[1]) sound.play(split_line[1]) elif split_line[0] == "WAIT_UNPRESSED": print("[scripts] " + coords + " Wait for script key to be unpressed") while lp_events.pressed[x][y]: sleep(DELAY_EXIT_CHECK) if check_kill(x, y, is_async): return idx + 1 elif split_line[0] == "M_STORE": print("[scripts] " + coords + " Store mouse position") m_pos = ms.get_pos() elif split_line[0] == "M_RECALL": if m_pos == tuple(): print( "[scripts] " + coords + " No 'M_STORE' command has been run, cannot do 'M_RECALL'" ) else: print("[scripts] " + coords + " Recall mouse position " + str(m_pos)) ms.set_pos(m_pos[0], m_pos[1]) elif split_line[0] == "M_RECALL_LINE": x1, y1 = m_pos delay = None if len(split_line) > 1: delay = float(split_line[1]) / 1000.0 skip = 1 if len(split_line) > 2: skip = int(split_line[2]) if (delay == None) or (delay <= 0): print("[scripts] " + coords + " Recall mouse position " + str(m_pos) + " in a line by " + str(skip) + " pixels per step") else: print("[scripts] " + coords + " Recall mouse position " + str(m_pos) + " in a line by " + str(skip) + " pixels per step and wait " + split_line[1] + " milliseconds between each step") x_C, y_C = ms.get_pos() points = ms.line_coords(x_C, y_C, x1, y1) for x_M, y_M in points[::skip]: if check_kill(x, y, is_async): return -1 ms.set_pos(x_M, y_M) if (delay != None) and (delay > 0): if not safe_sleep(delay, x, y, is_async): return -1 elif split_line[0] == "M_MOVE": if len(split_line) >= 3: print("[scripts] " + coords + " Relative mouse movement (" + split_line[1] + ", " + str(split_line[2]) + ")") ms.move_to_pos(float(split_line[1]), float(split_line[2])) else: print( "[scripts] " + coords + " Both X and Y are required for mouse movement, skipping..." ) elif split_line[0] == "M_SET": if len(split_line) >= 3: print("[scripts] " + coords + " Set mouse position to (" + split_line[1] + ", " + str(split_line[2]) + ")") ms.set_pos(float(split_line[1]), float(split_line[2])) else: print( "[scripts] " + coords + " Both X and Y are required for mouse positioning, skipping..." ) elif split_line[0] == "M_SCROLL": if len(split_line) > 2: print("[scripts] " + coords + " Scroll (" + split_line[1] + ", " + split_line[2] + ")") ms.scroll(float(split_line[2]), float(split_line[1])) else: print("[scripts] " + coords + " Scroll " + split_line[1]) ms.scroll(0, float(split_line[1])) elif split_line[0] == "M_LINE": x1 = int(split_line[1]) y1 = int(split_line[2]) x2 = int(split_line[3]) y2 = int(split_line[4]) delay = None if len(split_line) > 5: delay = float(split_line[5]) / 1000.0 skip = 1 if len(split_line) > 6: skip = int(split_line[6]) if (delay == None) or (delay <= 0): print("[scripts] " + coords + " Mouse line from (" + split_line[1] + ", " + split_line[2] + ") to (" + split_line[3] + ", " + split_line[4] + ") by " + str(skip) + " pixels per step") else: print("[scripts] " + coords + " Mouse line from (" + split_line[1] + ", " + split_line[2] + ") to (" + split_line[3] + ", " + split_line[4] + ") by " + str(skip) + " pixels per step and wait " + split_line[5] + " milliseconds between each step") points = ms.line_coords(x1, y1, x2, y2) for x_M, y_M in points[::skip]: if check_kill(x, y, is_async): return -1 ms.set_pos(x_M, y_M) if (delay != None) and (delay > 0): if not safe_sleep(delay, x, y, is_async): return -1 elif split_line[0] == "M_LINE_MOVE": x1 = int(split_line[1]) y1 = int(split_line[2]) delay = None if len(split_line) > 3: delay = float(split_line[3]) / 1000.0 skip = 1 if len(split_line) > 4: skip = int(split_line[4]) if (delay == None) or (delay <= 0): print("[scripts] " + coords + " Mouse line move relative (" + split_line[1] + ", " + split_line[2] + ") by " + str(skip) + " pixels per step") else: print("[scripts] " + coords + " Mouse line move relative (" + split_line[1] + ", " + split_line[2] + ") by " + str(skip) + " pixels per step and wait " + split_line[3] + " milliseconds between each step") x_C, y_C = ms.get_pos() x_N, y_N = x_C + x1, y_C + y1 points = ms.line_coords(x_C, y_C, x_N, y_N) for x_M, y_M in points[::skip]: if check_kill(x, y, is_async): return -1 ms.set_pos(x_M, y_M) if (delay != None) and (delay > 0): if not safe_sleep(delay, x, y, is_async): return -1 elif split_line[0] == "M_LINE_SET": x1 = int(split_line[1]) y1 = int(split_line[2]) delay = None if len(split_line) > 3: delay = float(split_line[3]) / 1000.0 skip = 1 if len(split_line) > 4: skip = int(split_line[4]) if (delay == None) or (delay <= 0): print("[scripts] " + coords + " Mouse line set (" + split_line[1] + ", " + split_line[2] + ") by " + str(skip) + " pixels per step") else: print("[scripts] " + coords + " Mouse line set (" + split_line[1] + ", " + split_line[2] + ") by " + str(skip) + " pixels per step and wait " + split_line[3] + " milliseconds between each step") x_C, y_C = ms.get_pos() points = ms.line_coords(x_C, y_C, x1, y1) for x_M, y_M in points[::skip]: if check_kill(x, y, is_async): return -1 ms.set_pos(x_M, y_M) if (delay != None) and (delay > 0): if not safe_sleep(delay, x, y, is_async): return -1 elif split_line[0] == "LABEL": print("[scripts] " + coords + " Label: " + split_line[1]) return idx + 1 elif split_line[0] == "IF_PRESSED_GOTO_LABEL": print("[scripts] " + coords + " If key is pressed goto LABEL " + split_line[1]) if lp_events.pressed[x][y]: return labels[split_line[1]] elif split_line[0] == "IF_UNPRESSED_GOTO_LABEL": print("[scripts] " + coords + " If key is not pressed goto LABEL " + split_line[1]) if not lp_events.pressed[x][y]: return labels[split_line[1]] elif split_line[0] == "GOTO_LABEL": print("[scripts] " + coords + " Goto LABEL " + split_line[1]) return labels[split_line[1]] elif split_line[0] == "REPEAT_LABEL": print("[scripts] " + coords + " Repeat LABEL " + split_line[1] + " " + split_line[2] + " times max") if idx in repeats: if repeats[idx] > 0: print("[scripts] " + coords + " " + str(repeats[idx]) + " repeats left.") repeats[idx] -= 1 return labels[split_line[1]] else: print("[scripts] " + coords + " No repeats left, not repeating.") else: repeats[idx] = int(split_line[2]) repeats_original[idx] = int(split_line[2]) print("[scripts] " + coords + " " + str(repeats[idx]) + " repeats left.") repeats[idx] -= 1 return labels[split_line[1]] elif split_line[0] == "IF_PRESSED_REPEAT_LABEL": print("[scripts] " + coords + " If key is pressed repeat LABEL " + split_line[1] + " " + split_line[2] + " times max") if lp_events.pressed[x][y]: if idx in repeats: if repeats[idx] > 0: print("[scripts] " + coords + " " + str(repeats[idx]) + " repeats left.") repeats[idx] -= 1 return labels[split_line[1]] else: print( "[scripts] " + coords + " No repeats left, not repeating.") else: repeats[idx] = int(split_line[2]) print("[scripts] " + coords + " " + str(repeats[idx]) + " repeats left.") repeats[idx] -= 1 return labels[split_line[1]] elif split_line[0] == "IF_UNPRESSED_REPEAT_LABEL": print("[scripts] " + coords + " If key is not pressed repeat LABEL " + split_line[1] + " " + split_line[2] + " times max") if not lp_events.pressed[x][y]: if idx in repeats: if repeats[idx] > 0: print("[scripts] " + coords + " " + str(repeats[idx]) + " repeats left.") repeats[idx] -= 1 return labels[split_line[1]] else: print( "[scripts] " + coords + " No repeats left, not repeating.") else: repeats[idx] = int(split_line[2]) print("[scripts] " + coords + " " + str(repeats[idx]) + " repeats left.") repeats[idx] -= 1 return labels[split_line[1]] elif split_line[0] == "@SIMPLE": print("[scripts] " + coords + " Simple keybind: " + split_line[1]) #PRESS key = kb.sp(split_line[1]) releasefunc = lambda: kb.release(key) kb.press(key) #WAIT_UNPRESSED while lp_events.pressed[x][y]: sleep(DELAY_EXIT_CHECK) if check_kill(x, y, is_async, releasefunc): return idx + 1 #RELEASE kb.release(key) elif split_line[0] == "@LOAD_LAYOUT": layout_name = " ".join(split_line[1:]) print("[scripts] " + coords + " Load layout " + layout_name) layout_path = os.path.join(files.LAYOUT_PATH, layout_name) if not os.path.isfile(layout_path): print("[scripts] " + coords + " ERROR: Layout file does not exist.") return -1 try: layout = files.load_layout(layout_path, popups=False, save_converted=False) except files.json.decoder.JSONDecodeError: print("[scripts] " + coords + " ERROR: Layout is malformated.") return -1 if files.layout_changed_since_load: files.save_lp_to_layout(files.curr_layout) files.load_layout_to_lp(layout_path, popups=False, save_converted=False, preload=layout) elif split_line[0] == "OPEN": path_name = " ".join(split_line[1:]) print("[scripts] " + coords + " Open file or folder " + path_name) files.open_file_folder(path_name) elif split_line[0] == "RELEASE_ALL": print("[scripts] " + coords + " Release all keys") kb.release_all() elif split_line[0] == "RESET_REPEATS": print("[scripts] " + coords + " Reset all repeats") for i in repeats: repeats[i] = repeats_original[i] else: print("[scripts] " + coords + " Invalid command: " + split_line[0] + ", skipping...") return idx + 1
def Process(self, btn, idx, split_line): x = self.Get_param(btn, 1) y = self.Get_param(btn, 2) ms.set_pos(x, y)