Advertisement
egor230

Mouse_libs.py

Mar 3rd, 2024 (edited)
801
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 50.94 KB | Gaming | 0 0
  1. import time, json, os, copy, psutil, threading, re,  glob, subprocess, psutil, pyautogui
  2. from tkinter import *
  3. from tkinter.ttk import Combobox  # импортируем только то что надо
  4. from tkinter import ttk
  5. from PIL._tkinter_finder import tk
  6. from tkinter import messagebox
  7. from tkinter import filedialog
  8. from os import path
  9.  
  10. from apport import logging
  11. from deepdiff import DeepDiff
  12. import keyboard as keybord_from # Управление мышью
  13. from pynput import mouse, keyboard
  14. from pynput.mouse import Button as Button_Controller, Controller
  15. from pynput.keyboard import Key, Listener # Создаем экземпляр класса Controller для управления мышью
  16. def show_message(): # Вызов функции для отображения окна
  17.   messagebox.showinfo("Ошибка", "Требуется запустить с root правами")
  18. def show_message1(): # Вызов функции для отображения окна
  19.   messagebox.showinfo("Ошибка", "Программа уже запущена")
  20.  
  21. class save_dict:
  22.     def __init__(self):
  23.         self.jnson = {}  # новые настройки.
  24.         self.old_data = {} #старые настройки.
  25.         self.name_games = []  # названия игр
  26.         self.labels = []  # надписи.
  27.         self.var_list = []  # галочки
  28.         self.labels_with_checkmark = {} # словарь надписи с галочками
  29.         self.box_values = [] # Значения боковых кнопок
  30.         self.cur_app=""# Текущая игра.
  31.         self.count=0 # Индекс текущей игры.
  32.         self.id=0 # id устройство.
  33.         self.mouse_button_press = []  # какие кнопки должны быть удержены.
  34.         self.dict_id_values = {}
  35.         self.data="settings control mouse buttons.json"  # файл настроек.
  36.         self.path_current_app='' # Текущий путь к игре.
  37.         self.add_button_start = 0
  38.         self.process_id_active = 0 # id активного окна
  39.         self.pid_and_path_window={} # Словарь игр и путей к ним.
  40.         self.current_path_game = "" # Путь к запущенной к игре.
  41.         self.prev_game = ""
  42.         self.thr=0
  43.     def get_thread(self):  # Сохранить текущий путь к игре
  44.       return self.thr
  45.  
  46.     def set_thread(self, thr1):
  47.       self.thr= thr1
  48.  
  49.     def get_current_path_game(self):  # Сохранить текущий путь к игре
  50.       return self.current_path_game
  51.  
  52.     def set_current_path_game(self, current_path_game):
  53.       self.current_path_game= current_path_game
  54.  
  55.     def get_prev_game(self):  # Сохранить текущий путь к игре
  56.       return self.prev_game
  57.  
  58.     def set_prev_game(self, prev_game):
  59.       self.prev_game= prev_game
  60.     def get_pid_and_path_window(self):#
  61.       return self.pid_and_path_window
  62.  
  63.     def set_pid_and_path_window(self, pid_and_path_window):  #
  64.       self.pid_and_path_window = pid_and_path_window
  65.  
  66.     def get_process_id_active(self):
  67.       return self.process_id_active
  68.  
  69.     def set_process_id_active(self, process_id_active):  #
  70.       self.process_id_active = process_id_active
  71.  
  72.     def get_id(self):
  73.        return self.id
  74.  
  75.     def get_add_button_start(self):# Получить кнопку.
  76.        return self.add_button_start
  77.  
  78.     def set_add_button_start(self, add_button_start):# Установить кнопку.
  79.        self.add_button_start = add_button_start
  80.  
  81.     def get_current_app_path(self):# Получить путь текущего окна.
  82.        return self.path_current_app
  83.  
  84.     def set_current_app_path(self, app):# Установить путь текущего окна.
  85.        self.path_current_app = app
  86.     def return_name_games(self):  # Вернуть список названия игр.
  87.         name_games =self.name_games
  88.         return self.name_games
  89.  
  90.     def return_mouse_button_press(self):
  91.        return self.mouse_button_press
  92.  
  93.     def return_labels(self):
  94.        return self.labels
  95.  
  96.     def return_var_list(self):
  97.        return self.var_list
  98.  
  99.     def return_labels_with_checkmark(self):
  100.        return self.labels_with_checkmark
  101.  
  102.     def return_box_values(self):
  103.        return self.box_values
  104.  
  105.     def return_list_mouse_button_press(self): # какие кнопки должны быть удержанны для текущий игры.
  106.      return list(self.jnson["mouse_press"][self.cur_app])
  107.  
  108.     def save_mouse_button_press(self, list_mouse_button_press=None,  mouse_button_press=None):
  109.       if mouse_button_press == None:
  110.         mouse_button_press= self.mouse_button_press
  111.       self.mouse_button_press=mouse_button_press
  112.       if list_mouse_button_press == None:
  113.        list_mouse_button_press=[] # Сохранить список какие кнопки должны быть удержанны.
  114.        for i in range(len(mouse_button_press)):
  115.          list_mouse_button_press.append(mouse_button_press[i].get())
  116.  
  117.       self.jnson["mouse_press"][self.cur_app]= list(list_mouse_button_press)
  118.  
  119.     def save_jnson(self, jn):# сохранить  новые настройки
  120.      self.jnson= jn
  121.  
  122.     def save_old_data(self, jnson):# сохранить начальные настройки.
  123.       self.old_data= copy.deepcopy(jnson)
  124.       self.jnson = jnson
  125.  
  126.     def return_jnson(self):# Вернуть новые настройки.
  127.        return self.jnson
  128.  
  129.     def return_old_data(self):
  130.        return self.old_data
  131.  
  132.     def set_cur_app(self, cur_app):# установить текущего игру
  133.      self.cur_app=str(cur_app)
  134.      self.jnson["current_app"]=self.cur_app
  135.  
  136.     def get_cur_app(self):
  137.        return self.cur_app
  138.  
  139.     def set_count(self, count):
  140.         self.count=count
  141.         return self.count
  142.     def get_count(self):
  143.        return self.count
  144.  
  145.     def set_id(self, id):
  146.         self.id=id
  147.     def set_values_box(self):
  148.      box_value=self.jnson["key_value"][self.cur_app]
  149.      for i in range(len(self.box_values)):
  150.        self.box_values[i].set(box_value[i])
  151.     def set_box_values(self, add_button_start):  # Установить значение для выпадающего списка.
  152.       self.reset_id_value()
  153.       res = self.jnson
  154.       key_values = res["key_value"]
  155.       d = list(res["paths"].keys())  # получить словарь путей и имен файлов.  # print(self.cur_app)    # print(self.count)      # print(d[self.count])
  156.       self.set_cur_app(d[self.count])  # установить текущую активную строку.
  157.       self.jnson["current_app"] = d[self.count]  # Сохранить текущую активную строку.
  158.       if add_button_start["state"] == "disabled":  # Если выкл кнопку старт.
  159.         add_button_start["state"] = "normal"  # вкл кнопку старт.       # print(self.jnson["current_app"])
  160.       self.set_values_box()
  161.       return self
  162.     def write_to_file(self, new_data):
  163.      json_string = json.dumps(new_data, ensure_ascii=False, indent=2)   #self.data # файл настроек.
  164.      with open(self.data, "w", encoding="UTF-8") as w:
  165.        w.write(json_string)  # сохранить изменения в файле настроек.
  166.      #data1=self.data.replace(' ','\ ')# Преобразовать путь до файл настроек.
  167.      file_relus = '''#!/bin/bash\n
  168.                     chmod a+rw \"{0}\" '''.format(self.data)
  169.      subprocess.call(['bash', '-c', file_relus])# Дать доступ на чтение и запись любому
  170.      return self
  171.  
  172.     def get_list_ids(self):# Получение списка id устройств.
  173.       # Команда shell для получения списка идентификаторов устройств ввода (мышей), которые подключены к системе.
  174.       get_ids = '''#!/bin/bash
  175.      ids=$(xinput list | grep -Ei "id=[0-9]+" | grep -oE "id=[0-9]+" | cut -d= -f2)
  176.       for id in $ids; do
  177.        output=$(xinput get-button-map "$id" 2>&1)
  178.        # Исключаем сообщения об ошибках, добавляя проверки на наличие ошибок
  179.        if [[ $output != *"device has no buttons"* && $output != *"X Error of failed request:"* ]]; then
  180.            echo "$id:$output"
  181.        fi
  182.       done'''
  183.  
  184.       # Выполнение вышеуказанной команды shell в подпроцессе и декодирование результата в строку.
  185.       id_list = subprocess.check_output(['bash', '-c', get_ids]).decode().splitlines()
  186.       button_map = {}      # Создание словаря для хранения соответствия между идентификаторами устройств и их кнопками.
  187.  
  188.       # Перебор всех элементов в списке id устройств.
  189.       for item in id_list:        # Разделение элемента на ключ (id устройства) и значение (кнопок).
  190.         key, value = item.split(':', 1)
  191.         button_map[int(key)] = value.strip()
  192.  
  193.      # Добавление в словарь button_map кнопок устройства с соответствующим идентификатором.
  194.  
  195.       self.dict_id_values = button_map      # Сохранение карты кнопок в атрибут объекта.
  196.       id_list = list(button_map.keys())      # Сохранение списка идентификаторов в переменной id_list.
  197.       self.id = id_list[0]    # Установка первого устройства в списке как текущего id для использования.
  198.       id_list=sorted(id_list)
  199.       return id_list      # Возвращение списка id устройств для дальнейшего использования.
  200.  
  201.     def get_state_thread(self):
  202.        return self.thread
  203.  
  204.     def set_default_id_value(self, add_button_start):# Вернуть значения по умолчанию
  205.       self.thread = True  # Прервать выполнение потока обработчика нажатий.
  206.       add_button_start["state"] = "normal"  # выкл кнопку старт.
  207.       for id in self.dict_id_values:
  208.         st= str(self.dict_id_values[id])
  209.         set_button_map = '''#!/bin/bash
  210.          sudo xinput set-button-map {0} {1}
  211.          '''.format(id, st)
  212.         subprocess.call(['bash', '-c', set_button_map])
  213.  
  214.     def reset_id_value(self):  # Сброс настроек текущего id устройства.       #  print(self.id)
  215.       d = '1 2 3 4 5 6 7 8 9'  #      print("reset_id_value")
  216.       set_button_map = '''#!/bin/bash
  217.          sudo xinput set-button-map {0} {1}
  218.          '''.format(self.id, d)
  219.       subprocess.call(['bash', '-c', set_button_map])
  220.  
  221.     def get_default_id_value(self):#
  222.       d = self.dict_id_values[self.get_id()]
  223.       d_copy = copy.deepcopy(d)
  224.       d='1 2 3 4 5 6 7 8 9'
  225.       return d
  226.     def write_in_log(self, text=" error"):# Запись ошибок.
  227.        with open("log.txt", "a") as f:
  228.          f.write(str(text)+"\n")
  229.  
  230.        file_relus = '''#!/bin/bash
  231.                     chmod a+rw {}   '''.format("log.txt")
  232.        subprocess.call(['bash', '-c', file_relus])# Дать доступ на чтение и запись любому
  233.  
  234.     def preparation(self, dictio, games_checkmark_paths):  # games_checkmark_paths  список путей к играм
  235.       id = self.get_id()  # Получаем id устройства
  236.       old = self.get_default_id_value().split()  # Получить конфигурацию по умолчанию
  237.       game = str(self.get_cur_app())
  238.  
  239.       key = dictio["key_value"][game]
  240.       a1, a2, a3, a4, a5, a6, k = get_keys_buttons(key)
  241.       list_mouse_check_button = self.return_mouse_button_press()  # print(key)  # какие кнопки будут работать.
  242.       press_button = dictio['mouse_press'][game]
  243.       self.reset_id_value()  # Сброс настроек текущего id устройства.
  244.       list_buttons = {"Button.button11": a1, a1: 1, "Button.button12": a2, a2: 2,  # Правая и средняя кнопка на мыши.
  245.                       "Button.button13": a3, a3: 3, "Button.button14": a4, a4: 4,  # Колёсико мыши вверх и вниз.
  246.                       "Button.button16": a5, a5: 5, "Button.button15": a6, a6: 6}  # , "Button.button11"]
  247.       if key != defaut_list_mouse_buttons:  # словарь называния кнопок мыши их значения для эмуляции
  248.         for i in range(len(old)):
  249.           if int(old[i]) in k:
  250.             old[i] = k[int(old[i])]  # Преобразование списка обратно в строку
  251.         # Обновление списка с заменой элементов из словаря
  252.       return key, id, old, a1, a2, a3, a4, a5, a6, k, press_button, game, list_buttons
  253. def remove_before_second_slash(path):
  254.   if path == 'C:/Windows/explorer.exe':
  255.     return path
  256.   parts = path.split('/', 3)    # Split the path at the first two slashes
  257.   if len(parts) >= 4:  # Check if there are at least two slashes
  258.     return '/' + parts[3]    # Return the part after the second slash with a leading slash
  259.   else:   # In case the path does not have two slashes, return an empty string
  260.     return 'C:/Windows/explorer.exe'
  261. def is_path_in_list(path, path_list):#проверяет, содержится ли путь в списке путей.
  262.     return any(path in item for item in path_list)
  263. def get_index_of_path(path, path_list):
  264.   index = next(index for index, item in enumerate(path_list) if path in item)
  265.   return index#находит индекс пути в списке путей и возвращает соответствующий элемент списка.
  266. get_user_name = f'''#!/bin/bash
  267. current_user=$(whoami);
  268. echo $current_user
  269. exit;# Завершаем выполнение скрипта
  270. '''
  271. user = subprocess.run(['bash'], input=get_user_name, stdout=subprocess.PIPE, text=True).stdout.strip()
  272. get_main_id = '''#!/bin/bash # Получаем идентификатор активного окна
  273.    active_window_id=$(xdotool getactivewindow 2>/dev/null)
  274.    if [ -n "$active_window_id" ]; then
  275.        process_id_active=$(xdotool getwindowpid "$active_window_id" 2>/dev/null)
  276.        echo "$process_id_active"
  277.    else
  278.        echo "0"  # Или любое значение по умолчанию, если нет активного окна
  279.    fi
  280.    exit'''
  281. def get_pid_and_path_window():# Получаем идентификатор активного окна
  282.  try:
  283.     process_id = int(subprocess.run(['bash'], input=get_main_id, stdout=subprocess.PIPE, text=True).stdout.strip())
  284.     a = []
  285.     result = str(subprocess.run(['ps', 'aux'], stdout=subprocess.PIPE, text=True).stdout)  # # print(result)
  286.     lines = result.split('\n')
  287.     a = [line for line in lines if user in line]  # Убираем 'root' из условия
  288.     data_dict = {}
  289.     pattern = r"(/mnt/.*?\.exe)"  # Регулярное выражение для поиска полного пути, начинающегося с /mnt/
  290.     # Регулярное выражение для поиска полного пути, начинающегося с /mnt/
  291.     for i in a:
  292.       dir_process_name = i.split(maxsplit=10)[10].replace('\\', '/')  # Извлекаем нужную часть строки
  293.       match = re.search(pattern, dir_process_name)
  294.  
  295.       if match:
  296.         file_path = match.group(1)  # Получаем полный путь
  297.         pid_id = int(i.split()[1])  # id потока
  298.         if ".exe" in file_path:# нужно добавить только те, что имеют exe
  299.           data_dict[pid_id] = file_path  # Добавляем в словарь pid и путь.
  300.     # Вариант 2 ещё один поиск
  301.     pattern = [r"(.*.exe)",r"(.*.EXE)"]
  302.     for i in a:
  303.      for p in pattern:      # print(i)
  304.       dir_process_name = i.split(maxsplit=10)[10].replace('\\', '/')  # Извлекаем нужную часть строки
  305.       match = re.search(p, dir_process_name)
  306.       if match:
  307.        file_path = match.group(1)  # Получаем полный путь
  308.        pid_id = int(i.split()[1])  # id потока
  309.        if ".exe" in file_path or ".EXE" in file_path:
  310.         # Разделим строку после .sh
  311.         file_path_after_sh = file_path.split('.sh', 1)[-1].strip()  # Получаем путь после .sh
  312.         data_dict[pid_id] = file_path_after_sh  # Сохраняем только путь после .sh
  313.     return data_dict
  314.  except:
  315.      pass
  316. def check_current_active_window(dict_save, games_checkmark_paths):# Получаем путь  активного окна
  317.  try:
  318.   data_dict=dict_save.get_pid_and_path_window()
  319.   process_id_active=dict_save.get_process_id_active()  # print(data_dict)
  320.   games_checkmark_paths1 = [remove_before_second_slash(path) for path in games_checkmark_paths] # input() # print(data_dict)  print(games_checkmark_paths)
  321.   if data_dict[process_id_active]:
  322.     file_path=data_dict[process_id_active]#
  323.     mnt_index = file_path.rfind('/mnt')
  324.     if mnt_index != -1:    # Извлекаем часть строки от "/mnt" до конца
  325.         file_path = file_path[mnt_index:]
  326.  
  327.     if is_path_in_list(file_path, games_checkmark_paths):  #     # print( games_checkmark_paths[get_index_of_path(file_path, games_checkmark_paths)])     # print(dict_save.get_pid_and_path_window()[dict_save.get_process_id_active()])     print("000000")
  328.      return games_checkmark_paths[get_index_of_path(file_path, games_checkmark_paths)]  # активного окна
  329.     file_path= file_path[1:].replace(':', '')  # Удаляем первую букву и ':\'    # print(file_path)    # print(games_checkmark_paths1)
  330.     if is_path_in_list(file_path, games_checkmark_paths1):  # Portproton     print("Portproton ")     # print(file_path)  #  print(games_checkmark_paths)
  331.      return games_checkmark_paths[get_index_of_path(file_path, games_checkmark_paths1)]
  332.   return dict_save.get_prev_game()# если мы ничего не нашли, вернуть предыдущую конфигурацию.
  333.  except:
  334.    return dict_save.get_prev_game()
  335. def show_list_id_callback():
  336.   show_list_id = f'''#!/bin/bash
  337.   gnome-terminal -- bash -c 'xinput list;
  338.   read;   exec bash' '''#показать список устройств в терминале
  339.   subprocess.run(['bash', '-c', show_list_id])
  340.  
  341. KEYS = {" ": 0x0,"LBUTTON": 'mouse left', "RBUTTON": 'mouse right', "WHEEL_MOUSE_BUTTON": "mouse middle",
  342.         "WHEEL_MOUSE_UP" : "WHEEL_MOUSE_UP", "MBUTTON": 0x04, "SCROLL_UP": "scroll_up",
  343.         "SCROLL_DOWN" : "scroll_down", "XBUTTON1": 0x05, "XBUTTON2": 0x06, "BACKSPACE": "BackSpace",
  344.         "TAB": "Tab", "CLEAR": 0x0C, "RETURN": "Return", "KP_Enter" : "KP_Enter",
  345.          "Shift_L":"Shift_L", "CONTROL": "CONTROL", "MENU": 0x12, "PAUSE": 0x13, "CAPITAL": 0x14,
  346.         "KANA": 0x15, "JUNJA": 0x17, "FINAL": 0x18, "KANJI": 0x19, "ESCAPE": 0x1B,
  347.         "CONVERT": 0x1C, "NONCONVERT": 0x1D, "ACCEPT": 0x1E, "MODECHANGE": 0x1F, "SPACE": "space",
  348.         "PRIOR": 0x21, "NEXT": 0x22, "END": "0x23", "HOME": "Home", "LEFT": 0x25, "UP": 0x26,
  349.         "RIGHT": 0x27, "DOWN": 0x28, "SELECT": 0x29, "PRINT": 0x2A, "EXECUTE": 0x2B, "SNAPSHOT": 0x2C,
  350.         "INSERT": 0x2D, "DELETE": "Delete", "HELP": 0x2F,  "LWIN": "Super_L", "RWIN": "Super_R",
  351.  
  352.         "KEY0": 0, "KEY1": 1, "KEY2": 2, "KEY3": 3, "KEY4": 4, "KEY5": 5, "KEY6": 6,
  353.         "KEY7": 7, "KEY8": 8, "KEY9": 9, "A": "A", "B": "B", "C": "C", "D": "D", "E": "E", "F": "F",
  354.         "G": "G", "H": "H", "I": "I", "J": "J", "K": "K", "L": "L", "M": "M", "N": "N", "O": "O",
  355.         "P": "P", "Q": "Q", "R": "R", "S": "S", "T": "T", "U": "U", "V": "V", "W": "W", "X": "X", "Y": "Y",
  356.         "Z": "Z",
  357.  
  358.         "APPS": 0x5D, "SLEEP": 0x5F, "NUMPAD0": 0x60, "NUMPAD1": 79,
  359.         "NUMPAD2": 80, "NUMPAD3": 81, "NUMPAD4": 82, "NUMPAD5": 83, "NUMPAD6": 84, "NUMPAD7": 85,
  360.         "NUMPAD8": 86, "NUMPAD9": 87, "MULTIPLY": 0x6A, "ADD": 78, "SEPARATOR": 0x6C, "SUBTRACT": 0x6D,
  361.         "DECIMAL": 0x6E, "DIVIDE": 0x6F, "F1": "F1", "F2": "F2", "F3": "F3", "F4": "F4", "F5": "F5",
  362.         "F6": "F6", "F7": "F7", "F8": "F8", "F9": "F9", "F10": "F10", "F11": "F11", "F12": "F12",
  363.  
  364.         "F13": 0x7C, "F14": 0x7D, "F15": 0x7E, "F16": 0x7F, "F17": 0x80, "F18": 0x81, "F19": 0x82, "F20": 0x83, "F21": 0x84,
  365.         "F22": 0x85, "F23": 0x86, "F24": 0x87,"NUMLOCK": "Num_Lock", "SCROLL": "Scroll_Lock",
  366.          "OEM_FJ_JISHO": 0x92, "OEM_FJ_MASSHOU": 0x93,
  367.         "OEM_FJ_TOUROKU": 0x94, "OEM_FJ_LOYA": 0x95, "OEM_FJ_ROYA": 0x96, "LSHIFT": "Shift_L", "RSHIFT": "Shift_R", "LCONTROL": "ISO_Next_Group",
  368.         "RCONTROL": "Control_R",  "LMENU": 0xA4, "RMENU": 0xA5, "BROWSER_BACK": 0xA6,
  369.         "BROWSER_FORWARD": 0xA7, "BROWSER_REFRESH": 0xA8, "BROWSER_STOP": 0xA9, "BROWSER_SEARCH": 0xAA, "BROWSER_FAVORITES": 0xAB,
  370.         "BROWSER_HOME": 0xAC, "VOLUME_MUTE": 0xAD, "VOLUME_DOWN": 0xAE,
  371.         "VOLUME_UP": 0xAF, "MEDIA_NEXT_TRACK": 0xB0, "MEDIA_PREV_TRACK": 0xB1, "MEDIA_STOP": 0xB2, "MEDIA_PLAY_PAUSE": 0xB3, "LAUNCH_MAIL": 0xB4, "LAUNCH_MEDIA_SELECT": 0xB5, "LAUNCH_APP1": 0xB6,
  372.         "LAUNCH_APP2": 0xB7, "OEM_1": 0xBA, "OEM_PLUS": 0xBB, "OEM_COMMA": 0xBC, "OEM_MINUS": 0xBD, "OEM_PERIOD": 0xBE, " OEM_2": 0xBF, "OEM_3": 0xC0, "ABNT_C1": 0xC1, "ABNT_C2": 0xC2, "OEM_4": 0xDB,
  373.         "OEM_5": 0xDC, "OEM_6": 0xDD, "OEM_7": 0xDE, "OEM_8": 0xDF, "OEM_AX": 0xE1,
  374.         "OEM_102": 0xE2, "ICO_HELP": 0xE3, "PROCESSKEY": 0xE5, "ICO_CLEAR": 0xE6, "PACKET": 0xE7, "OEM_RESET": 0xE9, "OEM_JUMP": 0xEA, "OEM_PA1": 0xEB, "OEM_PA2": 0xEC, "OEM_PA3": 0xED,
  375.         "OEM_WSCTRL": 0xEE, "OEM_CUSEL": 0xEF, "OEM_ATTN": 0xF0, "OEM_FINISH": 0xF1, "OEM_COPY": 0xF2, "OEM_AUTO": 0xF3, "OEM_ENLW": 0xF4, "OEM_BACKTAB": 0xF5, "ATTN": 0xF6, "CRSEL": 0xF7, "EXSEL": 0xF8, " EREOF": 0xF9, "PLAY": 0xFA, "ZOOM": 0xFB, "PA1": 0xFD, " OEM_CLEAR": 0xFE
  376.         }
  377.  
  378. LIST_MOUSE_BUTTONS=["Левая кнопка","Правая кнопка","Средняя","Колесико вверх","Колесико вниз","1 боковая","2 боковая"]
  379. LIST_KEYS = list(KEYS.keys())
  380. defaut_list_mouse_buttons=['LBUTTON', 'RBUTTON', 'WHEEL_MOUSE_BUTTON', 'SCROLL_UP', 'SCROLL_DOWN', 'XBUTTON1', 'XBUTTON2']
  381. class ToolTip(object):
  382.  
  383.     def __init__(self, widget):
  384.         self.widget = widget
  385.         self.tipwindow = None
  386.         self.id = None
  387.         self.x = self.y = 0
  388.  
  389.     def showtip(self, text):
  390.         "Display text in tooltip window"
  391.         self.text = text
  392.         if self.tipwindow or not self.text:
  393.             return
  394.         x, y, cx, cy = self.widget.bbox("insert")
  395.         x = x + self.widget.winfo_rootx() + 27
  396.         y = y + cy + self.widget.winfo_rooty() +7
  397.         self.tipwindow = tw = Toplevel(self.widget)
  398.         tw.wm_overrideredirect(1)
  399.         tw.wm_geometry("+%d+%d" % (x, y))
  400.         label = Label(tw, text=self.text, justify=LEFT, background="#ffffe0", relief=SOLID, borderwidth=1,
  401.                       font=("tahoma", "10", "normal"))
  402.         label.pack(ipadx=1)
  403.  
  404.     def hidetip(self):
  405.         tw = self.tipwindow
  406.         self.tipwindow = None
  407.         if tw:
  408.             tw.destroy()
  409.  
  410. def CreateToolTip(widget, text):
  411.     toolTip = ToolTip(widget)
  412.     def enter(event):
  413.         toolTip.showtip(text)
  414.     def leave(event):
  415.         toolTip.hidetip()
  416.     widget.bind('<Enter>', enter)
  417.     widget.bind('<Leave>', leave)
  418. def hide_tooltip(self, event):
  419.   if self.tooltip:
  420.     self.tooltip.destroy()
  421.     self.tooltip = None
  422.  
  423. class Job(threading.Thread):
  424.  def __init__(self, key, *args, **kwargs):
  425.   self.key=key
  426.   self.sw=True
  427.   self.hook_flag_mouse=True  # захват кнопки мыши.
  428.   super(Job, self).__init__(*args, **kwargs)
  429.   self.__flag = threading.Event() # The flag used to pause the thread
  430.   self.__flag.set() # Set to True
  431.   self.__running = threading.Event() # Used to stop the thread identification
  432.   self.__running.set() # Set running to True
  433.  
  434.  def run(self):
  435.   time.sleep(0.00001)
  436.   while self.__running.is_set():
  437.    self.__flag.wait() # return immediately when it is True, block until the internal flag is True when it is False
  438.    time.sleep(0.008)
  439.    if self.key== "SCROLL_UP":
  440.      thread = threading.Thread(target= key_work.mouse_wheel_up)
  441.      thread.daemon = True  # Установка атрибута daemon в значение True
  442.      thread.start()      # key_work.mouse_wheel_up()
  443.    if self.key== "SCROLL_DOWN":
  444.      thread1 = threading.Thread(target= key_work.mouse_wheel_donw)
  445.      thread1.daemon = True  # Установка атрибута daemon в значение True
  446.      thread1.start()      # key_work.mouse_wheel_donw()   # keybord_from.press(self.key)
  447.    # keybord_from.release(self.key)   # print(self.key)   # directinput.keyDown(str( self.key).lower())
  448.  def pause(self):
  449.   self.__flag.clear() # Set to False to block the thread
  450.  
  451.  def resume(self):
  452.   self.__flag.set() # Set to True, let the thread stop blocking
  453.  def stop(self):
  454.   self.__flag.set() # Resume the thread from the suspended state, if it is already suspended
  455.   self.__running.clear() # Set to False
  456.  
  457.  def set_sw(self, value):
  458.    self.sw=value
  459.  def get_sw(self):
  460.   return self.sw
  461.  def set_hook_flag_mouse(self, value):
  462.    self.hook_flag_mouse=value
  463.  def get_hook_flag_mouse(self):
  464.   return self.hook_flag_mouse
  465. def return_job(key, number):
  466.   a1 = Job(key[number])
  467.   a1.start()
  468.   a1.pause()
  469.   return a1
  470. def get_keys_buttons(key):  # Получение конфигуляции кнопок.
  471.   a1, a2, a3, a4, a5, a6, k = 0, 0, 0, 0, 0, 0, {}  # правая кнопка мыши, средняя,
  472.   # колёсико мыши вверх, колёсико мыши вниз, первая боковая кнопка,  вторая боковая кнопка, словарь print(key)
  473.   if key[1] == "RBUTTON":  # Если на правую кнопку нечего не назначено.        print("lk")
  474.     pass
  475.   else:
  476.     a1 = return_job(key, 1)  # эмулировать правую кнопку
  477.     k[3] = '11'
  478.   if key[2] == " " or key[2] == "WHEEL_MOUSE_BUTTON":  # если на средную кнопку нечего не назначено.
  479.     pass
  480.   else:
  481.     a2 = return_job(key, 2)  # эмулировать среднюю кнопку
  482.     k[2] = '12'
  483.   if key[3] == "SCROLL_UP":  # если на колёсико мыши вверх нечего не назначено.
  484.     pass
  485.   else:
  486.     a3 = return_job(key, 3)  # эмулировать колёсико мыши вверх
  487.     k[4] = '13'
  488.   if key[4] == " " or key[4] == "SCROLL_DOWN":  # если на колёсико мыши вниз нечего не назначено.
  489.     pass
  490.   else:
  491.     a4 = return_job(key, 4)  # эмулировать колёсико мыши вниз
  492.     k[5] = '14'
  493.  
  494.   if key[5] == "XBUTTON1":  # если на боковую кнопку нечего не назначено.
  495.     pass
  496.   else:
  497.     a5 = return_job(key, 5)  # эмулировать первую боковую кнопку
  498.     k[9] = '16'
  499.   if key[6] == "XBUTTON2":  # если на боковую кнопку нечего не назначено.
  500.     pass
  501.   else:
  502.     a6 = return_job(key, 6)  # эмулировать вторую боковую кнопку
  503.     k[8] = '15'
  504.   return a1, a2, a3, a4, a5, a6, k
  505.  
  506. class work_key:
  507.   def __init__(self):
  508.     self.keys_list = ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd', 'f', 'g',
  509.                       'h', 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ]
  510.     self.keys_list1 = ['BackSpace', 'Tab', 'Return', 'KP_Enter', 'Escape', 'Delete', 'Home', 'End', 'Page_Up',
  511.    'Page_Down', 'F1', 'Up', 'Down', 'Left', 'Right', 'Control_L', 'ISO_Next_Group', 'Control_R', 'Shift_L', 'Shift_R', 'Alt_L', 'Alt_R', 'Super_L',
  512.     'Super_R', 'Caps_Lock', 'Num_Lock', 'Scroll_Lock', 'space', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'F10', 'F11', 'F12']
  513.  
  514.   def mouse_wheel_up(self):  #
  515.     mouse_wheel = '''#!/bin/bash
  516.        xdotool click  {0}    '''.format(4)
  517.     subprocess.call(['bash', '-c', mouse_wheel])
  518.   def mouse_wheel_donw(self):  #
  519.     mouse_wheel = '''#!/bin/bash
  520.        xdotool click  {0}    '''.format(5)
  521.     subprocess.call(['bash', '-c', mouse_wheel])
  522.   def mouse_right_donw(self):  #Правая кнопки мыши
  523.     pyautogui.click(button='right')
  524.     # mouse_right_donw1 = '''#!/bin/bash
  525.     #     xdotool click  {0}    '''.format(3)
  526.     # subprocess.call(['bash', '-c', mouse_right_donw1])
  527.   def mouse_middle_donw(self):  #Средняя.
  528.       # Нажимаем среднюю кнопку мыши
  529.       pyautogui.click(button='middle')
  530.       mouse_wheel = '''#!/bin/bash
  531.          xdotool click  {0}    '''.format(2)
  532.       # subprocess.call(['bash', '-c', mouse_wheel])
  533.   def key_press(self, key, number_key):# Нажать.
  534.     press = '''#!/bin/bash
  535.    xte 'keydown {0}'  '''
  536.     if key in self.keys_list1:
  537.      thread1 = threading.Thread(target=lambda: subprocess.call(['bash', '-c', press.format(key)]))
  538.      #thread1.daemon = True  # Установка атрибута daemon в значение True
  539.      thread1.start()
  540.      return 0
  541.     key1= key.lower()    # print(key1)
  542.     if key1 in self.keys_list:
  543.       thread = threading.Thread(target=lambda: subprocess.call(['bash', '-c', press.format(key)]))
  544.       #thread.daemon = True  # Установка атрибута daemon в значение True
  545.       thread.start()     # print(key1)     # subprocess.call(['bash', '-c', press.format(key1)])
  546.     else:
  547.       keybord_from.press(KEYS[key[number_key]])
  548.  
  549.   def key_release(self, key, number_key):# Опустить.
  550.     # print("key_release")
  551.     release = '''#!/bin/bash
  552.    xte 'keyup {0}'    '''
  553.     if key in self.keys_list1:
  554.      thread = threading.Thread(target=lambda: subprocess.call(['bash', '-c', release.format(key)]))
  555.      if number_key != 3 or number_key != 4:# избежать зависание колесика мыши.
  556.       thread.daemon = True  # Установка атрибута daemon в значение True
  557.      thread.start()   # print(key)     # subprocess.call(['bash', '-c', release.format(key)])
  558.      return 0
  559.     key1= key.lower()
  560.     if key1 in self.keys_list:      # subprocess.call(['bash', '-c', release.format(key1)])
  561.      thread1 = threading.Thread(target=lambda: subprocess.call(['bash', '-c', release.format(key)]))
  562.      if number_key != 3 or number_key != 4:# избежать зависание колесика мыши.
  563.       thread1.daemon = True  # Установка атрибута daemon в значение True
  564.       thread1.start()
  565.     else:
  566.       keybord_from.release(KEYS[key[number_key]])
  567.  
  568.   def key_press_release(self,  key, number_key):  #
  569.     pass
  570.     # press_release = '''#!/bin/bash
  571.     # xte 'keydown {}' 'keyup {}'
  572.     # '''
  573.     # if key in self.keys_list:
  574.     #   subprocess.call(['bash', '-c', press_release.format(key, key)])
  575.     #
  576.     # else:
  577.     #
  578.     #   keybord_from.press(KEYS[key[number_key]])
  579.  
  580. def show_tooltip(self, event):
  581.   x, y, _, _ = self.widget.bbox("insert")
  582.   x += self.widget.winfo_rootx() + 25
  583.   y += self.widget.winfo_rooty() + 25
  584.  
  585.   self.tooltip = root.Toplevel(self.widget)
  586.   self.tooltip.wm_overrideredirect(True)
  587.   self.tooltip.wm_geometry(f"+{x}+{y}")
  588.  
  589.   label = root.Label(self.tooltip, text=self.text, background="#ffffe0", relief="solid", borderwidth=1)
  590.   label.pack()
  591.  
  592.     #    a.resume()
  593.     # if pres == False:
  594.     #     a.pause()
  595.   # else:# Флажок стоит.
  596.    # if  pres == False:
  597.    #     mouse1.press(list_mouse_button_names[key[number_key]])  # Нажимаем кнопку мыши.
  598.    # else:  # Отпускаем кнопку мыши.
  599.    #      mouse1.release(list_mouse_button_names[key[number_key]])
  600.  
  601. sticking_right_mouse=False
  602. def mouse_key(key, number_key,press_button,list_mouse_button_names, pres, a):
  603.  global sticking_right_mouse
  604.  try:# list_buttons = {"Button.button10": a6}  # , "Button.button11"]
  605.   # нет залипание кнопок мыши. Оно press_button[number_key] == False отвечает за это
  606.   if press_button[number_key] == False and key[number_key] == "SCROLL_DOWN" or key[number_key] =="SCROLL_UP" : # print(key[number_key])
  607.     if  pres == True:# колёсика мышки.
  608.        a.resume()
  609.     if pres == False:
  610.         a.pause()
  611.   if press_button[number_key] == False and key[number_key] != "SCROLL_DOWN" or key[number_key] != "SCROLL_UP" :
  612.     if  pres == True:# Кнопка  мышки.
  613.       if str(key[number_key])=='RBUTTON':
  614.         key_work.mouse_right_donw()
  615.  
  616.       if str(key[number_key])=='WHEEL_MOUSE_BUTTON':
  617.         key_work.mouse_middle_donw()
  618.  
  619.   # Есть ли залипание есть
  620.   if press_button[number_key] and key[number_key] != "SCROLL_DOWN" or key[number_key] != "SCROLL_UP" :
  621.     if pres == True:# Кнопка мышки нажата.     # print(sticking_right_mouse)
  622.      if str(key[number_key])=='RBUTTON':
  623.       if sticking_right_mouse == False:# нет залипание.
  624.          sticking_right_mouse = True
  625.          pyautogui.mouseDown(button='right')        # Нажимаем и удерживаем правую кнопку мыши
  626.       else:        # print("re")
  627.         # Отпускаем правую кнопку мыши
  628.         pyautogui.mouseUp(button='right')
  629.         sticking_right_mouse =False
  630.  except Exception as e:   #save_dict.write_in_log(e)
  631.    pass
  632.  
  633. key_work =work_key()
  634. def keyboard_press_button(key, pres, number_key, a, press_button):
  635.  try:
  636.   wk = str(KEYS[key[number_key]])  #  print(wk)
  637.  
  638.   if press_button[number_key] == False:  # Не поставлен флажок.
  639.     if pres == True:# нажата.
  640.  
  641.       key_work.key_press(wk, number_key)    # print(str(KEYS[key[number_key]]))         # print("press off")
  642.     if pres == False:
  643.       key_work.key_release(wk, number_key)      # keybord_from.release(KEYS[key[number_key]])  # print("reasle off")
  644.  
  645.   # поставлен флажок.
  646.  
  647.   if press_button[number_key] == True:    # print("ok")
  648.     if pres == True and a.get_sw() == True:
  649.       a.set_sw(False)
  650.       key_work.key_press(wk, number_key)  # print("press off")
  651.       return
  652.     if pres == True and a.get_sw() == False:
  653.       a.set_sw(True)
  654.       key_work.key_release(wk, number_key)
  655.  except Exception as e:   #save_dict.write_in_log(e)
  656.    pass
  657.  
  658. def remove_profile_keys(d, profile):   # Создаем копию словаря, чтобы избежать изменения размера словаря во время итерации
  659.   keys_to_delete = []
  660.   for key, value in d.items():
  661.     if str(key) == str(profile):  # Сравниваем ключ с profile
  662.       keys_to_delete.append(key)
  663.     elif isinstance(value, dict):
  664.       # Рекурсивно вызываем для вложенного словаря
  665.       remove_profile_keys(value, profile)
  666.     elif isinstance(value, list):
  667.       # Если значение — список, обрабатываем каждый элемент
  668.       for item in value:
  669.         if isinstance(item, dict):
  670.           remove_profile_keys(item, profile)
  671.   # Удаляем собранные ключи
  672.   for key in keys_to_delete:
  673.     del d[key]
  674.  
  675. def start1(dict_save, root):# Запуск всего
  676.  if dict_save.get_id()==0:# # получить id устройства.Если id устройство не выбрали.
  677.      messagebox.showinfo("Ошибка", "Вы не выбрали устройство")
  678.      ok_button = Button(root, text="Ок", command=show_list_id_callback)
  679.      return
  680.  dictio=dict_save.return_jnson()
  681.  # Какие игры имеют галочку, получаем их список.
  682.  games_checkmark_paths = [key for key, value in dictio['games_checkmark'].items() if value] # Получить список путей к играм
  683.  gp=str(dict_save.get_cur_app())# текущая игра
  684.  if gp in games_checkmark_paths:# Если текущая игра имеет галочку.  print("Lok")
  685.      add_button_start = dict_save.get_add_button_start()
  686.      add_button_start["state"] = "disabled"# выкл кнопку старт.
  687.      curr_name = dict_save.get_cur_app()  # получить значение текущей активной строки.     # dict_save.set_current_path_game(curr_name)
  688.      prepare(root, dict_save, dictio, games_checkmark_paths)
  689.  
  690.  else: # Вывод ошибки.
  691.    messagebox.showinfo("Ошибка", "Нужно выбрать приложенние")
  692.  
  693. def check_mouse_script(res, dict_save, defaut_list_mouse_buttons, number_key):
  694.  try:
  695.   key_mouse_scrypt = res["script_mouse"][dict_save.get_cur_app()][defaut_list_mouse_buttons[number_key]]
  696.   if dict_save.get_cur_app() in res["script_mouse"]:
  697.     mouse_button = defaut_list_mouse_buttons[number_key]
  698.     if mouse_button in res["script_mouse"][dict_save.get_cur_app()]:
  699.       key_mouse_scrypt = res["script_mouse"][dict_save.get_cur_app()][defaut_list_mouse_buttons[number_key]]
  700.       if key_mouse_scrypt:
  701.        return True
  702.       else:
  703.        return False
  704.     else:
  705.      return False
  706.   else:
  707.    return False
  708.  except:
  709.    return False
  710. def execute_script(script):
  711.     try:
  712.         # print(script)
  713.         result = subprocess.call(['bash', '-c', script])
  714.     except subprocess.CalledProcessError as e:
  715.         print(f"Ошибка при выполнении скрипта: {e}")
  716. def func_mouse_press_button(dict_save, key, button, pres, list_buttons, press_button, string_keys):
  717.  # key - список клавиш, button - какая кнопка сейчас нажата, есть нажатие, словарь с называниями кнопкам с объектами,
  718.  # как называется кнопка мыши для эмуляции, эту надо кнопку удерживать?
  719.  list_mouse_button_names = {"LBUTTON": Button_Controller.left, "RBUTTON": Button_Controller.right,
  720.  "WHEEL_MOUSE_BUTTON": Button_Controller.middle, "MBUTTON": 0x04, "SCROLL_UP": Button_Controller.scroll_up,
  721.  "SCROLL_DOWN": Button_Controller.scroll_down}   # print(list_mouse_button_names)
  722.  res=dict_save.return_jnson()
  723.  try:
  724.   for i in string_keys:   # print(i)
  725.     a = list_buttons[i]  # объект  for i in string_keys:   # print(i)
  726.     number_key = list_buttons[a]  # получаем номер кнопки в списке.  # and len(str(key[number_key])) > 1:    # print(key)  # print(key[number_key] ) # print(button)
  727.     if str(key[number_key]) != ' ' and str(key[number_key]) != " "and\
  728.       str(i) == str(button) and list_buttons[i].get_hook_flag_mouse() == True:# это кнопка нажата?
  729.       if check_mouse_script(res, dict_save, defaut_list_mouse_buttons, number_key):# На эту кнопку назначен скрипт
  730.         key_mouse_script = res["script_mouse"][dict_save.get_cur_app()][defaut_list_mouse_buttons[number_key]]        # print(key_mouse_script)
  731.         thread1 = threading.Thread(target=execute_script, args=(key_mouse_script,))
  732.         thread1.daemon = True
  733.         thread1.start()
  734.       else:       # print("else")       # кнопки мыши
  735.        if key[number_key] in list(list_mouse_button_names.keys()): # если нужно эмулировать кнопку мыши
  736.         mouse_key(key, number_key, press_button, list_mouse_button_names, pres, a)    #        print("mnouse")
  737.       # иначе клавиши клавиатуры.
  738.        else:# print("Кейтборд")
  739.         keyboard_press_button(key, pres, number_key, a, press_button)# Работа с клавой.
  740.  except Exception as e:
  741.    save_dict.write_in_log(e)
  742.    pass
  743.  
  744. get_main_id = '''#!/bin/bash # Получаем идентификатор активного окна
  745. active_window_id=$(xdotool getactivewindow 2>/dev/null)
  746. if [ -n "$active_window_id" ]; then
  747.    process_id_active=$(xdotool getwindowpid "$active_window_id" 2>/dev/null)
  748.    echo "$process_id_active"
  749. else
  750.    echo "0"  # Или любое значение по умолчанию, если нет активного окна
  751. fi
  752. exit '''
  753.  
  754. def start_startup_now(dict_save, root):# запустить после переключения окна
  755.  res =dict_save.return_jnson()
  756.  if res["start_startup"] :   # Если есть галочка запускать при старте.
  757.    # print("start_startup_now")
  758.    dict_save.reset_id_value()  # Сброс настроек текущего id устройства.   # time.sleep(0.3)
  759.    start1(dict_save, root)  # Запуск всего
  760. list_threads=[]
  761. def a(root, dict_save, key, list_buttons, press_button, string_keys, game, games_checkmark_paths):# Основная функция эмуляциии  print(key[1])# список ключей  меняется
  762.   #print(key)  # ['LBUTTON', 'W', ' ', ' ', 'R', 'SPACE', 'KP_Enter']   # game=game
  763.   def on_click(x, y, button, pres):  # print(button) # Button.left  print(key)#['LBUTTON', 'W', ' ', ' ', 'R', 'SPACE', 'KP_Enter']    print(key[1])# список ключей  меняется
  764.     f2 = threading.Thread(target=func_mouse_press_button, args=(dict_save, key, button, pres, list_buttons, press_button, string_keys,))
  765.     # f2.daemon = True
  766.     list_threads.append(f2)
  767.     f2.start()
  768.     return True
  769.   listener = mouse.Listener(on_click=on_click)
  770.   listener.start()  # Запуск слушателя  # print( game)#  print( dict_save.get_cur_app())
  771.  
  772.   while 1:   #time.sleep(3)   #print(dict_save.get_flag_thread())
  773.    game = dict_save.get_cur_app()
  774.    new_path_game = check_current_active_window(dict_save, games_checkmark_paths)  # Текущая директория активного окна игры.
  775.    # print(new_path_game)
  776.    if game != new_path_game:    # print(new_path_game)#
  777.     dict_save.set_cur_app(new_path_game)
  778.     # dict_save.set_current_path_game(new_path_game)
  779.    # if new_path_game != "": # если путь не пустой
  780.    #   game = new_path_game# game новый путь
  781.    # else:
  782.    #   game = dict_save.get_cur_app() # если путь пуст то game это последняя выбранная игра
  783.    if dict_save.get_current_path_game() != dict_save.get_cur_app():  # Если у нас текущий путь к игре отличает от начального
  784.      # print("user")
  785.      for t in list_threads:
  786.        t.join()
  787.        list_threads.remove(t)
  788.      dict_save.set_current_path_game(dict_save.get_cur_app()) #Остановить обработчик клави.  print("change", dict_save.get_cur_app(), sep=" = " )# если поток слушателя оставлен     #time.sleep(1.3)
  789.      break  # key_work.key_release(key, 0)
  790.   a=key_work.keys_list+key_work.keys_list1
  791.   for i in list(key):
  792.     if i in defaut_list_mouse_buttons:
  793.       if i=='RBUTTON':
  794.         pyautogui.mouseUp(button='right')
  795.       if i=='LBUTTON':
  796.         pyautogui.mouseUp(button='left')
  797.  
  798.       if i=='WHEEL_MOUSE_BUTTON':
  799.         key_work.mouse_middle_donw()
  800.       if i in a:     # print(i)
  801.        release = '''#!/bin/bash
  802.       xte 'keyup {0}'    '''
  803.        subprocess.call(['bash', '-c', release.format(key)])
  804.   listener.stop()
  805.   listener.join()  # Ожидание завершения
  806.   dict_save.set_thread(0)
  807.  
  808.   t2 = threading.Thread(target=start_startup_now, args=(dict_save, root,))  # Запустить функцию, которая запускает эмуляцию заново.
  809.   t2.daemon = True
  810.   t2.start()#  print("cll")
  811. def prepare(root, dict_save, dictio, games_checkmark_paths):  # функция эмуляций.  # games_checkmark_paths - Список игр с галочкой
  812.   key, id, old, a1, a2, a3, a4, a5, a6, k, press_button, game, list_buttons = dict_save.preparation(dictio, games_checkmark_paths)
  813.   new = ' '.join(old)   #  print(new)  # print(list_buttons)  print( type(new)  ) print(id)
  814.   string_keys = list(key for key in list_buttons.keys() if isinstance(key, str))
  815.   set_button_map = '''#!/bin/bash\nsudo xinput set-button-map {0} {1} '''.format(id, new)
  816.   subprocess.call(['bash', '-c', set_button_map])  # установить конфигурацию кнопок для мыши.   print(dict_save.get_state_thread())
  817.   dict_save.set_cur_app(game)# Текущая игра  # dict_save.set_current_path_game(game)# последний текущий путь # Запустить обработчик нажатий.  print(game, key, k, sep="\n")  #  print(key)  print(string_keys)
  818.   t1= dict_save.get_thread()  # print(t1)
  819.   if t1 != 0:
  820.     t1.join()
  821.   # print("threading")
  822.   t1 = threading.Thread(target=a, args =(root, dict_save, key, list_buttons, press_button, string_keys, game, games_checkmark_paths))  #t1.daemon = True
  823.   t1.start()
  824.   dict_save.set_thread(t1)# сохранить id посёлка потока
  825. def get_process(dict_save, root):# это функция получается активный процесс и pid игр.
  826.  dict_save.set_current_path_game(dict_save.get_cur_app())
  827.  while 1:
  828.    try:
  829.     time.sleep(0.1)
  830.     process_id_active = int(subprocess.run(['bash'], input=get_main_id, stdout=subprocess.PIPE, text=True).stdout.strip())
  831.     dict_save.set_process_id_active(process_id_active)# текущий pid активного процесса.
  832.     dict_save.set_pid_and_path_window(get_pid_and_path_window()) # здесь мы получаем путь и pid процессов.
  833.     # print(dict_save.get_current_path_game())    # print( dict_save.get_cur_app())
  834.  
  835.    except Exception as e:
  836.      #print(e)
  837.      pass
  838. def get_path_current_active(games_checkmark_paths):# Получаем идентификатор активного окна
  839.  
  840.  try:  # Получаем идентификатор процесса, связанного с активным окном
  841.   active_window_id = subprocess.check_output(['xdotool', 'getactivewindow']).decode().strip()
  842.   process_id = subprocess.check_output(['xdotool', 'getwindowpid', active_window_id]).decode().strip()
  843.   process_list = [p.info for p in psutil.process_iter(attrs=['name', 'pid', 'exe'])]
  844.   for process in process_list:
  845.    if int(process_id)== int(process['pid']):# нашли pid активного  окна
  846.     if str(process['exe']) in games_checkmark_paths:
  847.      path_game = str(process['exe'])
  848.      return path_game# путь к игре активного окна
  849.  
  850.   return games_checkmark_paths[0]
  851.  except :
  852.     pass
  853.  
  854. def check_star():
  855.  process_list = [p.info for p in psutil.process_iter(attrs=['name'])]
  856.  a=[]
  857.  try:
  858.   for process in process_list:   # print(process['name'])
  859.    if 'Mouse_setting_control_for_buttons_python_for_linux' in  process['name']:
  860.     a.append(process)
  861.     if len(process_list)>1:
  862.      return False
  863.     else:
  864.      return True
  865.  except psutil.NoSuchProcess:
  866.     pass
  867.  
  868.  
  869. # def run_check_current_active_window(root, t1, dict_save, game, games_checkmark_paths):  # print(game)
  870. #   while 1:
  871. #     new_path_game = check_current_active_window(dict_save, games_checkmark_paths)  # Текущая директория активного окна игры.
  872. #     if new_path_game != "":
  873. #       game = new_path_game
  874. #     else:
  875. #       game = dict_save.get_current_app_path()  # Последняя выбранная игра
  876. #     if game != dict_save.get_cur_app():
  877. #       dict_save.thread = True
  878. #       dict_save.set_cur_app(game)
  879. #       t1.join()  # закончить поток поиска главного окна
  880. #       while 1:
  881. #         time.sleep(0.001)
  882. #         if game == dict_save.get_cur_app():
  883. #          break
  884. #       start_startup_now(dict_save, root)
  885. #       break
  886.  
  887.   # t1.join()
  888.   # start_startup_now(dict_save, root)
  889.   # dp = threading.Thread(target=run_check_current_active_window, args =( root, t1, dict_save,  game, games_checkmark_paths))
  890.   # dp.start()# нахождения активного окна.
  891. # from PIL import ImageTk, Image
  892. # # Нажатие левой клавиши Ctrl
  893. # keyboard.press('ctrl')
  894. #
  895. # # Отпускание левой клавиши Ctrl
  896. # keyboard.release('ctrl')
  897.  
  898. # Controller,
  899. # keyboard = Controller()
  900. #
  901. # # Нажатие клавиши "A"
  902. # keyboard.press(Key.ctrl_l)12
  903. # time.sleep(0.1)  # Пауза для эмуляции удержания клавиши
  904. # keyboard.release(Key.ctrl_l)
  905.  
  906. # import pydirectinput as directinput
  907. # # Нажатие левой клавиши Ctrl
  908. # directinput.keyDown('ctrl')
  909.  
  910. # Отпускание левой клавиши Ctrl
  911. # directinput.keyUp('ctrl')
  912.  
  913. # import pyautogui
  914. # # Нажатие левой клавиши Ctrl
  915. # pyautogui.keyDown('ctrlleft')
  916. #
  917. # # Отпускание левой клавиши Ctrl
  918. # pyautogui.keyUp('ctrlleft')
  919. '''
  920. keyboard: Эта библиотека предоставляет простые функции для считывания и эмуляции нажатий клавиш на клавиатуре.
  921. Она позволяет считывать нажатия клавиш, определять, какие клавиши были нажаты одновременно, и эмулировать
  922. нажатия клавиш. Однако, она не предоставляет возможности для управления мышью.
  923.  
  924. pynput: Эта библиотека предоставляет возможность управлять как клавиатурой, так и мышью на уровне операционной
  925. системы. Она позволяет считывать и эмулировать нажатия клавиш, а также выполнять другие действия, связанные
  926. с мышью, такие как нажатие кнопок мыши, перемещение курсора и прокрутка колесика мыши. Она также предоставляет
  927. возможность мониторинга клавиатуры и мыши, а также ограничения действий пользователя.
  928.  
  929. pydirectinput: Эта библиотека предоставляет функции для эмуляции нажатий клавиш и других действий на уровне
  930. операционной системы. Она позволяет эмулировать нажатия клавиш, перемещение мыши, клики и другие действия.
  931. Она не предоставляет возможности для мониторинга клавиатуры и мыши.
  932.  
  933. pyautogui: Эта библиотека предоставляет функции для управления мышью и клавиатурой на уровне операционной системы.
  934. Она позволяет эмулировать нажатия клавиш, перемещение мыши, клики и другие действия. Она также предоставляет функции
  935. для работы с изображениями на экране и автоматизации задач на компьютере.
  936. '''
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement