]> Dogcows Code - chaz/openbox/blob - tools/themeupdate/themeupdate.py
update oldschool .xft.font options from ob2
[chaz/openbox] / tools / themeupdate / themeupdate.py
1 #! /usr/bin/python
2
3 import sys
4
5 data = []
6
7 def out(str):
8 sys.stderr.write(str)
9 sys.stderr.flush()
10
11 def read_bool():
12 while True:
13 inp = sys.stdin.readline(1).strip()
14 if inp == 'y' or inp == '': return True
15 if inp == 'n': return False
16
17 def getkeyval(line):
18 key = line[:line.find(':')].strip()
19 value = line[line.find(':') + 1:].strip()
20 if not (key and value):
21 key = value = None
22 return key, value
23
24 def find_key(data, keysubstr):
25 i = 0
26 n = len(data)
27 while i < n:
28 l = data[i]
29 key, value = getkeyval(l)
30 if key and value:
31 if key.find(keysubstr) != -1:
32 return i, key, value
33 i += 1
34 return -1, None, None
35
36 def simple_replace(data):
37 pairs = {}
38 pairs['window.focus.font'] = 'window.label.focus.font'
39 pairs['window.unfocus.font'] = 'window.label.unfocus.font'
40 pairs['window.justify'] = 'window.label.justify'
41 pairs['menu.frame.disableColor'] = 'menu.disabled.textColor'
42 pairs['style.'] = 'info.'
43 pairs['menu.frame'] = 'menu.items'
44 pairs['menu.hilite'] = 'menu.selected'
45 pairs['.picColor'] = '.imageColor'
46
47 for k in pairs.keys():
48 while 1:
49 i, key, nul = find_key(data, k);
50 if i >= 0:
51 newl = data[i].replace(k, pairs[k])
52 out('Updating "' + key +
53 '" to "' + key.replace(k, pairs[k]) + '"\n')
54 data[i] = newl
55 else:
56 break
57
58 def remove(data):
59 invalid = []
60 invalid.append('toolbar')
61 invalid.append('rootCommand')
62 invalid.append('menu.frame.justify')
63 for inv in invalid:
64 while 1:
65 i, key, nul = find_key(data, inv)
66 if i >= 0:
67 out(key + ' is no longer supported.\nRemove (Y/n)? ')
68 if read_bool():
69 out('Removing "' + key + '"\n')
70 data.pop(i)
71 else:
72 break
73
74 def pressed(data):
75 i, nul, nul = find_key(data, 'window.button.pressed')
76 if i >= 0:
77 out('The window.button.pressed option has been replaced by ' +
78 'window.button.pressed.focus and ' +
79 'window.button.pressed.unfocus.\nUpdate (Y/n)? ')
80 if read_bool():
81 out('Removing "window.button.pressed"\n')
82 data.pop(i)
83 out('Adding "window.button.pressed.unfocus"\n')
84 data.insert(i, l.replace('window.button.pressed',
85 'window.button.pressed.unfocus'))
86 out('Adding "window.button.pressed.focus"\n')
87 data.insert(i, l.replace('window.button.pressed',
88 'window.button.pressed.focus'))
89
90 def x_fonts(data):
91 i, nul, nul = find_key(data, 'window.font')
92 if i >= 0:
93 out('You appear to specify fonts using the old X fonts ' +
94 'syntax.\nShall I remove all fonts from the theme (Y/n)? ')
95 if not read_bool():
96 return
97 else: return
98 while 1:
99 i, key = key_find(data, '.font')
100 if i < 0:
101 break
102 out('Removing "' + key + '"\n')
103 data.pop(i)
104
105 def xft_fonts(data):
106 i, nul, nul = find_key(data, '.xft.')
107 if i >= 0:
108 out('You appear to specify fonts using the old Xft fonts ' +
109 'syntax.\nShall I update these to the new syntax (Y/n)? ')
110 if not read_bool():
111 return
112 else: return
113 fonts = {}
114 fonts['window'] = 'window.label.focus.font'
115 fonts['menu.items'] = 'menu.items.font'
116 fonts['menu.title'] = 'menu.title.font'
117 for f in fonts.keys():
118 li, nul, flags = find_key(data, f + '.xft.flags')
119 if li < 0:
120 li, nul, flags = find_key(data, '*.xft.flags')
121 else:
122 out('Removing ' + f + '.xft.flags\n')
123 data.pop(li)
124 oi, nul, offset = find_key(data, f + '.xft.shadow.offset')
125 if oi < 0:
126 oi, nul, offset = find_key(data, '*.xft.shadow.offset')
127 else:
128 out('Removing ' + f + '.xft.shadow.offset\n')
129 data.pop(oi)
130 ti, nul, tint = find_key(data, f + '.xft.shadow.tint')
131 if ti < 0:
132 ti, nul, tint = find_key(data, '*.xft.shadow.tint')
133 else:
134 out('Removing ' + f + '.xft.shadow.tint\n')
135 data.pop(ti)
136 fi, nul, face = find_key(data, f + '.xft.font')
137 if fi < 0:
138 fi, nul, face = find_key(data, '*.xft.font')
139 if fi >= 0: fi = len(data) - 1
140 else:
141 out('Removing ' + f + '.xft.font\n')
142 data.pop(fi)
143
144 if fi >= 0:
145 s = face
146 if li >= 0:
147 if flags.find('bold'):
148 s = s + ':bold'
149 if flags.find('shadow'):
150 s = s + ':shadow=y'
151 if oi >= 0:
152 s = s + ':shadowoffset=' + offset
153 if ti >= 0:
154 s = s + ':shadowtint=' + tint
155 out('Adding ' + fonts[f] + '\n')
156 data.insert(fi, fonts[f] + ': ' + s)
157
158 for stars in ('*.xft.flags', '*.xft.shadow.offset' ,
159 '*.xft.shadow.tint', '*.xft.font'):
160 i, key, nul = find_key(data, stars)
161 if i >= 0:
162 out('Removing ' + key + '\n')
163 data.pop(i)
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178 def usage():
179 print 'Usage: ' + sys.argv[0] + ' /path/to/themerc > newthemerc'
180 print
181 sys.exit()
182
183 try:
184 file = open(sys.argv[1])
185 except IndexError:
186 usage()
187 except IOError:
188 print 'Unable to open file "' + sys.argv[1] + '"'
189 print
190 usage()
191
192 data = file.readlines()
193 for i in range(len(data)):
194 data[i] = data[i].strip()
195
196 simple_replace(data)
197 #remove(data)
198 #pressed(data)
199 #x_fonts(data)
200 xft_fonts(data)
201
202 for l in data:
203 print l
This page took 0.048921 seconds and 4 git commands to generate.