diff --git a/bin/lightdm-gtk-greeter-settings b/bin/lightdm-gtk-greeter-settings index 24298f1..736a75e 100755 --- a/bin/lightdm-gtk-greeter-settings +++ b/bin/lightdm-gtk-greeter-settings @@ -7,8 +7,10 @@ gi.require_version('Gtk', '3.0') -project_dir = os.path.abspath(os.path.dirname(os.path.dirname(os.path.realpath(sys.argv[0])))) -if (os.path.exists(os.path.join(project_dir, 'lightdm_gtk_greeter_settings')) and project_dir not in sys.path): +project_dir = os.path.abspath( + os.path.dirname(os.path.dirname(os.path.realpath(sys.argv[0])))) +if (os.path.exists(os.path.join(project_dir, 'lightdm_gtk_greeter_settings')) + and project_dir not in sys.path): sys.path.insert(0, project_dir) diff --git a/lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py b/lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py index aea4edc..39e05db 100644 --- a/lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py +++ b/lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py @@ -17,41 +17,47 @@ __all__ = ['GtkGreeterSettingsWindow'] -BindingValue = namedtuple('BindingValue', ('option', 'default', 'changed_handler')) +BindingValue = namedtuple( + 'BindingValue', ('option', 'default', 'changed_handler')) InitialValue = namedtuple('InitialValue', ('value', 'state')) GREETER_SECTION = 'greeter' OPTIONS_BINDINGS = \ -{ - 'greeter': { - # key: class, base widgets name, default value - - # Theme - 'theme-name': (OptionEntry.StringEntry, 'gtk_theme', None), - 'icon-theme-name': (OptionEntry.StringEntry, 'icons_theme', None), - 'font-name': (OptionEntry.FontEntry, 'font', 'Sans 10'), - 'xft-antialias': (OptionEntry.BooleanEntry, 'antialias', False), - 'xft-dpi': (OptionEntry.StringEntry, 'dpi', None), - 'xft-rgba': (OptionEntry.ChoiceEntry, 'rgba', None), - 'xft-hintstyle': (OptionEntry.ChoiceEntry, 'hintstyle', None), - 'background': (OptionEntry.BackgroundEntry, 'background', '#000000'), - 'default-user-image': (OptionEntry.IconEntry, 'userimage', '#avatar-default'), - # Panel - 'show-clock': (OptionEntry.BooleanEntry, 'show_clock', False), - 'clock-format': (OptionEntry.ClockFormatEntry, 'clock_format', '%a, %H:%M'), - 'indicators': (OptionEntry.IndicatorsEntry, 'indicators', None), - # Position - 'position': (OptionEntry.PositionEntry, 'position', '50%,center'), - # Misc - 'screensaver-timeout': (OptionEntry.AdjustmentEntry, 'timeout', 60), - 'keyboard': (OptionEntry.StringEntry, 'keyboard', None), + 'greeter': + { + # key: class, base widgets name, default value + + # Theme + 'theme-name': (OptionEntry.StringEntry, 'gtk_theme', None), + 'icon-theme-name': (OptionEntry.StringEntry, 'icons_theme', None), + 'font-name': (OptionEntry.FontEntry, 'font', 'Sans 10'), + 'xft-antialias': (OptionEntry.BooleanEntry, 'antialias', False), + 'xft-dpi': (OptionEntry.StringEntry, 'dpi', None), + 'xft-rgba': (OptionEntry.ChoiceEntry, 'rgba', None), + 'xft-hintstyle': (OptionEntry.ChoiceEntry, 'hintstyle', None), + 'background': (OptionEntry.BackgroundEntry, 'background', + '#000000'), + 'default-user-image': (OptionEntry.IconEntry, 'userimage', + '#avatar-default'), + # Panel + 'show-clock': (OptionEntry.BooleanEntry, 'show_clock', False), + 'clock-format': (OptionEntry.ClockFormatEntry, 'clock_format', + '%a, %H:%M'), + 'indicators': (OptionEntry.IndicatorsEntry, 'indicators', None), + # Position + 'position': (OptionEntry.PositionEntry, 'position', '50%,center'), + # Misc + 'screensaver-timeout': (OptionEntry.AdjustmentEntry, 'timeout', + 60), + 'keyboard': (OptionEntry.StringEntry, 'keyboard', None), + } } -} class BuilderWrapper: + def __init__(self, builder, base): self._builder = builder self._base = base @@ -66,7 +72,8 @@ BUILDER_WIDGETS = ('apply_button', 'no_access_infobar', 'gtk_theme_values', 'icons_theme_values', - 'timeout_view', 'timeout_adjustment', 'timeout_end_label') + 'timeout_view', 'timeout_adjustment', + 'timeout_end_label') def __new__(cls): builder = Gtk.Builder() @@ -80,8 +87,9 @@ return window def _init_window(self): - self._bindings = {section: {key: self._new_binding(*args) for key, args in keys.items()} - for section, keys in OPTIONS_BINDINGS.items()} + self._bindings = {section: {key: self._new_binding(*args) + for key, args in list(keys.items())} + for section, keys in list(OPTIONS_BINDINGS.items())} self._initial_values = {} self._changed_values = None @@ -90,11 +98,13 @@ self._no_access_infobar.props.visible = not self._allow_edit self._apply_button.props.visible = self._allow_edit if not self._allow_edit: - helpers.show_message(text=_('No permissions to save configuration'), - secondary_text=_( -'It seems that you don\'t have permissions to write to file:\n\ -{path}\n\nTry to run this program using "sudo" or "pkexec"').format(path=self._config_path), - message_type=Gtk.MessageType.WARNING) + helpers.show_message( + text=_('No permissions to save configuration'), + secondary_text=_( + 'It seems that you don\'t have permissions to write to ' + 'file:\n{path}\n\nTry to run this program using "sudo" ' + 'or "pkexec"').format(path=self._config_path), + message_type=Gtk.MessageType.WARNING) self._configure_special_entries() self._config = configparser.RawConfigParser(strict=False) @@ -102,21 +112,26 @@ def _configure_special_entries(self): # theme-name - for theme in sorted(iglob(os.path.join(sys.prefix, 'share', 'themes', '*', 'gtk-3.0'))): + for theme in sorted(iglob(os.path.join(sys.prefix, 'share', 'themes', + '*', 'gtk-3.0'))): self._gtk_theme_values.append_text(theme.split(os.path.sep)[-2]) # icon-theme-name - for theme in sorted(iglob(os.path.join(sys.prefix, 'share', 'icons', '*', 'index.theme'))): + for theme in sorted(iglob(os.path.join(sys.prefix, 'share', 'icons', + '*', 'index.theme'))): self._icons_theme_values.append_text(theme.split(os.path.sep)[-2]) # screensaver-timeout timeout = self._bindings['greeter']['screensaver-timeout'].option timeout.get.connect(self.on_timeout_option_get) timeout.set.connect(self.on_timeout_option_set) - for mark in chain(range(10, 61, 10), - range(69, int(self._timeout_adjustment.props.upper), 10)): + for mark in chain(list(range(10, 61, 10)), + list(range(69, + int(self._timeout_adjustment.props.upper), + 10))): self._timeout_view.add_mark(mark, Gtk.PositionType.BOTTOM, None) total = int(self._timeout_adjustment.props.upper - 60) + 1 - self._timeout_end_label.props.label = C_('option|timeout', '{count} min')\ - .format(count=total) + self._timeout_end_label.props.label = C_('option|timeout', + '{count} min')\ + .format(count=total) def _has_access_to_write(self, path): if os.path.exists(path) and os.access(self._config_path, os.W_OK): @@ -132,10 +147,12 @@ self._config.clear() try: if not self._config.read(self._config_path): - helpers.show_message(text=_('Failed to read configuration file: {path}') - .format(path=self._config_path), + helpers.show_message(text=_('Failed to read configuration ' + 'file: {path}') + .format(path=self._config_path), message_type=Gtk.MessageType.ERROR) - except (configparser.DuplicateSectionError, configparser.MissingSectionHeaderError): + except (configparser.DuplicateSectionError, + configparser.MissingSectionHeaderError): pass if not self._config.has_option(GREETER_SECTION, 'indicators'): @@ -148,31 +165,34 @@ self._config.set(GREETER_SECTION, 'indicators', value) self._config.remove_option(GREETER_SECTION, 'show-indicators') - for section, keys in self._bindings.items(): - for key, binding in keys.items(): + for section, keys in list(self._bindings.items()): + for key, binding in list(keys.items()): with binding.option.handler_block(binding.changed_handler): try: binding.option.value = self._config.get(section, key) binding.option.enabled = True - except (configparser.NoOptionError, configparser.NoSectionError): + except (configparser.NoOptionError, + configparser.NoSectionError): binding.option.value = binding.default binding.option.enabled = False - self._initial_values[binding.option] = InitialValue(binding.option.value, - binding.option.enabled) + self._initial_values[binding.option] = InitialValue( + binding.option.value, + binding.option.enabled) self._changed_values = set() self._apply_button.props.sensitive = False def _write(self): - for section, keys in self._bindings.items(): + for section, keys in list(self._bindings.items()): if not self._config.has_section(section): self._config.add_section(section) - for key, binding in keys.items(): + for key, binding in list(keys.items()): if binding.option.enabled: self._config.set(section, key, binding.option.value) else: self._config.remove_option(section, key) - self._initial_values[binding.option] = InitialValue(binding.option.value, - binding.option.enabled) + self._initial_values[binding.option] = InitialValue( + binding.option.value, + binding.option.enabled) self._changed_values = set() self._apply_button.props.sensitive = False try: @@ -183,11 +203,13 @@ def on_option_changed(self, option): if option.enabled != self._initial_values[option].state or \ - (option.enabled and option.value != self._initial_values[option].value): + (option.enabled + and option.value != self._initial_values[option].value): self._changed_values.add(option) else: self._changed_values.discard(option) - self._apply_button.props.sensitive = self._allow_edit and self._changed_values + self._apply_button.props.sensitive = self._allow_edit and \ + self._changed_values def on_timeout_option_get(self, option=None, value=None): value = int(float(value)) diff --git a/lightdm_gtk_greeter_settings/IconChooserDialog.py b/lightdm_gtk_greeter_settings/IconChooserDialog.py index 610e0ed..1bfb77f 100644 --- a/lightdm_gtk_greeter_settings/IconChooserDialog.py +++ b/lightdm_gtk_greeter_settings/IconChooserDialog.py @@ -18,8 +18,8 @@ IconsFilterArgs = namedtuple('IconsFilterArgs', ('standard', 'context')) BUILDER_WIDGETS = ('name', 'preview', 'standard_toggle', 'spinner', - 'contexts_view', 'contexts_selection', 'contexts_model', 'contexts_filter', - 'icons_view', 'icons_selection', + 'contexts_view', 'contexts_selection', 'contexts_model', + 'contexts_filter', 'icons_view', 'icons_selection', 'icons_model', 'icons_sorted', 'icons_filter') def __new__(cls): @@ -46,10 +46,13 @@ self._icon_to_select = None self._icons_filter_args = None - self._contexts_view.set_row_separator_func(self._contexts_row_separator_callback, None) - self._contexts_filter.set_visible_func(self._contexts_filter_visible_callback) - - self._icons_filter.set_visible_func(self._icons_filter_visible_callback) + self._contexts_view.set_row_separator_func( + self._contexts_row_separator_callback, None) + self._contexts_filter.set_visible_func( + self._contexts_filter_visible_callback) + + self._icons_filter.set_visible_func( + self._icons_filter_visible_callback) self._icons_sorted.set_sort_column_id(0, Gtk.SortType.ASCENDING) self._reload() @@ -63,12 +66,15 @@ translated_title = title and C_('icon-dialog', title) self._contexts_model.append(self.ContextsModelRow(name=name, standard=True, - title=translated_title)) + title= + translated_title) + ) for name in theme.list_contexts(): if name not in standard_contexts: self._contexts_model.append(self.ContextsModelRow(name=name, - standard=False, + standard= + False, title=name)) self._icons_model.clear() @@ -90,16 +96,19 @@ def _update_contexts_filter(self): selected_iter = self._contexts_selection.get_selected()[1] - selected_path = self._contexts_filter.get_path(selected_iter) if selected_iter else None + selected_path = self._contexts_filter.get_path( + selected_iter) if selected_iter else None self._contexts_filter.refilter() - if selected_path and self._contexts_selection.path_is_selected(selected_path): + if selected_path and \ + self._contexts_selection.path_is_selected(selected_path): self._update_icons_filter() def _update_icons_filter(self): model, rowiter = self._contexts_selection.get_selected() if rowiter: - self._icons_filter_args = self.IconsFilterArgs(self._standard_toggle.props.active, - model[rowiter][self._CONTEXT_NAME]) + self._icons_filter_args = self.IconsFilterArgs( + self._standard_toggle.props.active, + model[rowiter][self._CONTEXT_NAME]) else: self._icons_filter_args = None self._icons_view.props.model = None @@ -113,16 +122,18 @@ def _contexts_row_separator_callback(self, model, rowiter, data): return not model[rowiter][self._CONTEXT_NAME] and \ - not model[rowiter][self._CONTEXT_TITLE] + not model[rowiter][self._CONTEXT_TITLE] def _icons_filter_visible_callback(self, model, rowiter, data): if not self._icons_filter_args: return False - if self._icons_filter_args.standard and not model[rowiter][self._ICON_STANDARD]: + if self._icons_filter_args.standard and \ + not model[rowiter][self._ICON_STANDARD]: return False if not self._icons_filter_args.context: return True - return model[rowiter][self._ICON_CONTEXT] == self._icons_filter_args.context + return model[rowiter][self._ICON_CONTEXT] == \ + self._icons_filter_args.context def run(self): return super().run() @@ -135,7 +146,8 @@ self._icon_to_select = name return - if not self._icons_filter_args or self._icons_filter_args.context is not None: + if not self._icons_filter_args or \ + self._icons_filter_args.context is not None: if name not in STANDARD_ICON_NAMES: self._standard_toggle.props.active = False self._contexts_selection.select_path(0) @@ -167,100 +179,124 @@ self._preview.props.icon_name = name -# http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html +#http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html STANDARD_CONTEXTS =\ -( - (None, NC_('icon-dialog', 'All contexts')), - (None, ''), # separator - ('Actions', NC_('icon-dialog', 'Actions')), - ('Applications', NC_('icon-dialog', 'Applications')), - ('Categories', NC_('icon-dialog', 'Categories')), - ('Devices', NC_('icon-dialog', 'Devices')), - ('Emblems', NC_('icon-dialog', 'Emblems')), - ('Emotes', NC_('icon-dialog', 'Emoticons')), - ('International', NC_('icon-dialog', 'International')), - ('MimeTypes', NC_('icon-dialog', 'MIME Types')), - ('Places', NC_('icon-dialog', 'Places')), - ('Status', NC_('icon-dialog', 'Status')) -) + ( + (None, NC_('icon-dialog', 'All contexts')), + (None, ''), # separator + ('Actions', NC_('icon-dialog', 'Actions')), + ('Applications', NC_('icon-dialog', 'Applications')), + ('Categories', NC_('icon-dialog', 'Categories')), + ('Devices', NC_('icon-dialog', 'Devices')), + ('Emblems', NC_('icon-dialog', 'Emblems')), + ('Emotes', NC_('icon-dialog', 'Emoticons')), + ('International', NC_('icon-dialog', 'International')), + ('MimeTypes', NC_('icon-dialog', 'MIME Types')), + ('Places', NC_('icon-dialog', 'Places')), + ('Status', NC_('icon-dialog', 'Status')) + ) STANDARD_ICON_NAMES = \ -{ -# Actions -'address-book-new', 'application-exit', 'appointment-new', 'call-start', 'call-stop', 'contact-new', -'document-new', 'document-open', 'document-open-recent', 'document-page-setup', 'document-print', -'document-print-preview', 'document-properties', 'document-revert', 'document-save', -'document-save-as', 'document-send', 'edit-clear', 'edit-copy', 'edit-cut', 'edit-delete', -'edit-find', 'edit-find-replace', 'edit-paste', 'edit-redo', 'edit-select-all', 'edit-undo', -'folder-new', 'format-indent-less', 'format-indent-more', 'format-justify-center', -'format-justify-fill', 'format-justify-left', 'format-justify-right', 'format-text-direction-ltr', -'format-text-direction-rtl', 'format-text-bold', 'format-text-italic', 'format-text-underline', -'format-text-strikethrough', 'go-bottom', 'go-down', 'go-first', 'go-home', 'go-jump', 'go-last', -'go-next', 'go-previous', 'go-top', 'go-up', 'help-about', 'help-contents', 'help-faq', -'insert-image', 'insert-link', 'insert-object', 'insert-text', 'list-add', 'list-remove', -'mail-forward', 'mail-mark-important', 'mail-mark-junk', 'mail-mark-notjunk', 'mail-mark-read', -'mail-mark-unread', 'mail-message-new', 'mail-reply-all', 'mail-reply-sender', 'mail-send', -'mail-send-receive', 'media-eject', 'media-playback-pause', 'media-playback-start', -'media-playback-stop', 'media-record', 'media-seek-backward', 'media-seek-forward', -'media-skip-backward', 'media-skip-forward', 'object-flip-horizontal', 'object-flip-vertical', -'object-rotate-left', 'object-rotate-right', 'process-stop', 'system-lock-screen', -'system-log-out', 'system-run', 'system-search', 'system-reboot', 'system-shutdown', -'tools-check-spelling', 'view-fullscreen', 'view-refresh', 'view-restore', 'view-sort-ascending', -'view-sort-descending', 'window-close', 'window-new', 'zoom-fit-best', 'zoom-in', 'zoom-original', -'zoom-out', -# StandardApplicationIcons -'accessories-calculator', 'accessories-character-map', 'accessories-dictionary', -'accessories-text-editor', 'help-browser', 'multimedia-volume-control', -'preferences-desktop-accessibility', 'preferences-desktop-font', 'preferences-desktop-keyboard', -'preferences-desktop-locale', 'preferences-desktop-multimedia', 'preferences-desktop-screensaver', -'preferences-desktop-theme', 'preferences-desktop-wallpaper', 'system-file-manager', -'system-software-install', 'system-software-update', 'utilities-system-monitor', -'utilities-terminal', -# StandardCategoryIcons -'applications-accessories', 'applications-development', 'applications-engineering', -'applications-games', 'applications-graphics', 'applications-internet', 'applications-multimedia', -'applications-office', 'applications-other', 'applications-science', 'applications-system', -'applications-utilities', 'preferences-desktop', 'preferences-desktop-peripherals', -'preferences-desktop-personal', 'preferences-other', 'preferences-system', -'preferences-system-network', 'system-help', -# StandardDeviceIcons -'audio-card', 'audio-input-microphone', 'battery', 'camera-photo', 'camera-video', 'camera-web', -'computer', 'drive-harddisk', 'drive-optical', 'drive-removable-media', 'input-gaming', -'input-keyboard', 'input-mouse', 'input-tablet', 'media-flash', 'media-floppy', 'media-optical', -'media-tape', 'modem', 'multimedia-player', 'network-wired', 'network-wireless', 'pda', 'phone', -'printer', 'scanner', 'video-display', -# StandardEmblemIcons -'emblem-default', 'emblem-documents', 'emblem-downloads', 'emblem-favorite', 'emblem-important', -'emblem-mail', 'emblem-photos', 'emblem-readonly', 'emblem-shared', 'emblem-symbolic-link', -'emblem-synchronized', 'emblem-system', 'emblem-unreadable', -# StandardEmotionIcons -'face-angel', 'face-angry', 'face-cool', 'face-crying', 'face-devilish', 'face-embarrassed', -'face-kiss', 'face-laugh', 'face-monkey', 'face-plain', 'face-raspberry', 'face-sad', -'face-sick', 'face-smile', 'face-smile-big', 'face-smirk', 'face-surprise', 'face-tired', -'face-uncertain', 'face-wink', 'face-worried', -# StandardInternationalIcons -'flag-aa', -# StandardMIMETypeIcons -'application-x-executable', 'audio-x-generic', 'font-x-generic', 'image-x-generic', -'package-x-generic', 'text-html', 'text-x-generic', 'text-x-generic-template', 'text-x-script', -'video-x-generic', 'x-office-address-book', 'x-office-calendar', 'x-office-document', -'x-office-presentation', 'x-office-spreadsheet', -# StandardPlaceIcons -'folder', 'folder-remote', 'network-server', 'network-workgroup', 'start-here', 'user-bookmarks', -'user-desktop', 'user-home', 'user-trash', -# StandardStatusIcons -'appointment-missed', 'appointment-soon', 'audio-volume-high', 'audio-volume-low', -'audio-volume-medium', 'audio-volume-muted', 'battery-caution', 'battery-low', 'dialog-error', -'dialog-information', 'dialog-password', 'dialog-question', 'dialog-warning', 'folder-drag-accept', -'folder-open', 'folder-visiting', 'image-loading', 'image-missing', 'mail-attachment', -'mail-unread', 'mail-read', 'mail-replied', 'mail-signed', 'mail-signed-verified', -'media-playlist-repeat', 'media-playlist-shuffle', 'network-error', 'network-idle', -'network-offline', 'network-receive', 'network-transmit', 'network-transmit-receive', -'printer-error', 'printer-printing', 'security-high', 'security-medium', 'security-low', -'software-update-available', 'software-update-urgent', 'sync-error', 'sync-synchronizing', -'task-due', 'task-past-due', 'user-available', 'user-away', 'user-idle', 'user-offline', -'user-trash-full', 'weather-clear', 'weather-clear-night', 'weather-few-clouds', -'weather-few-clouds-night', 'weather-fog', 'weather-overcast', 'weather-severe-alert', -'weather-showers', 'weather-showers-scattered', 'weather-snow', 'weather-storm' -} + { + # Actions + 'address-book-new', 'application-exit', 'appointment-new', + 'call-start', 'call-stop', 'contact-new', 'document-new', + 'document-open', 'document-open-recent', 'document-page-setup', + 'document-print', 'document-print-preview', 'document-properties', + 'document-revert', 'document-save', 'document-save-as', + 'document-send', 'edit-clear', 'edit-copy', 'edit-cut', 'edit-delete', + 'edit-find', 'edit-find-replace', 'edit-paste', 'edit-redo', + 'edit-select-all', 'edit-undo', 'folder-new', 'format-indent-less', + 'format-indent-more', 'format-justify-center', 'format-justify-fill', + 'format-justify-left', 'format-justify-right', + 'format-text-direction-ltr', 'format-text-direction-rtl', + 'format-text-bold', 'format-text-italic', 'format-text-underline', + 'format-text-strikethrough', 'go-bottom', 'go-down', 'go-first', + 'go-home', 'go-jump', 'go-last', 'go-next', 'go-previous', 'go-top', + 'go-up', 'help-about', 'help-contents', 'help-faq', 'insert-image', + 'insert-link', 'insert-object', 'insert-text', 'list-add', + 'list-remove', 'mail-forward', 'mail-mark-important', 'mail-mark-junk', + 'mail-mark-notjunk', 'mail-mark-read', 'mail-mark-unread', + 'mail-message-new', 'mail-reply-all', 'mail-reply-sender', 'mail-send', + 'mail-send-receive', 'media-eject', 'media-playback-pause', + 'media-playback-start', 'media-playback-stop', 'media-record', + 'media-seek-backward', 'media-seek-forward', 'media-skip-backward', + 'media-skip-forward', 'object-flip-horizontal', 'object-flip-vertical', + 'object-rotate-left', 'object-rotate-right', 'process-stop', + 'system-lock-screen', 'system-log-out', 'system-run', 'system-search', + 'system-reboot', 'system-shutdown', 'tools-check-spelling', + 'view-fullscreen', 'view-refresh', 'view-restore', + 'view-sort-ascending', 'view-sort-descending', 'window-close', + 'window-new', 'zoom-fit-best', 'zoom-in', 'zoom-original', 'zoom-out', + # StandardApplicationIcons + 'accessories-calculator', 'accessories-character-map', + 'accessories-dictionary', 'accessories-text-editor', 'help-browser', + 'multimedia-volume-control', 'preferences-desktop-accessibility', + 'preferences-desktop-font', 'preferences-desktop-keyboard', + 'preferences-desktop-locale', 'preferences-desktop-multimedia', + 'preferences-desktop-screensaver', 'preferences-desktop-theme', + 'preferences-desktop-wallpaper', 'system-file-manager', + 'system-software-install', 'system-software-update', + 'utilities-system-monitor', 'utilities-terminal', + # StandardCategoryIcons + 'applications-accessories', 'applications-development', + 'applications-engineering', 'applications-games', + 'applications-graphics', 'applications-internet', + 'applications-multimedia', 'applications-office', 'applications-other', + 'applications-science', 'applications-system', + 'applications-utilities', 'preferences-desktop', + 'preferences-desktop-peripherals', 'preferences-desktop-personal', + 'preferences-other', 'preferences-system', + 'preferences-system-network', 'system-help', + # StandardDeviceIcons + 'audio-card', 'audio-input-microphone', 'battery', 'camera-photo', + 'camera-video', 'camera-web', 'computer', 'drive-harddisk', + 'drive-optical', 'drive-removable-media', 'input-gaming', + 'input-keyboard', 'input-mouse', 'input-tablet', 'media-flash', + 'media-floppy', 'media-optical', 'media-tape', 'modem', + 'multimedia-player', 'network-wired', 'network-wireless', 'pda', + 'phone', 'printer', 'scanner', 'video-display', + # StandardEmblemIcons + 'emblem-default', 'emblem-documents', 'emblem-downloads', + 'emblem-favorite', 'emblem-important', 'emblem-mail', 'emblem-photos', + 'emblem-readonly', 'emblem-shared', 'emblem-symbolic-link', + 'emblem-synchronized', 'emblem-system', 'emblem-unreadable', + # StandardEmotionIcons + 'face-angel', 'face-angry', 'face-cool', 'face-crying', + 'face-devilish', 'face-embarrassed', 'face-kiss', 'face-laugh', + 'face-monkey', 'face-plain', 'face-raspberry', 'face-sad', 'face-sick', + 'face-smile', 'face-smile-big', 'face-smirk', 'face-surprise', + 'face-tired', 'face-uncertain', 'face-wink', 'face-worried', + # StandardInternationalIcons + 'flag-aa', + # StandardMIMETypeIcons + 'application-x-executable', 'audio-x-generic', 'font-x-generic', + 'image-x-generic', 'package-x-generic', 'text-html', 'text-x-generic', + 'text-x-generic-template', 'text-x-script', 'video-x-generic', + 'x-office-address-book', 'x-office-calendar', 'x-office-document', + 'x-office-presentation', 'x-office-spreadsheet', + # StandardPlaceIcons + 'folder', 'folder-remote', 'network-server', 'network-workgroup', + 'start-here', 'user-bookmarks', 'user-desktop', 'user-home', + 'user-trash', + # StandardStatusIcons + 'appointment-missed', 'appointment-soon', 'audio-volume-high', + 'audio-volume-low', 'audio-volume-medium', 'audio-volume-muted', + 'battery-caution', 'battery-low', 'dialog-error', 'dialog-information', + 'dialog-password', 'dialog-question', 'dialog-warning', + 'folder-drag-accept', 'folder-open', 'folder-visiting', + 'image-loading', 'image-missing', 'mail-attachment', 'mail-unread', + 'mail-read', 'mail-replied', 'mail-signed', 'mail-signed-verified', + 'media-playlist-repeat', 'media-playlist-shuffle', 'network-error', + 'network-idle', 'network-offline', 'network-receive', + 'network-transmit', 'network-transmit-receive', 'printer-error', + 'printer-printing', 'security-high', 'security-medium', 'security-low', + 'software-update-available', 'software-update-urgent', 'sync-error', + 'sync-synchronizing', 'task-due', 'task-past-due', 'user-available', + 'user-away', 'user-idle', 'user-offline', 'user-trash-full', + 'weather-clear', 'weather-clear-night', 'weather-few-clouds', + 'weather-few-clouds-night', 'weather-fog', 'weather-overcast', + 'weather-severe-alert', 'weather-showers', 'weather-showers-scattered', + 'weather-snow', 'weather-storm' + } diff --git a/lightdm_gtk_greeter_settings/IndicatorChooserDialog.py b/lightdm_gtk_greeter_settings/IndicatorChooserDialog.py index 63a7990..ec23d79 100644 --- a/lightdm_gtk_greeter_settings/IndicatorChooserDialog.py +++ b/lightdm_gtk_greeter_settings/IndicatorChooserDialog.py @@ -35,14 +35,16 @@ self._add_callback = add_callback self._add_button.props.visible = add_callback is not None - for path in sorted(iglob(os.path.join(sys.prefix, 'share', 'unity', 'indicators', '*'))): + for path in sorted(iglob(os.path.join(sys.prefix, 'share', 'unity', + 'indicators', '*'))): name = os.path.basename(path) parts = name.rsplit('.', maxsplit=1) if len(parts) == 2 and parts[0] == 'com.canonical.indicator': name = parts[1] self._short_model.append((name,)) - for path in sorted(iglob(os.path.join(sys.prefix, 'lib', 'indicators3', '7', '*.so'))): + for path in sorted(iglob(os.path.join(sys.prefix, 'lib', 'indicators3', + '7', '*.so'))): self._short_model.append((os.path.basename(path),)) def _get_current_value(self): diff --git a/lightdm_gtk_greeter_settings/OptionEntry.py b/lightdm_gtk_greeter_settings/OptionEntry.py index 3683c31..3b17d9a 100644 --- a/lightdm_gtk_greeter_settings/OptionEntry.py +++ b/lightdm_gtk_greeter_settings/OptionEntry.py @@ -8,7 +8,8 @@ from gi.repository import Gtk, Gdk, GObject from lightdm_gtk_greeter_settings.helpers import C_ -from lightdm_gtk_greeter_settings.IndicatorChooserDialog import IndicatorChooserDialog +from lightdm_gtk_greeter_settings.IndicatorChooserDialog import \ + IndicatorChooserDialog from lightdm_gtk_greeter_settings.IconChooserDialog import IconChooserDialog @@ -56,11 +57,11 @@ pass @GObject.Signal(flags=GObject.SIGNAL_RUN_CLEANUP) - def get(self, value: str) -> str: #@IgnorePep8 + def get(self, value: str) -> str: # @IgnorePep8 pass @GObject.Signal(flags=GObject.SIGNAL_RUN_CLEANUP) - def set(self, value: str) -> str: #@IgnorePep8 + def set(self, value: str) -> str: # @IgnorePep8 pass def __repr__(self): @@ -68,7 +69,8 @@ value = self._get_value() except NotImplemented: value = '' - return '%s(%s:%s)' % (self.__class__.__name__, int(self.enabled), value) + return '%s(%s:%s)' % (self.__class__.__name__, int(self.enabled), + value) def _get_value(self): raise NotImplementedError(self.__class__) @@ -88,6 +90,7 @@ class BooleanEntry(BaseEntry): + def __init__(self, widgets): super().__init__(widgets) self._value = widgets['value'] @@ -97,7 +100,8 @@ return 'true' if self._value.props.active else 'false' def _set_value(self, value): - self._value.props.active = value and value.lower() not in ('false', 'no', '0') + self._value.props.active = value and value.lower() not in ( + 'false', 'no', '0') def _set_enabled(self, value): self._value.props.sensitive = value @@ -199,7 +203,7 @@ self._color_choice.props.active = color is not None self._image_choice.props.active = color is None - if color is not None: + if color is not None: self._color_value.props.color = color self._image_value.unselect_all() else: @@ -256,7 +260,8 @@ self._menu.connect('hide', self._on_menu_hide) self._icon_item.connect('activate', self._on_select_icon) self._path_item.connect('activate', self._on_select_path) - self._path_dialog.connect('update-preview', self._on_update_path_preview) + self._path_dialog.connect( + 'update-preview', self._on_update_path_preview) def _get_value(self): return self._value @@ -281,16 +286,21 @@ def _update_menu_items(self, icon=None, path=None): if icon: - self._icon_item.get_child().set_markup(C_('option-entry|icon', 'Icon: {icon}') - .format(icon=icon)) - else: - self._icon_item.get_child().set_markup(C_('option-entry|icon', 'Select icon name...')) + self._icon_item.get_child().set_markup(C_('option-entry|icon', + 'Icon: {icon}') + .format(icon=icon)) + else: + self._icon_item.get_child().set_markup( + C_('option-entry|icon', 'Select icon name...')) if path: - self._path_item.get_child().set_markup(C_('option-entry|icon', 'File: {path}') - .format(path=os.path.basename(path))) - else: - self._path_item.get_child().set_markup(C_('option-entry|icon', 'Select file...')) + self._path_item.get_child()\ + .set_markup(C_('option-entry|icon', + 'File: {path}') + .format(path=os.path.basename(path))) + else: + self._path_item.get_child().set_markup( + C_('option-entry|icon', 'Select file...')) def _get_menu_position(self, menu, widget): allocation = widget.get_allocation() @@ -334,7 +344,8 @@ class IndicatorsEntry(BaseEntry): NAMES_DELIMITER = ';' # It is the only place where model columns order defined - ModelRow = namedtuple('ModelRow', ('enabled', 'name', 'builtin', 'external')) + ModelRow = namedtuple( + 'ModelRow', ('enabled', 'name', 'builtin', 'external')) def __init__(self, widgets): super().__init__(widgets) @@ -356,7 +367,8 @@ self._model = widgets['model'] self._initial_items = OrderedDict((item.name, item) - for item in map(self.ModelRow._make, self._model)) + for item in map(self.ModelRow._make, + self._model)) self._indicators_dialog = None self._treeview.connect('key-press-event', self._on_key_press) @@ -377,8 +389,10 @@ self._emit_changed() def _get_value(self): - return self.NAMES_DELIMITER.join(item.name for item in map(self.ModelRow._make, self._model) - if (item.builtin and item.enabled) or item.external) + return self.NAMES_DELIMITER.join(item.name for item in + map(self.ModelRow._make, self._model) + if (item.builtin and item.enabled) + or item.external) def _set_value(self, value, update_model=True): if update_model: @@ -387,12 +401,14 @@ if value: for name in value.split(self.NAMES_DELIMITER): try: - self._model.append(last_options.pop(name)._replace(enabled=True)) + self._model.append( + last_options.pop(name)._replace(enabled=True)) except KeyError: - self._model.append(self.ModelRow(name=name, external=True, - builtin=False, enabled=False)) - - for item in last_options.values(): + self._model.append( + self.ModelRow(name=name, external=True, + builtin=False, enabled=False)) + + for item in list(last_options.values()): self._model.append(item) self._selection.select_path(0) @@ -426,13 +442,14 @@ if any(row[self._model_name] == name for row in self._model): return C_('option-entry|indicators', 'Indicator "{indicator}" is already in the list')\ - .format(indicator=name) + .format(indicator=name) return True def _add_indicator(self, name): if name: - rowiter = self._model.append(self.ModelRow(name=name, external=True, - builtin=False, enabled=False)) + rowiter = self._model.append( + self.ModelRow(name=name, external=True, + builtin=False, enabled=False)) self._selection.select_iter(rowiter) self._treeview.grab_focus() @@ -442,13 +459,15 @@ elif Gdk.keyval_name(event.keyval) == 'F2': model, rowiter = self._selection.get_selected() if rowiter and model[rowiter][self._model_external]: - self._treeview.set_cursor(model.get_path(rowiter), self._name_column, True) + self._treeview.set_cursor( + model.get_path(rowiter), self._name_column, True) else: return False return True def _on_state_toggled(self, renderer, path): - self._model[path][self._model_enabled] = not self._model[path][self._model_enabled] + self._model[path][self._model_enabled] = not self._model[ + path][self._model_enabled] def _on_name_edited(self, renderer, path, name): check = self._check_indicator(name) @@ -458,17 +477,22 @@ def _on_selection_changed(self, selection): model, rowiter = selection.get_selected() has_selection = rowiter is not None - self._remove.props.sensitive = has_selection and model[rowiter][self._model_external] - self._down.props.sensitive = has_selection and model.iter_next(rowiter) is not None - self._up.props.sensitive = has_selection and model.iter_previous(rowiter) is not None + self._remove.props.sensitive = has_selection and model[ + rowiter][self._model_external] + self._down.props.sensitive = has_selection and model.iter_next( + rowiter) is not None + self._up.props.sensitive = has_selection and model.iter_previous( + rowiter) is not None if has_selection: self._treeview.scroll_to_cell(model.get_path(rowiter)) def _on_add(self, *args): if not self._indicators_dialog: - self._indicators_dialog = IndicatorChooserDialog(check_callback=self._check_indicator, - add_callback=self._add_indicator) - self._indicators_dialog.props.transient_for = self._treeview.get_toplevel() + self._indicators_dialog = IndicatorChooserDialog( + check_callback=self._check_indicator, + add_callback=self._add_indicator) + self._indicators_dialog.props.transient_for = \ + self._treeview.get_toplevel() name = self._indicators_dialog.get_indicator() if name: self._add_indicator(name) @@ -486,19 +510,22 @@ class PositionEntry(BaseEntry): class Dimension: + def __init__(self, name, widgets, anchors, on_changed): self.__dict__.update(('_%s' % w, widgets['%s_%s' % (name, w)]) - for w in ('value', 'percents', 'mirror', 'adjustment')) + for w in ('value', 'percents', 'mirror', + 'adjustment')) self._name = name self._on_changed = on_changed self._anchor = '' self._percents.connect('toggled', self._on_percents_toggled) self._mirror.connect('toggled', self._on_mirror_toggled) - self._on_value_changed_id = self._adjustment.connect('value-changed', - self._on_value_changed) - - for (x, y), widget in anchors.items(): + self._on_value_changed_id = self._adjustment.connect( + 'value-changed', + self._on_value_changed) + + for (x, y), widget in list(anchors.items()): widget.connect('toggled', self._on_anchor_toggled, self, x if self._name == 'x' else y) @@ -532,7 +559,8 @@ self._anchor = anchor self._percents.props.active = percents - self._adjustment.props.upper = 100 if self._percents.props.active else 10000 + self._adjustment.props.upper = 100 if self._percents.props.active \ + else 10000 self._mirror.props.active = negative with self._adjustment.handler_block(self._on_value_changed_id): self._adjustment.props.value = -p if negative else p @@ -572,14 +600,16 @@ self._on_changed(self) def _on_percents_toggled(self, toggle): - self._adjustment.props.upper = 100 if toggle.props.active else 10000 + self._adjustment.props.upper = 100 if toggle.props.active \ + else 10000 self._on_changed(self) def _on_mirror_toggled(self, toggle): self._on_changed(self) def _on_anchor_toggled(self, toggle, dimension, anchor): - if dimension == self and toggle.props.active and anchor != self._anchor: + if dimension == self and toggle.props.active \ + and anchor != self._anchor: self._anchor = anchor self._on_changed(self) @@ -593,17 +623,22 @@ self._screen_size = (0, 0) self._anchors = {(x, y): widgets['base_%s_%s' % (x, y)] - for x, y in product(('start', 'center', 'end'), repeat=2)} - - self._on_resize_id = self._screen.connect('size-allocate', self._on_resize) + for x, y in product(('start', 'center', 'end'), + repeat=2)} + + self._on_resize_id = self._screen.connect( + 'size-allocate', self._on_resize) self._screen.connect('draw', self._on_draw_screen_border) self._screen.connect('screen-changed', self._on_gdkscreen_changed) - self._on_gdkscreen_monitors_changed_id = self._screen.get_screen().connect( - 'monitors-changed', - self._on_gdkscreen_monitors_changed) - - self._x = PositionEntry.Dimension('x', widgets, self._anchors, self._on_dimension_changed) - self._y = PositionEntry.Dimension('y', widgets, self._anchors, self._on_dimension_changed) + self._on_gdkscreen_monitors_changed_id = \ + self._screen.get_screen().connect('monitors-changed', + self. + _on_gdkscreen_monitors_changed) + + self._x = PositionEntry.Dimension( + 'x', widgets, self._anchors, self._on_dimension_changed) + self._y = PositionEntry.Dimension( + 'y', widgets, self._anchors, self._on_dimension_changed) def _get_value(self): return self._x.value + ' ' + self._y.value @@ -623,8 +658,10 @@ window_size = window_allocation.width, window_allocation.height scale = self._screen_size[0] / geometry.width - x = self._screen_pos[0] + self._x.get_scaled_position(self._screen_size, window_size, scale) - y = self._screen_pos[1] + self._y.get_scaled_position(self._screen_size, window_size, scale) + x = self._screen_pos[0] + \ + self._x.get_scaled_position(self._screen_size, window_size, scale) + y = self._screen_pos[1] + \ + self._y.get_scaled_position(self._screen_size, window_size, scale) self._screen.move(self._window, x, y) self._screen.check_resize() @@ -645,8 +682,9 @@ with self._screen.handler_block(self._on_resize_id): scale = width / geometry.width - self._window.set_size_request(PositionEntry.REAL_WINDOW_SIZE[0] * scale, - PositionEntry.REAL_WINDOW_SIZE[1] * scale) + self._window.set_size_request( + PositionEntry.REAL_WINDOW_SIZE[0] * scale, + PositionEntry.REAL_WINDOW_SIZE[1] * scale) self._update_layout() def _on_draw_screen_border(self, widget, cr): @@ -675,8 +713,8 @@ if prev_screen: prev_screen.disconnect(self._on_gdkscreen_monitors_changed_id) self._on_gdkscreen_monitors_changed_id = widget.get_screen().connect( - 'monitors-changed', - self._on_gdkscreen_monitors_changed) + 'monitors-changed', + self._on_gdkscreen_monitors_changed) def _on_gdkscreen_monitors_changed(self, screen): self._screen.queue_resize() diff --git a/po/lightdm-gtk-greeter-settings.pot b/po/lightdm-gtk-greeter-settings.pot index 74d414f..87f42be 100644 --- a/po/lightdm-gtk-greeter-settings.pot +++ b/po/lightdm-gtk-greeter-settings.pot @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-03-02 16:43+0300\n" +"POT-Creation-Date: 2014-03-15 23:18-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -360,11 +360,12 @@ msgid "Absolute path to indicator library file (*.so)" msgstr "" -#: ../lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py:93 +#: ../lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py:102 msgid "No permissions to save configuration" msgstr "" -#: ../lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py:95 +#: ../lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py:104 +#, python-brace-format msgid "" "It seems that you don't have permissions to write to file:\n" "{path}\n" @@ -372,92 +373,97 @@ "Try to run this program using \"sudo\" or \"pkexec\"" msgstr "" -#: ../lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py:116 +#: ../lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py:133 +#, python-brace-format msgctxt "option|timeout" msgid "{count} min" msgstr "" -#: ../lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py:132 +#: ../lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py:150 +#, python-brace-format msgid "Failed to read configuration file: {path}" msgstr "" -#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:170 +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:186 msgctxt "icon-dialog" msgid "All contexts" msgstr "" #. separator -#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:172 +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:188 msgctxt "icon-dialog" msgid "Actions" msgstr "" -#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:173 +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:189 msgctxt "icon-dialog" msgid "Applications" msgstr "" -#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:174 +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:190 msgctxt "icon-dialog" msgid "Categories" msgstr "" -#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:175 +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:191 msgctxt "icon-dialog" msgid "Devices" msgstr "" -#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:176 +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:192 msgctxt "icon-dialog" msgid "Emblems" msgstr "" -#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:177 +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:193 msgctxt "icon-dialog" msgid "Emoticons" msgstr "" -#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:178 +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:194 msgctxt "icon-dialog" msgid "International" msgstr "" -#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:179 +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:195 msgctxt "icon-dialog" msgid "MIME Types" msgstr "" -#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:180 +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:196 msgctxt "icon-dialog" msgid "Places" msgstr "" -#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:181 +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:197 msgctxt "icon-dialog" msgid "Status" msgstr "" -#: ../lightdm_gtk_greeter_settings/OptionEntry.py:284 +#: ../lightdm_gtk_greeter_settings/OptionEntry.py:290 +#, python-brace-format msgctxt "option-entry|icon" msgid "Icon: {icon}" msgstr "" -#: ../lightdm_gtk_greeter_settings/OptionEntry.py:287 +#: ../lightdm_gtk_greeter_settings/OptionEntry.py:294 msgctxt "option-entry|icon" msgid "Select icon name..." msgstr "" -#: ../lightdm_gtk_greeter_settings/OptionEntry.py:290 +#: ../lightdm_gtk_greeter_settings/OptionEntry.py:299 +#, python-brace-format msgctxt "option-entry|icon" msgid "File: {path}" msgstr "" -#: ../lightdm_gtk_greeter_settings/OptionEntry.py:293 +#: ../lightdm_gtk_greeter_settings/OptionEntry.py:303 msgctxt "option-entry|icon" msgid "Select file..." msgstr "" -#: ../lightdm_gtk_greeter_settings/OptionEntry.py:427 +#: ../lightdm_gtk_greeter_settings/OptionEntry.py:444 +#, python-brace-format msgctxt "option-entry|indicators" msgid "Indicator \"{indicator}\" is already in the list" msgstr "" diff --git a/setup.py b/setup.py index 3fec804..a3df79b 100644 --- a/setup.py +++ b/setup.py @@ -2,17 +2,21 @@ import os import sys -import configparser try: import DistUtilsExtra.auto except ImportError: - print('To build lightdm-gtk-greeter-settings you need https://launchpad.net/python-distutils-extra') + print( + 'To build lightdm-gtk-greeter-settings you need ' + 'https://launchpad.net/python-distutils-extra') sys.exit(1) -assert DistUtilsExtra.auto.__version__ >= '2.18', 'needs DistUtilsExtra.auto >= 2.18' +assert DistUtilsExtra.auto.__version__ >= '2.18', \ + 'needs DistUtilsExtra.auto >= 2.18' + def write_config(libdir, values): - filename = os.path.join(libdir, 'lightdm_gtk_greeter_settings/installation_config.py') + filename = os.path.join( + libdir, 'lightdm_gtk_greeter_settings/installation_config.py') try: f = open(filename, 'w') f.write('__all__ = [%s]\n' % ', '.join('"%s"' % k for k in values)) @@ -24,6 +28,7 @@ class InstallAndUpdateDataDirectory(DistUtilsExtra.auto.install_auto): + def run(self): DistUtilsExtra.auto.install_auto.run(self) @@ -36,8 +41,7 @@ write_config(self.install_lib, values) -DistUtilsExtra.auto.setup \ -( +DistUtilsExtra.auto.setup( name='lightdm-gtk-greeter-settings', version='0.3', license='GPL-3', @@ -48,4 +52,3 @@ url='https://launchpad.net/lightdm-gtk-greeter-settings', cmdclass={'install': InstallAndUpdateDataDirectory}, ) -