Программа позволяет сопроводить открытие/активацию окна переключением раскладки клавиатуры.
Окна для определенной раскладки задаются в переменных eng_l и rus_l. Указывать можно часть заголовка.
Горячие клавиши для смены раскладки указать свои, пример xdotool key alt+shift.
После отображения/активации окна возможна смена раскладки, программа её менять не будет, до смены активного окна.
Работа программы распространяется только на окна, заголовки которых указаны в переменой.
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import re
import gi
import time
gi.require_version('Gtk', '3.0')
gi.require_version('GLib', '2.0')
from gi.repository import Gtk
from gi.repository import GLib
import subprocess
# Заголовки окон с желательной английской раскладкой
eng_l = ['leafpad', 'geany', 'commander', 'терминал', 'аутент', '~']
# Заголовки окон с желательной русской раскладкой
rus_l = ['pidgin', 'telegram', 'firefox', 'thunderbird', 'nautilus', 'рабочий']
# Проверка раскладки RU или US
def get_kb():
a = subprocess.check_output("gsettings get org.gnome.desktop.input-sources mru-sources", shell=True).decode('utf-8')
b = re.findall(r"\[\('xkb'\, '(\w+)'", a)
return b[0]
# Получение имени окна
def get_name_win():
try:
p = subprocess.check_output('xdotool getwindowfocus getwindowname %1', shell = True)
return p.decode('utf-8').strip('\n')
except:
get_name_win()
# Функция с циклом ожидания смены имени окна
def funck_get_name_window(*args):
while True:
if args[0].lower() in get_name_win().lower():
GLib.usleep(GLib.USEC_PER_SEC)
else:
break
# Основная функция
def main_funck_my_prog():
top_name_window = get_name_win().lower()
# Проверка для окон с желательной английской раскладкой
for n_w in eng_l:
if get_kb() == 'ru' and n_w.lower() in top_name_window:
while True:
subprocess.Popen('xdotool key alt+shift'.split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
if get_kb() == 'us':
time.sleep(1)
else:
break
funck_get_name_window(n_w)
break
else:
if n_w.lower() in top_name_window:
funck_get_name_window(n_w)
break
# Проверка для окон с желательной русской раскладкой
for n_w in rus_l:
if get_kb() == 'us' and n_w.lower() in top_name_window:
while True:
subprocess.Popen('xdotool key alt+shift'.split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
if get_kb() == 'us':
time.sleep(1)
else:
break
funck_get_name_window(n_w)
break
else:
if n_w.lower() in top_name_window:
funck_get_name_window(n_w)
break
return True
GLib.threads_init()
GLib.timeout_add_seconds(2, main_funck_my_prog, priority=GLib.PRIORITY_LOW)
Gtk.main()