40 | 40 |
from lightdm_gtk_greeter_settings.helpers import (
|
41 | 41 |
C_,
|
42 | 42 |
string2bool,
|
|
43 |
SimpleEnum,
|
43 | 44 |
WidgetsEnum)
|
44 | 45 |
from lightdm_gtk_greeter_settings.MonitorsGroup import MonitorsGroup
|
45 | 46 |
from lightdm_gtk_greeter_settings.OptionGroup import SimpleGroup
|
46 | 47 |
|
47 | 48 |
|
48 | |
__all__ = ['GtkGreeterSettingsWindow']
|
|
49 |
__all__ = ['GtkGreeterSettingsWindow',
|
|
50 |
'WindowMode']
|
|
51 |
|
|
52 |
|
|
53 |
class WindowMode(SimpleEnum):
|
|
54 |
Default = 'default'
|
|
55 |
Embedded = 'embedded'
|
|
56 |
GtkHeader = 'gtk-header'
|
49 | 57 |
|
50 | 58 |
|
51 | 59 |
InitialValue = collections.namedtuple('InitialValue', ('value', 'enabled'))
|
|
57 | 65 |
|
58 | 66 |
class Widgets(WidgetsEnum):
|
59 | 67 |
apply = 'apply_button'
|
|
68 |
reload = 'reset_button'
|
|
69 |
close = 'close_button'
|
|
70 |
buttons = 'dialog_buttons'
|
|
71 |
content = 'content_box'
|
60 | 72 |
infobar = 'infobar'
|
61 | |
|
62 | |
def __new__(cls):
|
|
73 |
infobar_label = 'infobar_label'
|
|
74 |
|
|
75 |
def __new__(cls, mode=WindowMode.Default):
|
63 | 76 |
builder = Gtk.Builder()
|
64 | 77 |
builder.add_from_file(helpers.get_data_path('%s.ui' % cls.__name__))
|
65 | 78 |
window = builder.get_object('settings_window')
|
66 | 79 |
window.builder = builder
|
|
80 |
window.mode = mode
|
67 | 81 |
builder.connect_signals(window)
|
68 | 82 |
window.init_window()
|
69 | 83 |
return window
|
70 | 84 |
|
71 | 85 |
builder = None
|
|
86 |
mode = WindowMode.Default
|
72 | 87 |
|
73 | 88 |
entries_setup = {
|
74 | 89 |
('greeter', 'allow-debugging'): ('changed',),
|
|
121 | 136 |
|
122 | 137 |
self._config_path = helpers.get_config_path()
|
123 | 138 |
self._allow_edit = self._has_access_to_write(self._config_path)
|
124 | |
self._widgets.infobar.props.visible = not self._allow_edit
|
125 | 139 |
self._widgets.apply.props.visible = self._allow_edit
|
126 | 140 |
|
127 | 141 |
if not self._allow_edit:
|
128 | |
helpers.show_message(
|
129 | |
text=_('No permissions to save configuration'),
|
130 | |
secondary_text=_(
|
131 | |
'It seems that you don\'t have permissions to write to '
|
132 | |
'file:\n{path}\n\nTry to run this program using "sudo" '
|
133 | |
'or "pkexec"').format(path=self._config_path),
|
134 | |
message_type=Gtk.MessageType.WARNING)
|
|
142 |
self._set_message(_('You don\'t have permissions to change greeter configuration'),
|
|
143 |
Gtk.MessageType.WARNING)
|
|
144 |
if self.mode != WindowMode.Embedded:
|
|
145 |
helpers.show_message(
|
|
146 |
text=_('No permissions to save configuration'),
|
|
147 |
secondary_text=_(
|
|
148 |
'It seems that you don\'t have permissions to write to '
|
|
149 |
'file:\n{path}\n\nTry to run this program using "sudo" '
|
|
150 |
'or "pkexec"').format(path=self._config_path),
|
|
151 |
message_type=Gtk.MessageType.WARNING)
|
|
152 |
|
|
153 |
if self.mode == WindowMode.Embedded:
|
|
154 |
self._widgets.buttons.hide()
|
|
155 |
self.on_entry_changed = self.on_entry_changed_embedded
|
|
156 |
self._widgets.content.reorder_child(self._widgets.infobar, 0)
|
|
157 |
elif self.mode == WindowMode.GtkHeader:
|
|
158 |
self._widgets.buttons.remove(self._widgets.apply)
|
|
159 |
self._widgets.buttons.remove(self._widgets.reload)
|
|
160 |
self._widgets.buttons.hide()
|
|
161 |
self._widgets.apply.set_label('')
|
|
162 |
self._widgets.reload.set_label('')
|
|
163 |
|
|
164 |
header = Gtk.HeaderBar()
|
|
165 |
header.set_show_close_button(True)
|
|
166 |
header.props.title = self.get_title()
|
|
167 |
header.pack_start(self._widgets.reload)
|
|
168 |
header.pack_start(self._widgets.apply)
|
|
169 |
header.show_all()
|
|
170 |
|
|
171 |
self.set_titlebar(header)
|
135 | 172 |
|
136 | 173 |
self._config = configparser.RawConfigParser(strict=False)
|
137 | 174 |
self._read()
|
|
141 | 178 |
return True
|
142 | 179 |
return os.access(os.path.dirname(self._config_path), os.W_OK | os.X_OK)
|
143 | 180 |
|
|
181 |
def _set_message(self, message, type_=Gtk.MessageType.INFO):
|
|
182 |
if not message:
|
|
183 |
self._widgets.infobar.hide()
|
|
184 |
|
|
185 |
self._widgets.infobar.props.message_type = type_
|
|
186 |
self._widgets.infobar_label.props.label = message
|
|
187 |
self._widgets.infobar.show()
|
|
188 |
|
144 | 189 |
def _read(self):
|
145 | 190 |
self._config.clear()
|
146 | 191 |
try:
|
147 | |
if not self._config.read(self._config_path):
|
148 | |
helpers.show_message(text=_('Failed to read configuration '
|
149 | |
'file: {path}')
|
|
192 |
if not self._config.read(self._config_path) and \
|
|
193 |
self.mode != WindowMode.Embedded:
|
|
194 |
helpers.show_message(text=_('Failed to read configuration file: {path}')
|
150 | 195 |
.format(path=self._config_path),
|
151 | 196 |
message_type=Gtk.MessageType.ERROR)
|
152 | 197 |
except (configparser.DuplicateSectionError,
|
|
167 | 212 |
for group in self._groups:
|
168 | 213 |
group.write(self._config)
|
169 | 214 |
|
170 | |
for entry in self._changed_entries:
|
171 | |
self._initial_values[entry] = InitialValue(entry.value, entry.enabled)
|
172 | |
|
173 | |
self._changed_entries.clear()
|
174 | |
self._widgets.apply.props.sensitive = False
|
|
215 |
if self.mode != WindowMode.Embedded:
|
|
216 |
for entry in self._changed_entries:
|
|
217 |
self._initial_values[entry] = InitialValue(entry.value, entry.enabled)
|
|
218 |
|
|
219 |
self._changed_entries.clear()
|
|
220 |
self._widgets.apply.props.sensitive = False
|
175 | 221 |
|
176 | 222 |
try:
|
177 | 223 |
with open(self._config_path, 'w') as file:
|
|
219 | 265 |
self._changed_entries.discard(entry)
|
220 | 266 |
|
221 | 267 |
self._widgets.apply.props.sensitive = self._allow_edit and self._changed_entries
|
|
268 |
|
|
269 |
def on_entry_changed_embedded(self, entry, force=False):
|
|
270 |
if self._changed_entries is None:
|
|
271 |
return
|
|
272 |
|
|
273 |
initial = self._initial_values[entry]
|
|
274 |
if force or entry.enabled != initial.enabled or \
|
|
275 |
(entry.enabled and entry.value != initial.value):
|
|
276 |
self._changed_entries.add(entry)
|
|
277 |
else:
|
|
278 |
self._changed_entries.discard(entry)
|
|
279 |
|
|
280 |
if self._allow_edit:
|
|
281 |
self._write()
|
222 | 282 |
|
223 | 283 |
def on_entry_reset_clicked(self, item):
|
224 | 284 |
entry, value, enabled = item._reset_entry_data
|