Complete KDE and GTK style capture and restore desktop count

This commit is contained in:
fi3w0 2026-10-03 05:15:00 +02:00
parent 714c96682a
commit 09503bf948
15 changed files with 319 additions and 13 deletions

View file

@ -9,7 +9,7 @@
![License](https://img.shields.io/badge/license-MIT-purple) ![License](https://img.shields.io/badge/license-MIT-purple)
![Status](https://img.shields.io/badge/status-work_in_progress-yellow) ![Status](https://img.shields.io/badge/status-work_in_progress-yellow)
[KDE & apps](#configs) · [Shortcuts](docs/shortcuts.md) · [Packages](#package-sections) · [Setup](docs/setup.md) [KDE styling](docs/kde-style.md) · [Shortcuts](docs/shortcuts.md) · [Packages](#package-sections) · [Setup](docs/setup.md)
</div> </div>
@ -92,8 +92,9 @@ the default. Kernel choice is independent of bootloader choice.
## Configs ## Configs
Every config is independently selectable, even when its package section is Every config is independently selectable, even when its package section is
unchecked—for example, to configure apps already installed. KDE appearance covers colours, unchecked—for example, to configure apps already installed. KDE appearance covers
fonts, cursor, window decorations and Dolphin styling. Panels, widgets and colours, fonts, cursor and window decorations, with matching GTK preferences.
Dolphin styling has its own checkbox. Panels, widgets and
wallpapers are excluded. All portable current shortcut assignments, wallpapers are excluded. All portable current shortcut assignments,
including disabled defaults, are captured with their launchers and helpers; including disabled defaults, are captured with their launchers and helpers;
unused machine-specific activity IDs are omitted. unused machine-specific activity IDs are omitted.

View file

@ -1,6 +1,6 @@
{ {
"kde-style": { "kde-style": {
"label": "KDE colours, fonts, cursor and decorations", "label": "KDE + GTK colours, fonts, cursor and decorations",
"group": "kde", "group": "kde",
"kde": true "kde": true
}, },

View file

@ -0,0 +1,3 @@
[Desktops]
Number=1
Rows=1

View file

@ -0,0 +1,84 @@
@define-color borders_breeze #464251;
@define-color content_view_bg_breeze #16131f;
@define-color error_color_backdrop_breeze #da4453;
@define-color error_color_breeze #da4453;
@define-color error_color_insensitive_backdrop_breeze #56222f;
@define-color error_color_insensitive_breeze #56222f;
@define-color insensitive_base_color_breeze #15121e;
@define-color insensitive_base_fg_color_breeze #5b5864;
@define-color insensitive_bg_color_breeze #1c1827;
@define-color insensitive_borders_breeze #292535;
@define-color insensitive_fg_color_breeze #5f5c6a;
@define-color insensitive_selected_bg_color_breeze #1c1827;
@define-color insensitive_selected_fg_color_breeze #5f5c6a;
@define-color insensitive_unfocused_bg_color_breeze #1c1827;
@define-color insensitive_unfocused_fg_color_breeze #5f5c6a;
@define-color insensitive_unfocused_selected_bg_color_breeze #1c1827;
@define-color insensitive_unfocused_selected_fg_color_breeze #5f5c6a;
@define-color link_color_breeze #c7c2db;
@define-color link_visited_color_breeze #9d8fd9;
@define-color success_color_backdrop_breeze #27ae60;
@define-color success_color_breeze #27ae60;
@define-color success_color_insensitive_backdrop_breeze #1b4633;
@define-color success_color_insensitive_breeze #1b4633;
@define-color theme_base_color_breeze #16131f;
@define-color theme_bg_color_breeze #1d1929;
@define-color theme_button_background_backdrop_breeze #262036;
@define-color theme_button_background_backdrop_insensitive_breeze #241f33;
@define-color theme_button_background_insensitive_breeze #241f33;
@define-color theme_button_background_normal_breeze #262036;
@define-color theme_button_decoration_focus_backdrop_breeze #6e56af;
@define-color theme_button_decoration_focus_backdrop_insensitive_breeze #3c315c;
@define-color theme_button_decoration_focus_breeze #6e56af;
@define-color theme_button_decoration_focus_insensitive_breeze #3c315c;
@define-color theme_button_decoration_hover_backdrop_breeze #6e56af;
@define-color theme_button_decoration_hover_backdrop_insensitive_breeze #3c315c;
@define-color theme_button_decoration_hover_breeze #6e56af;
@define-color theme_button_decoration_hover_insensitive_breeze #3c315c;
@define-color theme_button_foreground_active_backdrop_breeze #e8e4f3;
@define-color theme_button_foreground_active_backdrop_insensitive_breeze #5f5c6a;
@define-color theme_button_foreground_active_breeze #ffffff;
@define-color theme_button_foreground_active_insensitive_breeze #5f5c6a;
@define-color theme_button_foreground_backdrop_breeze #e8e4f3;
@define-color theme_button_foreground_backdrop_insensitive_breeze #656074;
@define-color theme_button_foreground_insensitive_breeze #656074;
@define-color theme_button_foreground_normal_breeze #e8e4f3;
@define-color theme_fg_color_breeze #e8e4f3;
@define-color theme_header_background_backdrop_breeze #1d1929;
@define-color theme_header_background_breeze #1a1625;
@define-color theme_header_background_light_breeze #1d1929;
@define-color theme_header_foreground_backdrop_breeze #e8e4f3;
@define-color theme_header_foreground_breeze #e8e4f3;
@define-color theme_header_foreground_insensitive_backdrop_breeze #e8e4f3;
@define-color theme_header_foreground_insensitive_breeze #e8e4f3;
@define-color theme_hovering_selected_bg_color_breeze #6e56af;
@define-color theme_selected_bg_color_breeze #534183;
@define-color theme_selected_fg_color_breeze #ffffff;
@define-color theme_text_color_breeze #e8e4f3;
@define-color theme_titlebar_background_backdrop_breeze #1d1929;
@define-color theme_titlebar_background_breeze #1a1625;
@define-color theme_titlebar_background_light_breeze #1d1929;
@define-color theme_titlebar_foreground_backdrop_breeze #e8e4f3;
@define-color theme_titlebar_foreground_breeze #e8e4f3;
@define-color theme_titlebar_foreground_insensitive_backdrop_breeze #e8e4f3;
@define-color theme_titlebar_foreground_insensitive_breeze #e8e4f3;
@define-color theme_unfocused_base_color_breeze #16131f;
@define-color theme_unfocused_bg_color_breeze #1d1929;
@define-color theme_unfocused_fg_color_breeze #e8e4f3;
@define-color theme_unfocused_selected_bg_color_alt_breeze #2d2447;
@define-color theme_unfocused_selected_bg_color_breeze #2d2447;
@define-color theme_unfocused_selected_fg_color_breeze #e8e4f3;
@define-color theme_unfocused_text_color_breeze #e8e4f3;
@define-color theme_unfocused_view_bg_color_breeze #15121e;
@define-color theme_unfocused_view_text_color_breeze #5b5864;
@define-color theme_view_active_decoration_color_breeze #6e56af;
@define-color theme_view_hover_decoration_color_breeze #6e56af;
@define-color tooltip_background_breeze #1d1929;
@define-color tooltip_border_breeze #464251;
@define-color tooltip_text_breeze #e8e4f3;
@define-color unfocused_borders_breeze #464251;
@define-color unfocused_insensitive_borders_breeze #292535;
@define-color warning_color_backdrop_breeze #f67400;
@define-color warning_color_breeze #f67400;
@define-color warning_color_insensitive_backdrop_breeze #603213;
@define-color warning_color_insensitive_breeze #603213;

View file

@ -0,0 +1 @@
@import 'colors.css';

View file

@ -0,0 +1,84 @@
@define-color borders_breeze #464251;
@define-color content_view_bg_breeze #16131f;
@define-color error_color_backdrop_breeze #da4453;
@define-color error_color_breeze #da4453;
@define-color error_color_insensitive_backdrop_breeze #56222f;
@define-color error_color_insensitive_breeze #56222f;
@define-color insensitive_base_color_breeze #15121e;
@define-color insensitive_base_fg_color_breeze #5b5864;
@define-color insensitive_bg_color_breeze #1c1827;
@define-color insensitive_borders_breeze #292535;
@define-color insensitive_fg_color_breeze #5f5c6a;
@define-color insensitive_selected_bg_color_breeze #1c1827;
@define-color insensitive_selected_fg_color_breeze #5f5c6a;
@define-color insensitive_unfocused_bg_color_breeze #1c1827;
@define-color insensitive_unfocused_fg_color_breeze #5f5c6a;
@define-color insensitive_unfocused_selected_bg_color_breeze #1c1827;
@define-color insensitive_unfocused_selected_fg_color_breeze #5f5c6a;
@define-color link_color_breeze #c7c2db;
@define-color link_visited_color_breeze #9d8fd9;
@define-color success_color_backdrop_breeze #27ae60;
@define-color success_color_breeze #27ae60;
@define-color success_color_insensitive_backdrop_breeze #1b4633;
@define-color success_color_insensitive_breeze #1b4633;
@define-color theme_base_color_breeze #16131f;
@define-color theme_bg_color_breeze #1d1929;
@define-color theme_button_background_backdrop_breeze #262036;
@define-color theme_button_background_backdrop_insensitive_breeze #241f33;
@define-color theme_button_background_insensitive_breeze #241f33;
@define-color theme_button_background_normal_breeze #262036;
@define-color theme_button_decoration_focus_backdrop_breeze #6e56af;
@define-color theme_button_decoration_focus_backdrop_insensitive_breeze #3c315c;
@define-color theme_button_decoration_focus_breeze #6e56af;
@define-color theme_button_decoration_focus_insensitive_breeze #3c315c;
@define-color theme_button_decoration_hover_backdrop_breeze #6e56af;
@define-color theme_button_decoration_hover_backdrop_insensitive_breeze #3c315c;
@define-color theme_button_decoration_hover_breeze #6e56af;
@define-color theme_button_decoration_hover_insensitive_breeze #3c315c;
@define-color theme_button_foreground_active_backdrop_breeze #e8e4f3;
@define-color theme_button_foreground_active_backdrop_insensitive_breeze #5f5c6a;
@define-color theme_button_foreground_active_breeze #ffffff;
@define-color theme_button_foreground_active_insensitive_breeze #5f5c6a;
@define-color theme_button_foreground_backdrop_breeze #e8e4f3;
@define-color theme_button_foreground_backdrop_insensitive_breeze #656074;
@define-color theme_button_foreground_insensitive_breeze #656074;
@define-color theme_button_foreground_normal_breeze #e8e4f3;
@define-color theme_fg_color_breeze #e8e4f3;
@define-color theme_header_background_backdrop_breeze #1d1929;
@define-color theme_header_background_breeze #1a1625;
@define-color theme_header_background_light_breeze #1d1929;
@define-color theme_header_foreground_backdrop_breeze #e8e4f3;
@define-color theme_header_foreground_breeze #e8e4f3;
@define-color theme_header_foreground_insensitive_backdrop_breeze #e8e4f3;
@define-color theme_header_foreground_insensitive_breeze #e8e4f3;
@define-color theme_hovering_selected_bg_color_breeze #6e56af;
@define-color theme_selected_bg_color_breeze #534183;
@define-color theme_selected_fg_color_breeze #ffffff;
@define-color theme_text_color_breeze #e8e4f3;
@define-color theme_titlebar_background_backdrop_breeze #1d1929;
@define-color theme_titlebar_background_breeze #1a1625;
@define-color theme_titlebar_background_light_breeze #1d1929;
@define-color theme_titlebar_foreground_backdrop_breeze #e8e4f3;
@define-color theme_titlebar_foreground_breeze #e8e4f3;
@define-color theme_titlebar_foreground_insensitive_backdrop_breeze #e8e4f3;
@define-color theme_titlebar_foreground_insensitive_breeze #e8e4f3;
@define-color theme_unfocused_base_color_breeze #16131f;
@define-color theme_unfocused_bg_color_breeze #1d1929;
@define-color theme_unfocused_fg_color_breeze #e8e4f3;
@define-color theme_unfocused_selected_bg_color_alt_breeze #2d2447;
@define-color theme_unfocused_selected_bg_color_breeze #2d2447;
@define-color theme_unfocused_selected_fg_color_breeze #e8e4f3;
@define-color theme_unfocused_text_color_breeze #e8e4f3;
@define-color theme_unfocused_view_bg_color_breeze #15121e;
@define-color theme_unfocused_view_text_color_breeze #5b5864;
@define-color theme_view_active_decoration_color_breeze #6e56af;
@define-color theme_view_hover_decoration_color_breeze #6e56af;
@define-color tooltip_background_breeze #1d1929;
@define-color tooltip_border_breeze #464251;
@define-color tooltip_text_breeze #e8e4f3;
@define-color unfocused_borders_breeze #464251;
@define-color unfocused_insensitive_borders_breeze #292535;
@define-color warning_color_backdrop_breeze #f67400;
@define-color warning_color_breeze #f67400;
@define-color warning_color_insensitive_backdrop_breeze #603213;
@define-color warning_color_insensitive_breeze #603213;

View file

@ -0,0 +1 @@
@import 'colors.css';

View file

@ -0,0 +1,7 @@
[Settings]
gtk-application-prefer-dark-theme=true
gtk-cursor-theme-name=Fiw-Qogir
gtk-cursor-theme-size=24
gtk-font-name=JetBrainsMono Nerd Font Mono, 10
gtk-icon-theme-name=breeze-dark
gtk-theme-name=Breeze

View file

@ -0,0 +1,6 @@
[Settings]
gtk-application-prefer-dark-theme=true
gtk-cursor-theme-name=Fiw-Qogir
gtk-cursor-theme-size=24
gtk-font-name=JetBrainsMono Nerd Font Mono, 10
gtk-icon-theme-name=breeze-dark

View file

@ -135,8 +135,6 @@ ForegroundVisited=157,143,217
[General] [General]
AccentColor=110,86,175 AccentColor=110,86,175
ColorScheme=GentooPurple ColorScheme=GentooPurple
TerminalApplication=kitty
TerminalService=kitty.desktop
XftAntialias=true XftAntialias=true
XftHintStyle=hintslight XftHintStyle=hintslight
XftSubPixel=rgb XftSubPixel=rgb

View file

@ -5,7 +5,7 @@ italic_font auto
bold_italic_font auto bold_italic_font auto
font_size 11.0 font_size 11.0
linux_display_server wayland linux_display_server auto
background_blur 32 background_blur 32
dynamic_background_opacity yes dynamic_background_opacity yes

96
docs/kde-style.md Normal file
View file

@ -0,0 +1,96 @@
# KDE styling preset
Fiw’s current appearance, restored through the optional `kde-style` config.
Dolphin, Spectacle, fonts and portable terminal configs have their own
checkboxes. The settings below describe the capture; no desktop settings
are applied by reading this reference.
## Appearance
| Setting | Captured value |
|---|---|
| Colour scheme | GentooPurple, derived from Breeze Dark |
| Accent / focus | `#6E56AF` |
| Window background | `#1D1929` |
| View background | `#16131F` |
| Normal text | `#E8E4F3` |
| Selection background | `#534183` |
| Icons | Breeze Dark |
| KDE look and feel | Breeze Dark |
| Cursor | Qogir, bundled under the name Fiw-Qogir |
| Window decorations | Utterly-Round-Dark, bundled Aurorae theme |
| Border size | No side borders |
| Decoration tooltips | Disabled |
| Animation duration factor | `0.25` |
The complete colour groups live in
[kdeglobals](../configs/kde-style/kconfig/.config/kdeglobals). Theme and cursor
assets are included in the same config, with their original licence notices.
Breeze and Aurorae come through the normal Plasma package dependencies.
No terminal association is set by the appearance preset.
## Fonts
| Use | Family | Size |
|---|---|---|
| General UI, menus, toolbar and window title | JetBrainsMono Nerd Font Mono | 10 pt |
| Fixed-width text | JetBrainsMono Nerd Font Mono | 10 pt |
| Small readable text | JetBrainsMono Nerd Font Mono | 8 pt |
| Kitty | JetBrainsMono Nerd Font Mono | 11 pt |
KDE uses antialiasing, slight hinting and RGB subpixel rendering as captured.
The separate `fonts` checkbox installs Regular, Bold, Italic and Bold Italic
under the user’s font directory; keep it selected to reproduce this typography
unless the same family is already installed. Fonts work independently of KDE.
## GTK styling
The KDE style checkbox also restores the captured GTK 3 and GTK 4 preferences:
- Dark preference, Breeze Dark icons and the same 10 pt font.
- Fiw-Qogir cursor at size 24.
- GTK 3’s Breeze theme preference.
- The current `gtk.css` imports and generated purple `colors.css` palette.
Other settings in each `settings.ini` are preserved. Existing CSS files follow
the same conflict, backup and update rules as other configs. Applications use
these colours and preferences according to their toolkit’s theme support.
## Dolphin and Spectacle
These are individually optional configs.
| Config | Captured preferences |
|---|---|
| Dolphin | Menu bar hidden; toolbar with back, forward, up, home, location, search and menu; fixed 22 px Places icons; sidebar/dock state; case-insensitive filename filtering |
| Dolphin window rule | 96% active opacity, 92% inactive opacity; applies to Dolphin windows |
| Spectacle | Annotation tool selection; release-to-capture disabled |
The toolbar XML includes the captured app action properties. The sidebar/dock
state is Qt’s saved layout; it does not copy tabs, bookmarks or file history.
KWin rules merge with other target rules instead of replacing their list.
## Portable terminal styling
Fish, Kitty, Neovim and Fastfetch stay separate from KDE settings:
- **Fish:** aliases, Fastfetch greeting and command completion notifications.
- **Kitty:** lavender palette, padding, 50% opacity in the main profile and
62% in the brighter profile. Display selection is automatic for Wayland/X11;
blur is used where the compositor supports it.
- **Neovim:** transparent backgrounds and purple highlights; uses an existing
Catppuccin Mocha plugin when available, otherwise the built-in dark theme.
- **Fastfetch:** the current tree layout and colours, with its built-in Gentoo logo.
## Applying the capture
Select the configs in `./install` and review the preview. They can be restored
without selecting package installation groups, for applications already present.
For KDE configs, log out of Plasma and apply from a TTY so the session cannot
rewrite the files. The installer checks this before making changes.
Configuration conflicts prompt apply or keep. Replacements receive backups;
updates preserve local edits and leave proposed changes in `.new` files.
Panels, widgets, wallpaper and output-specific tiling layouts stay local.
The [shortcut preset](shortcuts.md) separately restores the captured desktop
count and rows, without copying desktop or monitor IDs.

View file

@ -42,8 +42,9 @@ The native Spectacle bindings are unassigned to avoid competing actions.
The desktop-move bindings are stored as literal symbols (`!`, `@`, `#`). The desktop-move bindings are stored as literal symbols (`!`, `@`, `#`).
On a US layout these usually mean Shift+1/2/3; other layouts can differ. On a US layout these usually mean Shift+1/2/3; other layouts can differ.
The keyboard-layout preset contains US English, Russian and Spanish; The keyboard-layout preset contains US English, Russian and Spanish;
`Meta+Alt+Space` cycles through them. Shortcut restoration does not `Meta+Alt+Space` cycles through them. The shortcut preset also restores
create three virtual desktops or activities on a new installation. the captured virtual-desktop count and rows. Device IDs are not copied;
KWin creates IDs when needed and retains existing target IDs.
## Captured choices ## Captured choices
@ -56,6 +57,9 @@ in the default column), Minimize (`Meta+PgDown`), Restore
recorded global actions are unassigned. `Meta+1/2/3` are used for recorded global actions are unassigned. `Meta+1/2/3` are used for
desktops, with the corresponding task-manager shortcuts disabled. desktops, with the corresponding task-manager shortcuts disabled.
Captured desktop layout: **1 desktop(s), 1 row(s)**.
Bindings for desktops 1–3 are retained exactly as configured.
## All assigned actions ## All assigned actions
### Keyboard Layout Switcher ### Keyboard Layout Switcher

View file

@ -85,7 +85,20 @@ def capture():
+ ['[General]', '[Icons]', '[KDE]', '[WM]']) + ['[General]', '[Icons]', '[KDE]', '[WM]'])
p = REPO / 'configs/kde-style/kconfig/.config/kdeglobals' p = REPO / 'configs/kde-style/kconfig/.config/kdeglobals'
p.write_text('\n'.join(line for line in p.read_text().splitlines() p.write_text('\n'.join(line for line in p.read_text().splitlines()
if not line.startswith(('ColorSchemeHash=', 'LastUsedCustomAccentColor='))) + '\n') if not line.startswith(('ColorSchemeHash=', 'LastUsedCustomAccentColor=',
'TerminalApplication=', 'TerminalService='))) + '\n')
gtk_keys = ['gtk-theme-name', 'gtk-icon-theme-name', 'gtk-font-name',
'gtk-cursor-theme-name', 'gtk-cursor-theme-size',
'gtk-application-prefer-dark-theme']
for version in ['3.0', '4.0']:
for name in ['gtk.css', 'colors.css']:
copy('kde-style', f'.config/gtk-{version}/{name}')
relative = f'.config/gtk-{version}/settings.ini'
kconfig('kde-style', relative, keys={'[Settings]': gtk_keys})
dest = REPO / 'configs/kde-style/kconfig' / relative
if dest.is_file():
dest.write_text(dest.read_text().replace('gtk-cursor-theme-name=Qogir',
'gtk-cursor-theme-name=Fiw-Qogir'))
kconfig('kde-style', '.config/kcminputrc', keys={'[Mouse]': ['cursorTheme']}) kconfig('kde-style', '.config/kcminputrc', keys={'[Mouse]': ['cursorTheme']})
kconfig('kde-style', '.config/kwinrc', groups=['[org.kde.kdecoration2]']) kconfig('kde-style', '.config/kwinrc', groups=['[org.kde.kdecoration2]'])
kconfig('dolphin', '.config/dolphinrc', groups=['[KFileDialog Settings]', '[MainWindow]']) kconfig('dolphin', '.config/dolphinrc', groups=['[KFileDialog Settings]', '[MainWindow]'])
@ -98,6 +111,7 @@ def capture():
copy('kde-style', '.local/share/color-schemes/GentooPurple.colors') copy('kde-style', '.local/share/color-schemes/GentooPurple.colors')
kconfig('kde-shortcuts', '.config/kglobalshortcutsrc') kconfig('kde-shortcuts', '.config/kglobalshortcutsrc')
kconfig('kde-shortcuts', '.config/kxkbrc', groups=['[Layout]']) kconfig('kde-shortcuts', '.config/kxkbrc', groups=['[Layout]'])
kconfig('kde-shortcuts', '.config/kwinrc', keys={'[Desktops]': ['Number', 'Rows']})
for name in ['net.local.kitty.desktop', 'net.local.fiw-shot-region.desktop', 'net.local.fiw-shot-screen.desktop']: for name in ['net.local.kitty.desktop', 'net.local.fiw-shot-region.desktop', 'net.local.fiw-shot-screen.desktop']:
copy('kde-shortcuts', '.local/share/applications/' + name, copy('kde-shortcuts', '.local/share/applications/' + name,
lambda t: t.replace('Exec=' + str(HOME) + '/.local/bin/fiw-shot', 'Exec="{{HOME}}/.local/bin/fiw-shot"')) lambda t: t.replace('Exec=' + str(HOME) + '/.local/bin/fiw-shot', 'Exec="{{HOME}}/.local/bin/fiw-shot"'))
@ -108,7 +122,9 @@ def capture():
"if type -q fiw-update\n alias update='sudo fiw-update'\nend")) "if type -q fiw-update\n alias update='sudo fiw-update'\nend"))
copy('fish', '.config/fish/conf.d/done.fish') copy('fish', '.config/fish/conf.d/done.fish')
for name in ['kitty.conf', 'kitty-main.conf', 'kitty-bright.conf', 'kitty-common.conf']: for name in ['kitty.conf', 'kitty-main.conf', 'kitty-bright.conf', 'kitty-common.conf']:
copy('kitty', '.config/kitty/' + name) copy('kitty', '.config/kitty/' + name,
lambda t: re.sub(r'(?m)^linux_display_server\s+wayland\s*$',
'linux_display_server auto', t))
copy('neovim', '.config/nvim/init.lua') copy('neovim', '.config/nvim/init.lua')
# Keep the layout; the built-in Gentoo logo also works outside Kitty. # Keep the layout; the built-in Gentoo logo also works outside Kitty.
data = json.loads((HOME / '.config/fastfetch/config.jsonc').read_text()) data = json.loads((HOME / '.config/fastfetch/config.jsonc').read_text())

