-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathxfce4_display_profile_switcher.py
executable file
·79 lines (63 loc) · 2.3 KB
/
xfce4_display_profile_switcher.py
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
#!/usr/bin/env python3
import argparse
import subprocess
import re
parser = argparse.ArgumentParser()
parser.add_argument(
"-s", "--set-profile", help="set profile with given id", type=str, metavar='PROFILE_ID'
)
parser.add_argument(
"-l", "--list-profiles", help="list profiles", action="store_true"
)
class XconfQuery:
def __init__(self):
self.xconf_query_command = "xfconf-query"
def run_xconf_query(self, *arguments):
return subprocess.check_output([self.xconf_query_command, *arguments])
def get_values(self, channel):
raw_values = self.run_xconf_query('-l', '-v', '-c', channel)
values = {}
for value in raw_values.split(b'\n'):
result = re.search(r'(^[^\s]*)\s+([\w\d\-\._]+.*)', value.decode('utf8'))
if not result:
continue
try:
values[result.group(1)] = result.group(2)
except IndexError:
pass
return values
class DisplayProfiles:
def __init__(self):
self.xq = XconfQuery()
def get_profiles(self):
displays = self.xq.get_values('displays')
profiles = {}
regexp = r'^/[\d\w]+/.*/EDID$'
profile_ids = set([
k.split('/')[1] for (k, v) in displays.items()
if re.search(regexp, k, re.IGNORECASE) and not (k.startswith('/Default') or k.startswith('/Fallback'))
])
active = displays.get('/ActiveProfile')
for profile_id in profile_ids:
profiles[profile_id] = {
'name': displays.get(f'/{profile_id}'),
'active': profile_id == active
}
return profiles
def print_profiles(self):
profiles = self.get_profiles()
for profile_id, values in profiles.items():
print(f"id: {profile_id}, name: {values['name']}" + (" (active)" if values.get('active') else ''))
def set_profile(self, profile_id):
self.xq.run_xconf_query(
"--create", '-c', 'displays', '-p', '/Schemes/Apply', '-t', 'string', '-s', profile_id
)
if __name__ == "__main__":
dp = DisplayProfiles()
args = parser.parse_args()
if args.list_profiles:
dp.print_profiles()
elif args.set_profile:
dp.set_profile(args.set_profile)
else:
parser.print_help()