View file

@ -64,8 +64,9 @@ def generate():
'The desktop-move bindings are stored as literal symbols (`!`, `@`, `#`).', 'The desktop-move bindings are stored as literal symbols (`!`, `@`, `#`).',
'On a US layout these usually mean Shift+1/2/3; other layouts can differ.', 'On a US layout these usually mean Shift+1/2/3; other layouts can differ.',
'The keyboard-layout preset contains US English, Russian and Spanish;', 'The keyboard-layout preset contains US English, Russian and Spanish;',
'`Meta+Alt+Space` cycles through them. Shortcut restoration does not', '`Meta+Alt+Space` cycles through them. The shortcut preset also restores',
'create three virtual desktops or activities on a new installation.', '', 'the captured virtual-desktop count and rows. Device IDs are not copied;',
'KWin creates IDs when needed and retains existing target IDs.', '',
'## Captured choices', ''] '## Captured choices', '']
lookup = {(r[0], r[1]): r for r in entries} lookup = {(r[0], r[1]): r for r in entries}
highlights = [ highlights = [
@ -107,6 +108,10 @@ def generate():
for key, owners in duplicates.items(): for key, owners in duplicates.items():
lines.append('- ' + keys([key]) + ': ' + cell('; '.join(owners))) lines.append('- ' + keys([key]) + ': ' + cell('; '.join(owners)))
lines.append('') lines.append('')
desktop = sections((SOURCE.parent / 'kwinrc').read_text()).get('[Desktops]', {})
lines += ['Captured desktop layout: **' + desktop.get('Number', 'unspecified') +
' desktop(s), ' + desktop.get('Rows', 'unspecified') + ' row(s)**.',
'Bindings for desktops 1–3 are retained exactly as configured.', '']
lines += ['## All assigned actions', ''] lines += ['## All assigned actions', '']
grouped = defaultdict(list) grouped = defaultdict(list)
for record in entries: for record in entries: