Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3fb8d3dfee | ||
|
|
1038662ee1 | ||
|
|
233ca9e7fd | ||
|
|
4e92d7a755 | ||
|
|
9fbe6646be | ||
|
|
a640b0d742 | ||
|
|
dbd9880ddd | ||
|
|
58f70553b8 | ||
|
|
9571b755f8 | ||
|
|
1590ccae69 | ||
|
|
40a3207978 | ||
|
|
fc24a050f1 | ||
|
|
0fe492967a | ||
|
|
d744a1b972 | ||
|
|
bee45f21ad | ||
|
|
447528532e | ||
|
|
5a033489b3 | ||
|
|
d5cc3389d5 |
@@ -0,0 +1,766 @@
|
|||||||
|
{
|
||||||
|
"dockConfigs": [
|
||||||
|
{
|
||||||
|
"id": "dock",
|
||||||
|
"name": "Dock",
|
||||||
|
"enabled": false,
|
||||||
|
"screenPreferences": [
|
||||||
|
"all"
|
||||||
|
],
|
||||||
|
"showOnLastDisplay": true,
|
||||||
|
"position": 2,
|
||||||
|
"mode": "compact",
|
||||||
|
"taskbarAlign": "center",
|
||||||
|
"widgetExpansion": "popout",
|
||||||
|
"iconSize": 40,
|
||||||
|
"spacing": 4,
|
||||||
|
"itemSpacing": 4,
|
||||||
|
"margin": 0,
|
||||||
|
"bottomGap": 0,
|
||||||
|
"transparency": 1,
|
||||||
|
"followInterfaceStyle": true,
|
||||||
|
"autoHide": false,
|
||||||
|
"smartAutoHide": false,
|
||||||
|
"useOverlayLayer": false,
|
||||||
|
"editOnRightClick": false,
|
||||||
|
"showOnFullscreen": false,
|
||||||
|
"openOnOverview": false,
|
||||||
|
"groupByApp": false,
|
||||||
|
"separatePinnedAndRunningApps": false,
|
||||||
|
"restoreSpecialWorkspaceOnClick": false,
|
||||||
|
"isolateDisplays": false,
|
||||||
|
"indicatorStyle": "circle",
|
||||||
|
"borderEnabled": false,
|
||||||
|
"borderColor": "surfaceText",
|
||||||
|
"borderOpacity": 1,
|
||||||
|
"borderThickness": 1,
|
||||||
|
"launcherEnabled": false,
|
||||||
|
"launcherLogoMode": "apps",
|
||||||
|
"launcherLogoCustomPath": "",
|
||||||
|
"launcherLogoColorOverride": "",
|
||||||
|
"launcherLogoSizeOffset": 0,
|
||||||
|
"launcherLogoBrightness": 0.5,
|
||||||
|
"launcherLogoContrast": 1,
|
||||||
|
"maxVisibleApps": 0,
|
||||||
|
"maxVisibleRunningApps": 0,
|
||||||
|
"showOverflowBadge": true,
|
||||||
|
"showTrash": false,
|
||||||
|
"trashFileManager": "default",
|
||||||
|
"trashCustomCommand": "",
|
||||||
|
"magnification": false,
|
||||||
|
"magnificationScale": 130,
|
||||||
|
"magnificationProfile": "parabolic",
|
||||||
|
"magnificationExpand": false,
|
||||||
|
"order": [],
|
||||||
|
"widgets": [
|
||||||
|
{
|
||||||
|
"id": "dock_launcher",
|
||||||
|
"widgetId": "dockLauncher",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "dock_apps",
|
||||||
|
"widgetId": "appsDock",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "dock_trash",
|
||||||
|
"widgetId": "dockTrash",
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"barElevationEnabled": false,
|
||||||
|
"barConfigs": [
|
||||||
|
{
|
||||||
|
"id": "default",
|
||||||
|
"name": "Main Bar",
|
||||||
|
"enabled": true,
|
||||||
|
"position": 0,
|
||||||
|
"screenPreferences": [
|
||||||
|
"all"
|
||||||
|
],
|
||||||
|
"showOnLastDisplay": true,
|
||||||
|
"leftWidgets": [
|
||||||
|
{
|
||||||
|
"id": "launcherButton",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "workspaceSwitcher",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "focusedWindow",
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"centerWidgets": [
|
||||||
|
"music",
|
||||||
|
"clock",
|
||||||
|
"weather"
|
||||||
|
],
|
||||||
|
"rightWidgets": [
|
||||||
|
{
|
||||||
|
"id": "systemTray",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "vpn",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
"keyboard_layout_name",
|
||||||
|
"clipboard",
|
||||||
|
"cpuUsage",
|
||||||
|
"memUsage",
|
||||||
|
"notificationButton",
|
||||||
|
{
|
||||||
|
"id": "battery",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "controlCenterButton",
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"spacing": 4,
|
||||||
|
"innerPadding": 4,
|
||||||
|
"bottomGap": 0,
|
||||||
|
"transparency": 1,
|
||||||
|
"widgetTransparency": 1,
|
||||||
|
"squareCorners": false,
|
||||||
|
"noBackground": false,
|
||||||
|
"gothCornersEnabled": false,
|
||||||
|
"gothCornerRadiusOverride": false,
|
||||||
|
"gothCornerRadiusValue": 12,
|
||||||
|
"borderEnabled": false,
|
||||||
|
"borderColor": "surfaceText",
|
||||||
|
"borderOpacity": 1,
|
||||||
|
"borderThickness": 1,
|
||||||
|
"fontScale": 1,
|
||||||
|
"autoHide": false,
|
||||||
|
"autoHideDelay": 250,
|
||||||
|
"openOnOverview": false,
|
||||||
|
"visible": true,
|
||||||
|
"popupGapsAuto": true,
|
||||||
|
"popupGapsManual": 4,
|
||||||
|
"followInterfaceStyle": true,
|
||||||
|
"widgetFollowInterfaceStyle": true,
|
||||||
|
"dot": false,
|
||||||
|
"island": true,
|
||||||
|
"islandFloating": false,
|
||||||
|
"islandPlacement": "free",
|
||||||
|
"islandOuterGap": 0,
|
||||||
|
"islandAlongOffset": 0,
|
||||||
|
"islandReserveThickness": 41,
|
||||||
|
"islandRouteLauncher": "follow",
|
||||||
|
"islandRouteControlCenter": "follow",
|
||||||
|
"islandInteractionMode": "hybrid",
|
||||||
|
"islandChargingPulse": true,
|
||||||
|
"hoverPopouts": false,
|
||||||
|
"hoverPopoutDelay": 200,
|
||||||
|
"islandHomeLayout": [
|
||||||
|
{
|
||||||
|
"id": "workspaces",
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "media",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "clock",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "weather",
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "status",
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "volume",
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "brightness",
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "notifications",
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "privacy",
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tray",
|
||||||
|
"enabled": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "bar1793185825664",
|
||||||
|
"name": "Bar 2",
|
||||||
|
"enabled": false,
|
||||||
|
"position": 1,
|
||||||
|
"screenPreferences": [
|
||||||
|
"all"
|
||||||
|
],
|
||||||
|
"showOnLastDisplay": true,
|
||||||
|
"leftWidgets": [
|
||||||
|
"launcherButton",
|
||||||
|
"workspaceSwitcher",
|
||||||
|
"focusedWindow"
|
||||||
|
],
|
||||||
|
"centerWidgets": [
|
||||||
|
"music",
|
||||||
|
"clock",
|
||||||
|
"weather"
|
||||||
|
],
|
||||||
|
"rightWidgets": [
|
||||||
|
"systemTray",
|
||||||
|
"privacyIndicator",
|
||||||
|
"vpn",
|
||||||
|
"keyboard_layout_name",
|
||||||
|
"clipboard",
|
||||||
|
"cpuUsage",
|
||||||
|
"cpuTemp",
|
||||||
|
"memUsage",
|
||||||
|
"notificationButton",
|
||||||
|
"battery",
|
||||||
|
"controlCenterButton"
|
||||||
|
],
|
||||||
|
"spacing": 4,
|
||||||
|
"innerPadding": 4,
|
||||||
|
"bottomGap": 0,
|
||||||
|
"transparency": 1,
|
||||||
|
"widgetTransparency": 1,
|
||||||
|
"squareCorners": false,
|
||||||
|
"noBackground": false,
|
||||||
|
"gothCornersEnabled": false,
|
||||||
|
"gothCornerRadiusOverride": false,
|
||||||
|
"gothCornerRadiusValue": 12,
|
||||||
|
"borderEnabled": false,
|
||||||
|
"borderColor": "surfaceText",
|
||||||
|
"borderOpacity": 1,
|
||||||
|
"borderThickness": 1,
|
||||||
|
"fontScale": 1,
|
||||||
|
"autoHide": false,
|
||||||
|
"autoHideDelay": 250,
|
||||||
|
"openOnOverview": false,
|
||||||
|
"visible": true,
|
||||||
|
"popupGapsAuto": true,
|
||||||
|
"popupGapsManual": 4,
|
||||||
|
"followInterfaceStyle": true,
|
||||||
|
"widgetFollowInterfaceStyle": true,
|
||||||
|
"islandFloating": false,
|
||||||
|
"islandPlacement": "free",
|
||||||
|
"islandOuterGap": 0,
|
||||||
|
"islandAlongOffset": 0,
|
||||||
|
"islandReserveThickness": 41,
|
||||||
|
"islandRouteLauncher": "follow",
|
||||||
|
"islandRouteControlCenter": "follow",
|
||||||
|
"islandInteractionMode": "hybrid",
|
||||||
|
"islandChargingPulse": true,
|
||||||
|
"hoverPopouts": false,
|
||||||
|
"hoverPopoutDelay": 200,
|
||||||
|
"hideOnLastDisplay": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "dot1793185921302",
|
||||||
|
"name": "Dot",
|
||||||
|
"enabled": false,
|
||||||
|
"position": 0,
|
||||||
|
"screenPreferences": [
|
||||||
|
"all"
|
||||||
|
],
|
||||||
|
"showOnLastDisplay": true,
|
||||||
|
"leftWidgets": [
|
||||||
|
"launcherButton",
|
||||||
|
"workspaceSwitcher",
|
||||||
|
"focusedWindow"
|
||||||
|
],
|
||||||
|
"centerWidgets": [
|
||||||
|
"music",
|
||||||
|
"clock",
|
||||||
|
"weather"
|
||||||
|
],
|
||||||
|
"rightWidgets": [
|
||||||
|
"systemTray",
|
||||||
|
"privacyIndicator",
|
||||||
|
"vpn",
|
||||||
|
"keyboard_layout_name",
|
||||||
|
"clipboard",
|
||||||
|
"cpuUsage",
|
||||||
|
"cpuTemp",
|
||||||
|
"memUsage",
|
||||||
|
"notificationButton",
|
||||||
|
"battery",
|
||||||
|
"controlCenterButton"
|
||||||
|
],
|
||||||
|
"spacing": 4,
|
||||||
|
"innerPadding": 4,
|
||||||
|
"bottomGap": 0,
|
||||||
|
"transparency": 0.95,
|
||||||
|
"widgetTransparency": 1,
|
||||||
|
"squareCorners": false,
|
||||||
|
"noBackground": false,
|
||||||
|
"gothCornersEnabled": false,
|
||||||
|
"gothCornerRadiusOverride": false,
|
||||||
|
"gothCornerRadiusValue": 12,
|
||||||
|
"borderEnabled": false,
|
||||||
|
"borderColor": "surfaceText",
|
||||||
|
"borderOpacity": 1,
|
||||||
|
"borderThickness": 1,
|
||||||
|
"fontScale": 1,
|
||||||
|
"autoHide": false,
|
||||||
|
"autoHideDelay": 250,
|
||||||
|
"openOnOverview": false,
|
||||||
|
"visible": true,
|
||||||
|
"popupGapsAuto": true,
|
||||||
|
"popupGapsManual": 4,
|
||||||
|
"followInterfaceStyle": false,
|
||||||
|
"widgetFollowInterfaceStyle": true,
|
||||||
|
"dot": true,
|
||||||
|
"island": false,
|
||||||
|
"islandFloating": false,
|
||||||
|
"islandPlacement": "free",
|
||||||
|
"islandOuterGap": 0,
|
||||||
|
"islandAlongOffset": 0,
|
||||||
|
"islandReserveThickness": 41,
|
||||||
|
"islandRouteLauncher": "follow",
|
||||||
|
"islandRouteControlCenter": "follow",
|
||||||
|
"islandInteractionMode": "hybrid",
|
||||||
|
"islandChargingPulse": true,
|
||||||
|
"hoverPopouts": false,
|
||||||
|
"hoverPopoutDelay": 200
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configVersion": 42,
|
||||||
|
"popupTransparency": 0.95,
|
||||||
|
"fontFamily": "JetBrains Mono Medium",
|
||||||
|
"audioVisualizerEnabled": true,
|
||||||
|
"scrollTitleEnabled": true,
|
||||||
|
"dashOptions": {
|
||||||
|
"wallpaper": {
|
||||||
|
"panelColumns": 5
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"controlCenterColumns": 9,
|
||||||
|
"controlCenterWidgets": [
|
||||||
|
{
|
||||||
|
"id": "user",
|
||||||
|
"enabled": true,
|
||||||
|
"w": 4,
|
||||||
|
"h": 1,
|
||||||
|
"col": 0,
|
||||||
|
"row": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "settings",
|
||||||
|
"enabled": true,
|
||||||
|
"w": 1,
|
||||||
|
"h": 1,
|
||||||
|
"small": true,
|
||||||
|
"col": 4,
|
||||||
|
"row": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "lock",
|
||||||
|
"enabled": true,
|
||||||
|
"w": 1,
|
||||||
|
"h": 1,
|
||||||
|
"small": true,
|
||||||
|
"col": 5,
|
||||||
|
"row": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "power",
|
||||||
|
"enabled": true,
|
||||||
|
"w": 1,
|
||||||
|
"h": 1,
|
||||||
|
"small": true,
|
||||||
|
"col": 6,
|
||||||
|
"row": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "brightnessSlider",
|
||||||
|
"enabled": true,
|
||||||
|
"w": 4,
|
||||||
|
"h": 1,
|
||||||
|
"col": 0,
|
||||||
|
"row": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "volumeSlider",
|
||||||
|
"enabled": true,
|
||||||
|
"w": 4,
|
||||||
|
"h": 1,
|
||||||
|
"col": 4,
|
||||||
|
"row": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "wifi",
|
||||||
|
"enabled": true,
|
||||||
|
"w": 4,
|
||||||
|
"h": 1,
|
||||||
|
"col": 0,
|
||||||
|
"row": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "bluetooth",
|
||||||
|
"enabled": true,
|
||||||
|
"w": 4,
|
||||||
|
"h": 1,
|
||||||
|
"col": 4,
|
||||||
|
"row": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "audioOutput",
|
||||||
|
"enabled": true,
|
||||||
|
"w": 4,
|
||||||
|
"h": 1,
|
||||||
|
"col": 0,
|
||||||
|
"row": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "audioInput",
|
||||||
|
"enabled": true,
|
||||||
|
"w": 4,
|
||||||
|
"h": 1,
|
||||||
|
"col": 4,
|
||||||
|
"row": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "nightMode",
|
||||||
|
"enabled": true,
|
||||||
|
"w": 1,
|
||||||
|
"h": 1,
|
||||||
|
"col": 7,
|
||||||
|
"row": 0,
|
||||||
|
"small": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "battery",
|
||||||
|
"enabled": true,
|
||||||
|
"w": 4,
|
||||||
|
"h": 1,
|
||||||
|
"col": 0,
|
||||||
|
"row": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "runningApps",
|
||||||
|
"enabled": true,
|
||||||
|
"w": 8,
|
||||||
|
"h": 1,
|
||||||
|
"small": true,
|
||||||
|
"col": 0,
|
||||||
|
"row": 5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "edit",
|
||||||
|
"enabled": true,
|
||||||
|
"w": 1,
|
||||||
|
"h": 1,
|
||||||
|
"small": true,
|
||||||
|
"col": 8,
|
||||||
|
"row": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "builtin_vpn",
|
||||||
|
"enabled": true,
|
||||||
|
"w": 4,
|
||||||
|
"h": 1,
|
||||||
|
"col": 4,
|
||||||
|
"row": 4
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"monoFontFamily": "JetBrains Mono",
|
||||||
|
"displayFontFamily": "JetBrains Mono",
|
||||||
|
"fontWeight": 300,
|
||||||
|
"fontScale": 1,
|
||||||
|
"currentThemeName": "pink",
|
||||||
|
"wallpaperFillMode": "Fill",
|
||||||
|
"connectedFrameBarStyleBackups": {},
|
||||||
|
"frameEnabled": false,
|
||||||
|
"dashCards": [
|
||||||
|
{
|
||||||
|
"id": "clock",
|
||||||
|
"w": 2,
|
||||||
|
"h": 1,
|
||||||
|
"col": 0,
|
||||||
|
"row": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "weather",
|
||||||
|
"w": 1,
|
||||||
|
"h": 1,
|
||||||
|
"col": 2,
|
||||||
|
"row": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "notifications",
|
||||||
|
"w": 3,
|
||||||
|
"h": 5,
|
||||||
|
"col": 3,
|
||||||
|
"row": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "calendar",
|
||||||
|
"w": 3,
|
||||||
|
"h": 3,
|
||||||
|
"col": 0,
|
||||||
|
"row": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "media",
|
||||||
|
"w": 3,
|
||||||
|
"h": 1,
|
||||||
|
"col": 0,
|
||||||
|
"row": 4
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"builtInPluginSettings": {
|
||||||
|
"dms_qr_generator": {
|
||||||
|
"trigger": "qrg"
|
||||||
|
},
|
||||||
|
"dms_power": {
|
||||||
|
"trigger": "pw"
|
||||||
|
},
|
||||||
|
"dms_clipboard_search": {
|
||||||
|
"trigger": "cb"
|
||||||
|
},
|
||||||
|
"dms_settings_search": {
|
||||||
|
"trigger": "?"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"launcherStyle": "island",
|
||||||
|
"dankLauncherV2Size": "compact",
|
||||||
|
"appLauncherGridColumns": 4,
|
||||||
|
"spotlightSectionViewModes": {
|
||||||
|
"apps": "grid"
|
||||||
|
},
|
||||||
|
"dankLauncherV2BorderEnabled": false,
|
||||||
|
"dankLauncherV2BorderThickness": 5,
|
||||||
|
"dankLauncherV2BorderColor": "surfaceText",
|
||||||
|
"rememberLastQuery": true,
|
||||||
|
"bluetoothMprisEnabled": true,
|
||||||
|
"dashTabs": [
|
||||||
|
{
|
||||||
|
"id": "wallpaper",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "overview",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "media",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "weather",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "wellbeing",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "notifications",
|
||||||
|
"enabled": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"desktopWidgetInstances": [],
|
||||||
|
"notificationPopupPosition": -1,
|
||||||
|
"notificationFocusedMonitor": false,
|
||||||
|
"notificationOverlayEnabled": true,
|
||||||
|
"notificationCompactMode": false,
|
||||||
|
"osdPosition": 5,
|
||||||
|
"networkPreference": "auto",
|
||||||
|
"avatarRing": "none",
|
||||||
|
"lockScreenWidgetInstances": [
|
||||||
|
{
|
||||||
|
"id": "lock_clock",
|
||||||
|
"widgetType": "desktopClock",
|
||||||
|
"enabled": true,
|
||||||
|
"config": {
|
||||||
|
"displayPreferences": [
|
||||||
|
"all"
|
||||||
|
],
|
||||||
|
"syncPositionAcrossScreens": true,
|
||||||
|
"style": "expressive",
|
||||||
|
"transparency": 0,
|
||||||
|
"weight": 0,
|
||||||
|
"twoTone": true,
|
||||||
|
"showDate": false,
|
||||||
|
"showDigitalSeconds": false,
|
||||||
|
"showAnalogNumbers": false,
|
||||||
|
"showAnalogSeconds": true,
|
||||||
|
"autoPosition": true,
|
||||||
|
"colorMode": "default",
|
||||||
|
"customColor": "#ffffff"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "lock_date",
|
||||||
|
"widgetType": "lockDate",
|
||||||
|
"enabled": true,
|
||||||
|
"config": {
|
||||||
|
"displayPreferences": [
|
||||||
|
"all"
|
||||||
|
],
|
||||||
|
"syncPositionAcrossScreens": true,
|
||||||
|
"format": "short",
|
||||||
|
"colorMode": "default",
|
||||||
|
"customColor": "#ffffff"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "lock_auth",
|
||||||
|
"widgetType": "lockAuth",
|
||||||
|
"enabled": true,
|
||||||
|
"config": {
|
||||||
|
"displayPreferences": [
|
||||||
|
"all"
|
||||||
|
],
|
||||||
|
"syncPositionAcrossScreens": true,
|
||||||
|
"style": "expressive",
|
||||||
|
"profileVisibility": "always",
|
||||||
|
"passwordVisibility": "always"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "lock_notifications",
|
||||||
|
"widgetType": "lockNotifications",
|
||||||
|
"enabled": true,
|
||||||
|
"config": {
|
||||||
|
"displayPreferences": [
|
||||||
|
"all"
|
||||||
|
],
|
||||||
|
"syncPositionAcrossScreens": true,
|
||||||
|
"mode": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "lock_status",
|
||||||
|
"widgetType": "lockStatus",
|
||||||
|
"enabled": true,
|
||||||
|
"config": {
|
||||||
|
"displayPreferences": [
|
||||||
|
"all"
|
||||||
|
],
|
||||||
|
"syncPositionAcrossScreens": true,
|
||||||
|
"showMediaPlayer": true,
|
||||||
|
"showWeather": true,
|
||||||
|
"background": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "lock_power",
|
||||||
|
"widgetType": "lockPower",
|
||||||
|
"enabled": false,
|
||||||
|
"config": {
|
||||||
|
"displayPreferences": [
|
||||||
|
"all"
|
||||||
|
],
|
||||||
|
"syncPositionAcrossScreens": true,
|
||||||
|
"shape": "round"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"greeterWidgetInstances": [
|
||||||
|
{
|
||||||
|
"id": "lock_clock",
|
||||||
|
"widgetType": "desktopClock",
|
||||||
|
"enabled": true,
|
||||||
|
"config": {
|
||||||
|
"displayPreferences": [
|
||||||
|
"all"
|
||||||
|
],
|
||||||
|
"syncPositionAcrossScreens": true,
|
||||||
|
"style": "expressive",
|
||||||
|
"transparency": 0,
|
||||||
|
"weight": 0,
|
||||||
|
"twoTone": true,
|
||||||
|
"showDate": false,
|
||||||
|
"showDigitalSeconds": false,
|
||||||
|
"showAnalogNumbers": false,
|
||||||
|
"showAnalogSeconds": true,
|
||||||
|
"autoPosition": true,
|
||||||
|
"colorMode": "default",
|
||||||
|
"customColor": "#ffffff"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "lock_date",
|
||||||
|
"widgetType": "lockDate",
|
||||||
|
"enabled": true,
|
||||||
|
"config": {
|
||||||
|
"displayPreferences": [
|
||||||
|
"all"
|
||||||
|
],
|
||||||
|
"syncPositionAcrossScreens": true,
|
||||||
|
"format": "short",
|
||||||
|
"colorMode": "default",
|
||||||
|
"customColor": "#ffffff"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "lock_auth",
|
||||||
|
"widgetType": "lockAuth",
|
||||||
|
"enabled": true,
|
||||||
|
"config": {
|
||||||
|
"displayPreferences": [
|
||||||
|
"all"
|
||||||
|
],
|
||||||
|
"syncPositionAcrossScreens": true,
|
||||||
|
"style": "expressive",
|
||||||
|
"profileVisibility": "always",
|
||||||
|
"passwordVisibility": "always"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "lock_status",
|
||||||
|
"widgetType": "lockStatus",
|
||||||
|
"enabled": true,
|
||||||
|
"config": {
|
||||||
|
"displayPreferences": [
|
||||||
|
"all"
|
||||||
|
],
|
||||||
|
"syncPositionAcrossScreens": true,
|
||||||
|
"showMediaPlayer": true,
|
||||||
|
"showWeather": true,
|
||||||
|
"background": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "lock_power",
|
||||||
|
"widgetType": "lockPower",
|
||||||
|
"enabled": false,
|
||||||
|
"config": {
|
||||||
|
"displayPreferences": [
|
||||||
|
"all"
|
||||||
|
],
|
||||||
|
"syncPositionAcrossScreens": true,
|
||||||
|
"shape": "round"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "greeter_session",
|
||||||
|
"widgetType": "greeterSession",
|
||||||
|
"enabled": true,
|
||||||
|
"config": {
|
||||||
|
"displayPreferences": [
|
||||||
|
"all"
|
||||||
|
],
|
||||||
|
"syncPositionAcrossScreens": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
[global]
|
|
||||||
monitor = 0
|
|
||||||
follow = mouse
|
|
||||||
width = (250, 360)
|
|
||||||
origin = top-right
|
|
||||||
offset = (12, 48)
|
|
||||||
gap_size = 8
|
|
||||||
corner_radius = 14
|
|
||||||
frame_width = 1
|
|
||||||
padding = 12
|
|
||||||
horizontal_padding = 14
|
|
||||||
font = JetBrains Mono 10
|
|
||||||
format = "<b>%s</b>\n%b"
|
|
||||||
icon_position = left
|
|
||||||
max_icon_size = 48
|
|
||||||
transparency = 0
|
|
||||||
icon_corner_radius = 8
|
|
||||||
progress_bar_corner_radius = 4
|
|
||||||
progress_bar_height = 8
|
|
||||||
|
|
||||||
[urgency_low]
|
|
||||||
background = "#0c0c0c99"
|
|
||||||
foreground = "#e8e8e8"
|
|
||||||
frame_color = "#e8e8e815"
|
|
||||||
timeout = 5
|
|
||||||
|
|
||||||
[urgency_normal]
|
|
||||||
background = "#0c0c0c99"
|
|
||||||
foreground = "#e8e8e8"
|
|
||||||
frame_color = "#e8e8e830"
|
|
||||||
timeout = 8
|
|
||||||
|
|
||||||
[urgency_critical]
|
|
||||||
background = "#0c0c0c99"
|
|
||||||
foreground = "#e8e8e8"
|
|
||||||
frame_color = "#ff5c5c"
|
|
||||||
timeout = 0
|
|
||||||
@@ -0,0 +1,124 @@
|
|||||||
|
# ---------- Font ----------
|
||||||
|
font_family family="JetBrains Mono" style="Medium"
|
||||||
|
bold_font family="JetBrains Mono" style="ExtraBold"
|
||||||
|
italic_font family="JetBrains Mono" style="Medium Italic"
|
||||||
|
bold_italic_font family="JetBrains Mono" style="ExtraBold Italic"
|
||||||
|
font_size 13.5
|
||||||
|
# Ligatures (-> => != ===) stay on; they only break when the cursor is on them
|
||||||
|
disable_ligatures cursor
|
||||||
|
adjust_line_height 106%
|
||||||
|
# Nerd Font icons are built into kitty and picked up automatically
|
||||||
|
|
||||||
|
# ---------- Window / glass ----------
|
||||||
|
background_opacity 0.80
|
||||||
|
dynamic_background_opacity yes
|
||||||
|
background_blur 0
|
||||||
|
window_padding_width 12 14
|
||||||
|
hide_window_decorations yes
|
||||||
|
confirm_os_window_close 0
|
||||||
|
remember_window_size no
|
||||||
|
initial_window_width 110c
|
||||||
|
initial_window_height 32c
|
||||||
|
|
||||||
|
# ---------- Cursor ----------
|
||||||
|
cursor_shape beam
|
||||||
|
cursor_beam_thickness 1.8
|
||||||
|
cursor_blink_interval 0.6 ease-in-out
|
||||||
|
cursor_trail 3
|
||||||
|
cursor_trail_decay 0.1 0.35
|
||||||
|
cursor_trail_start_threshold 2
|
||||||
|
|
||||||
|
# ---------- Scrollback ----------
|
||||||
|
scrollback_lines 20000
|
||||||
|
scrollback_pager_history_size 100
|
||||||
|
mouse_hide_wait 2.0
|
||||||
|
copy_on_select clipboard
|
||||||
|
strip_trailing_spaces smart
|
||||||
|
|
||||||
|
# ---------- Tabs ----------
|
||||||
|
tab_bar_edge top
|
||||||
|
tab_bar_style powerline
|
||||||
|
tab_powerline_style round
|
||||||
|
tab_bar_min_tabs 2
|
||||||
|
tab_title_template "{index}: {title[:24]}"
|
||||||
|
active_tab_font_style bold
|
||||||
|
tab_bar_margin_width 8
|
||||||
|
tab_bar_margin_height 6 0
|
||||||
|
|
||||||
|
# ---------- Splits ----------
|
||||||
|
enabled_layouts splits:split_axis=horizontal,stack,tall
|
||||||
|
active_border_color #bb9af7
|
||||||
|
inactive_border_color #3b4261
|
||||||
|
inactive_text_alpha 0.75
|
||||||
|
window_border_width 1pt
|
||||||
|
|
||||||
|
# ---------- URLs ----------
|
||||||
|
url_color #7dcfff
|
||||||
|
url_style curly
|
||||||
|
detect_urls yes
|
||||||
|
underline_hyperlinks hover
|
||||||
|
|
||||||
|
# ---------- Bell ----------
|
||||||
|
enable_audio_bell no
|
||||||
|
visual_bell_duration 0.15 ease-out
|
||||||
|
window_alert_on_bell yes
|
||||||
|
|
||||||
|
# ---------- Colors: Tokyo Night Storm tuned for glass ----------
|
||||||
|
foreground #c0caf5
|
||||||
|
background #11111b
|
||||||
|
selection_foreground #11111b
|
||||||
|
selection_background #bb9af7
|
||||||
|
cursor #ff9e64
|
||||||
|
cursor_text_color #11111b
|
||||||
|
url_color #7dcfff
|
||||||
|
|
||||||
|
active_tab_foreground #11111b
|
||||||
|
active_tab_background #bb9af7
|
||||||
|
inactive_tab_foreground #a9b1d6
|
||||||
|
inactive_tab_background #1f2335
|
||||||
|
tab_bar_background none
|
||||||
|
|
||||||
|
mark1_foreground #11111b
|
||||||
|
mark1_background #ff9e64
|
||||||
|
|
||||||
|
color0 #414868
|
||||||
|
color8 #565f89
|
||||||
|
color1 #f7768e
|
||||||
|
color9 #ff899d
|
||||||
|
color2 #9ece6a
|
||||||
|
color10 #b9f27c
|
||||||
|
color3 #e0af68
|
||||||
|
color11 #ffc777
|
||||||
|
color4 #7aa2f7
|
||||||
|
color12 #8db0ff
|
||||||
|
color5 #bb9af7
|
||||||
|
color13 #c9a9ff
|
||||||
|
color6 #7dcfff
|
||||||
|
color14 #a4daff
|
||||||
|
color7 #a9b1d6
|
||||||
|
color15 #c0caf5
|
||||||
|
|
||||||
|
# ---------- Shortcuts ----------
|
||||||
|
# Plain Ctrl+C / Ctrl+V: Ctrl+C copies when text is selected, otherwise it is the usual interrupt (SIGINT)
|
||||||
|
map ctrl+c copy_or_interrupt
|
||||||
|
map ctrl+v paste_from_clipboard
|
||||||
|
map ctrl+shift+t new_tab_with_cwd
|
||||||
|
map ctrl+shift+enter launch --location=vsplit --cwd=current
|
||||||
|
map ctrl+alt+enter launch --location=hsplit --cwd=current
|
||||||
|
# Tabs: Ctrl+Shift+Left/Right (kitty default). Splits: Ctrl+Alt+arrows
|
||||||
|
map ctrl+shift+left previous_tab
|
||||||
|
map ctrl+shift+right next_tab
|
||||||
|
map ctrl+alt+left neighboring_window left
|
||||||
|
map ctrl+alt+right neighboring_window right
|
||||||
|
map ctrl+alt+up neighboring_window up
|
||||||
|
map ctrl+alt+down neighboring_window down
|
||||||
|
map ctrl+shift+z toggle_layout stack
|
||||||
|
map ctrl+shift+equal change_font_size current +1.0
|
||||||
|
map ctrl+shift+minus change_font_size current -1.0
|
||||||
|
map ctrl+shift+0 change_font_size current 0
|
||||||
|
map ctrl+shift+f show_scrollback
|
||||||
|
map ctrl+shift+o kitten hints --type path --program -
|
||||||
|
map ctrl+shift+e kitten hints --type url
|
||||||
|
map ctrl+shift+u kitten unicode_input
|
||||||
|
map ctrl+shift+backspace set_background_opacity +0.05
|
||||||
|
map ctrl+shift+delete set_background_opacity -0.05
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
* {
|
|
||||||
base: #0c0c0c; surface: #1c1c1c; text: #e8e8e8; mauve: #e8e8e8; subtext: #8c8c8c;
|
|
||||||
background-color: transparent;
|
|
||||||
text-color: @text;
|
|
||||||
font: "JetBrains Mono 12";
|
|
||||||
}
|
|
||||||
window {
|
|
||||||
background-color: rgba(12,12,12,0.60);
|
|
||||||
border: 1px; border-color: rgba(232,232,232,0.14); border-radius: 20px;
|
|
||||||
padding: 18px;
|
|
||||||
width: 600px;
|
|
||||||
}
|
|
||||||
mainbox { spacing: 10px; }
|
|
||||||
inputbar {
|
|
||||||
background-color: rgba(255,255,255,0.07); border-radius: 14px; padding: 12px 16px; spacing: 8px;
|
|
||||||
children: [ prompt, entry ];
|
|
||||||
}
|
|
||||||
prompt { text-color: @mauve; }
|
|
||||||
entry { placeholder: "Search..."; placeholder-color: @subtext; }
|
|
||||||
listview { lines: 8; scrollbar: false; spacing: 4px; fixed-height: true; }
|
|
||||||
element { padding: 9px 14px; border-radius: 14px; spacing: 10px; }
|
|
||||||
element selected { background-color: rgba(232,232,232,0.92); text-color: #0c0c0c; }
|
|
||||||
element-icon { size: 1.4em; }
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
* {
|
|
||||||
background-color: #05050a;
|
|
||||||
text-color: #fcee09;
|
|
||||||
border-color: #fcee09;
|
|
||||||
font: "monospace 11";
|
|
||||||
}
|
|
||||||
|
|
||||||
window {
|
|
||||||
border: 2px;
|
|
||||||
padding: 15px;
|
|
||||||
width: 500px;
|
|
||||||
}
|
|
||||||
|
|
||||||
element selected {
|
|
||||||
background-color: #fcee09;
|
|
||||||
text-color: #000000;
|
|
||||||
}
|
|
||||||
|
|
||||||
entry {
|
|
||||||
placeholder: "OVERRIDE_SYSTEM...";
|
|
||||||
placeholder-color:#444444;
|
|
||||||
text-color: #ff003c;
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Power menu in rofi
|
|
||||||
opts=$' Lock\n Logout\n Suspend\n Reboot\n Shutdown'
|
|
||||||
choice=$(printf '%s' "$opts" | rofi -dmenu -i -p "Power" -theme ~/.config/rofi/catppuccin.rasi -theme-str 'window {width: 300px;} listview {lines: 5;} entry {enabled: false;}')
|
|
||||||
case "$choice" in
|
|
||||||
*Lock) ~/.config/sway/lock.sh ;;
|
|
||||||
*Logout) swaymsg exit ;;
|
|
||||||
*Suspend) systemctl suspend ;;
|
|
||||||
*Reboot) systemctl reboot ;;
|
|
||||||
*Shutdown) systemctl poweroff ;;
|
|
||||||
esac
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
window {
|
|
||||||
background-color: #050B14;
|
|
||||||
border: 2px solid #FF0055;
|
|
||||||
font-family: "Orbitron", sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
#input {
|
|
||||||
background-color: #0D0F18;
|
|
||||||
color: #00F0FF;
|
|
||||||
border: 1px solid #FF0055;
|
|
||||||
margin: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#entry:selected {
|
|
||||||
background-color: #FF0055;
|
|
||||||
color: #050B14;
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
[Default]
|
||||||
|
save_dir=$HOME/Pictures/Screenshots
|
||||||
|
save_filename_format=screenshot_%Y-%m-%d_%H-%M-%S_edited.png
|
||||||
|
early_exit=true
|
||||||
|
auto_save=false
|
||||||
|
show_panel=true
|
||||||
|
line_size=5
|
||||||
|
text_size=20
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Shows all sway keybindings in rofi
|
# Shows all sway keybindings in the DMS picker (type to filter, Esc to close)
|
||||||
cat ~/.config/sway/config ~/.config/sway/config.d/*.conf | grep -E '^\s*bindsym' | grep -v -- '--locked' \
|
cat ~/.config/sway/config ~/.config/sway/config.d/*.conf | grep -E '^\s*bindsym' | grep -v -- '--locked' \
|
||||||
| sed -E 's/^\s*bindsym\s+//; s/\$mod/Super/g; s/^(\S+)\s+/\1\t→ /' \
|
| sed -E 's/^\s*bindsym\s+//; s/(--[a-z-]+(=[^ ]+)?\s+)+//; s/\$mod/Super/g; s/^(\S+)\s+/\1\t→ /' \
|
||||||
| column -t -s $'\t' | rofi -dmenu -i -p "Keys" -theme ~/.config/rofi/catppuccin.rasi \
|
| column -t -s $'\t' | dms dmenu >/dev/null
|
||||||
-theme-str 'window {width: 900px;} listview {lines: 14;} entry {placeholder: "Filter...";}' >/dev/null
|
|
||||||
|
|||||||
@@ -16,22 +16,10 @@ set $right l
|
|||||||
# Your preferred terminal emulator
|
# Your preferred terminal emulator
|
||||||
# Recommends: foot
|
# Recommends: foot
|
||||||
set $term kitty
|
set $term kitty
|
||||||
# Your preferred application launcher
|
|
||||||
# Note: pass the final command to swaymsg so that the resulting window can be opened
|
|
||||||
# on the original workspace that the command was run on.
|
|
||||||
# Recommends: rofi-wayland
|
|
||||||
set $rofi_cmd rofi -theme ~/.config/rofi/catppuccin.rasi \
|
|
||||||
-terminal '$term'
|
|
||||||
# Shows a combined list of the applications with desktop files and
|
|
||||||
# executables from PATH.
|
|
||||||
# TODO: add window with the next release of rofi-wayland
|
|
||||||
set $menu $rofi_cmd -show combi -combi-modes drun#run -modes combi
|
|
||||||
|
|
||||||
### Output configuration
|
### Output configuration
|
||||||
#
|
#
|
||||||
# Default wallpaper (more resolutions are available in /usr/share/backgrounds/sway/)
|
# Wallpaper is handled by DankMaterialShell (Settings > Wallpaper), not by sway.
|
||||||
# Requires: desktop-backgrounds-compat, swaybg, jxl-pixbuf-loader
|
|
||||||
output * bg /usr/share/backgrounds/default.jxl fill
|
|
||||||
#
|
#
|
||||||
# Example configuration:
|
# Example configuration:
|
||||||
#
|
#
|
||||||
@@ -69,13 +57,13 @@ output * bg /usr/share/backgrounds/default.jxl fill
|
|||||||
# Basics:
|
# Basics:
|
||||||
#
|
#
|
||||||
# Start a terminal
|
# Start a terminal
|
||||||
bindsym $mod+Return exec $term
|
bindsym --to-code $mod+Return exec $term
|
||||||
|
|
||||||
# Kill focused window
|
# Kill focused window
|
||||||
bindsym $mod+Shift+q kill
|
bindsym --to-code $mod+Shift+q kill
|
||||||
|
|
||||||
# Start your launcher
|
# Start your launcher
|
||||||
bindsym $mod+d exec $menu
|
bindsym --to-code $mod+d exec dms ipc call spotlight toggle
|
||||||
|
|
||||||
# Drag floating windows by holding down $mod and left mouse button.
|
# Drag floating windows by holding down $mod and left mouse button.
|
||||||
# Resize them with right mouse button + $mod.
|
# Resize them with right mouse button + $mod.
|
||||||
@@ -85,59 +73,59 @@ output * bg /usr/share/backgrounds/default.jxl fill
|
|||||||
floating_modifier $mod normal
|
floating_modifier $mod normal
|
||||||
|
|
||||||
# Reload the configuration file
|
# Reload the configuration file
|
||||||
bindsym $mod+Shift+c reload
|
bindsym --to-code $mod+Shift+c reload
|
||||||
|
|
||||||
# Exit sway (logs you out of your Wayland session)
|
# Exit sway (logs you out of your Wayland session)
|
||||||
bindsym $mod+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -B 'Yes, exit sway' 'swaymsg exit'
|
bindsym --to-code $mod+Shift+e exec dms ipc call powermenu toggle
|
||||||
#
|
#
|
||||||
# Moving around:
|
# Moving around:
|
||||||
#
|
#
|
||||||
# Move your focus around
|
# Move your focus around
|
||||||
bindsym $mod+$left focus left
|
bindsym --to-code $mod+$left focus left
|
||||||
bindsym $mod+$down focus down
|
bindsym --to-code $mod+$down focus down
|
||||||
bindsym $mod+$up focus up
|
bindsym --to-code $mod+$up focus up
|
||||||
bindsym $mod+$right focus right
|
bindsym --to-code $mod+$right focus right
|
||||||
# Or use $mod+[up|down|left|right]
|
# Or use $mod+[up|down|left|right]
|
||||||
bindsym $mod+Left focus left
|
bindsym --to-code $mod+Left focus left
|
||||||
bindsym $mod+Down focus down
|
bindsym --to-code $mod+Down focus down
|
||||||
bindsym $mod+Up focus up
|
bindsym --to-code $mod+Up focus up
|
||||||
bindsym $mod+Right focus right
|
bindsym --to-code $mod+Right focus right
|
||||||
|
|
||||||
# Move the focused window with the same, but add Shift
|
# Move the focused window with the same, but add Shift
|
||||||
bindsym $mod+Shift+$left move left
|
bindsym --to-code $mod+Shift+$left move left
|
||||||
bindsym $mod+Shift+$down move down
|
bindsym --to-code $mod+Shift+$down move down
|
||||||
bindsym $mod+Shift+$up move up
|
bindsym --to-code $mod+Shift+$up move up
|
||||||
bindsym $mod+Shift+$right move right
|
bindsym --to-code $mod+Shift+$right move right
|
||||||
# Ditto, with arrow keys
|
# Ditto, with arrow keys
|
||||||
bindsym $mod+Shift+Left move left
|
bindsym --to-code $mod+Shift+Left move left
|
||||||
bindsym $mod+Shift+Down move down
|
bindsym --to-code $mod+Shift+Down move down
|
||||||
bindsym $mod+Shift+Up move up
|
bindsym --to-code $mod+Shift+Up move up
|
||||||
bindsym $mod+Shift+Right move right
|
bindsym --to-code $mod+Shift+Right move right
|
||||||
#
|
#
|
||||||
# Workspaces:
|
# Workspaces:
|
||||||
#
|
#
|
||||||
# Switch to workspace
|
# Switch to workspace
|
||||||
bindsym $mod+1 workspace number 1
|
bindsym --to-code $mod+1 workspace number 1
|
||||||
bindsym $mod+2 workspace number 2
|
bindsym --to-code $mod+2 workspace number 2
|
||||||
bindsym $mod+3 workspace number 3
|
bindsym --to-code $mod+3 workspace number 3
|
||||||
bindsym $mod+4 workspace number 4
|
bindsym --to-code $mod+4 workspace number 4
|
||||||
bindsym $mod+5 workspace number 5
|
bindsym --to-code $mod+5 workspace number 5
|
||||||
bindsym $mod+6 workspace number 6
|
bindsym --to-code $mod+6 workspace number 6
|
||||||
bindsym $mod+7 workspace number 7
|
bindsym --to-code $mod+7 workspace number 7
|
||||||
bindsym $mod+8 workspace number 8
|
bindsym --to-code $mod+8 workspace number 8
|
||||||
bindsym $mod+9 workspace number 9
|
bindsym --to-code $mod+9 workspace number 9
|
||||||
bindsym $mod+0 workspace number 10
|
bindsym --to-code $mod+0 workspace number 10
|
||||||
# Move focused container to workspace
|
# Move focused container to workspace
|
||||||
bindsym $mod+Shift+1 move container to workspace number 1
|
bindsym --to-code $mod+Shift+1 move container to workspace number 1
|
||||||
bindsym $mod+Shift+2 move container to workspace number 2
|
bindsym --to-code $mod+Shift+2 move container to workspace number 2
|
||||||
bindsym $mod+Shift+3 move container to workspace number 3
|
bindsym --to-code $mod+Shift+3 move container to workspace number 3
|
||||||
bindsym $mod+Shift+4 move container to workspace number 4
|
bindsym --to-code $mod+Shift+4 move container to workspace number 4
|
||||||
bindsym $mod+Shift+5 move container to workspace number 5
|
bindsym --to-code $mod+Shift+5 move container to workspace number 5
|
||||||
bindsym $mod+Shift+6 move container to workspace number 6
|
bindsym --to-code $mod+Shift+6 move container to workspace number 6
|
||||||
bindsym $mod+Shift+7 move container to workspace number 7
|
bindsym --to-code $mod+Shift+7 move container to workspace number 7
|
||||||
bindsym $mod+Shift+8 move container to workspace number 8
|
bindsym --to-code $mod+Shift+8 move container to workspace number 8
|
||||||
bindsym $mod+Shift+9 move container to workspace number 9
|
bindsym --to-code $mod+Shift+9 move container to workspace number 9
|
||||||
bindsym $mod+Shift+0 move container to workspace number 10
|
bindsym --to-code $mod+Shift+0 move container to workspace number 10
|
||||||
# Note: workspaces can have any name you want, not just numbers.
|
# Note: workspaces can have any name you want, not just numbers.
|
||||||
# We just use 1-10 as the default.
|
# We just use 1-10 as the default.
|
||||||
#
|
#
|
||||||
@@ -146,25 +134,25 @@ output * bg /usr/share/backgrounds/default.jxl fill
|
|||||||
# You can "split" the current object of your focus with
|
# You can "split" the current object of your focus with
|
||||||
# $mod+b or $mod+v, for horizontal and vertical splits
|
# $mod+b or $mod+v, for horizontal and vertical splits
|
||||||
# respectively.
|
# respectively.
|
||||||
bindsym $mod+b splith
|
bindsym --to-code $mod+b splith
|
||||||
bindsym $mod+v splitv
|
bindsym --to-code $mod+v splitv
|
||||||
|
|
||||||
# Switch the current container between different layout styles
|
# Switch the current container between different layout styles
|
||||||
bindsym $mod+s layout stacking
|
bindsym --to-code $mod+s layout stacking
|
||||||
bindsym $mod+w layout tabbed
|
bindsym --to-code $mod+w layout tabbed
|
||||||
bindsym $mod+e layout toggle split
|
bindsym --to-code $mod+e layout toggle split
|
||||||
|
|
||||||
# Make the current focus fullscreen
|
# Make the current focus fullscreen
|
||||||
bindsym $mod+f fullscreen
|
bindsym --to-code $mod+f fullscreen
|
||||||
|
|
||||||
# Toggle the current focus between tiling and floating mode
|
# Toggle the current focus between tiling and floating mode
|
||||||
bindsym $mod+Shift+space floating toggle
|
bindsym --to-code $mod+Shift+space floating toggle
|
||||||
|
|
||||||
# Swap focus between the tiling area and the floating area
|
# Swap focus between the tiling area and the floating area
|
||||||
bindsym $mod+space focus mode_toggle
|
bindsym --to-code $mod+space focus mode_toggle
|
||||||
|
|
||||||
# Move focus to the parent container
|
# Move focus to the parent container
|
||||||
bindsym $mod+a focus parent
|
bindsym --to-code $mod+a focus parent
|
||||||
#
|
#
|
||||||
# Scratchpad:
|
# Scratchpad:
|
||||||
#
|
#
|
||||||
@@ -172,11 +160,11 @@ output * bg /usr/share/backgrounds/default.jxl fill
|
|||||||
# You can send windows there and get them back later.
|
# You can send windows there and get them back later.
|
||||||
|
|
||||||
# Move the currently focused window to the scratchpad
|
# Move the currently focused window to the scratchpad
|
||||||
bindsym $mod+Shift+minus move scratchpad
|
bindsym --to-code $mod+Shift+minus move scratchpad
|
||||||
|
|
||||||
# Show the next scratchpad window or hide the focused scratchpad window.
|
# Show the next scratchpad window or hide the focused scratchpad window.
|
||||||
# If there are multiple scratchpad windows, this command cycles through them.
|
# If there are multiple scratchpad windows, this command cycles through them.
|
||||||
bindsym $mod+minus scratchpad show
|
bindsym --to-code $mod+minus scratchpad show
|
||||||
#
|
#
|
||||||
# Resizing containers:
|
# Resizing containers:
|
||||||
#
|
#
|
||||||
@@ -185,22 +173,22 @@ mode "resize" {
|
|||||||
# right will grow the containers width
|
# right will grow the containers width
|
||||||
# up will shrink the containers height
|
# up will shrink the containers height
|
||||||
# down will grow the containers height
|
# down will grow the containers height
|
||||||
bindsym $left resize shrink width 10px
|
bindsym --to-code $left resize shrink width 10px
|
||||||
bindsym $down resize grow height 10px
|
bindsym --to-code $down resize grow height 10px
|
||||||
bindsym $up resize shrink height 10px
|
bindsym --to-code $up resize shrink height 10px
|
||||||
bindsym $right resize grow width 10px
|
bindsym --to-code $right resize grow width 10px
|
||||||
|
|
||||||
# Ditto, with arrow keys
|
# Ditto, with arrow keys
|
||||||
bindsym Left resize shrink width 10px
|
bindsym --to-code Left resize shrink width 10px
|
||||||
bindsym Down resize grow height 10px
|
bindsym --to-code Down resize grow height 10px
|
||||||
bindsym Up resize shrink height 10px
|
bindsym --to-code Up resize shrink height 10px
|
||||||
bindsym Right resize grow width 10px
|
bindsym --to-code Right resize grow width 10px
|
||||||
|
|
||||||
# Return to default mode
|
# Return to default mode
|
||||||
bindsym Return mode "default"
|
bindsym --to-code Return mode "default"
|
||||||
bindsym Escape mode "default"
|
bindsym --to-code Escape mode "default"
|
||||||
}
|
}
|
||||||
bindsym $mod+r mode "resize"
|
bindsym --to-code $mod+r mode "resize"
|
||||||
|
|
||||||
# Include configs from 3 locations:
|
# Include configs from 3 locations:
|
||||||
# - /usr/share/sway/config.d
|
# - /usr/share/sway/config.d
|
||||||
@@ -223,13 +211,11 @@ bindsym $mod+r mode "resize"
|
|||||||
# important to make the magic work. And if you want to learn the secret behind
|
# important to make the magic work. And if you want to learn the secret behind
|
||||||
# the trick, it's all in the `wordexp(3)`.
|
# the trick, it's all in the `wordexp(3)`.
|
||||||
#
|
#
|
||||||
include '$(/usr/libexec/sway/layered-include "/usr/share/sway/config.d/*.conf" "/etc/sway/config.d/*.conf" "${XDG_CONFIG_HOME:-$HOME/.config}/sway/config.d/*.conf")'
|
include /etc/sway/config.d/*.conf
|
||||||
|
include ~/.config/sway/config.d/*.conf
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
input "type:keyboard" {
|
# Keyboard, touchpad: see config.d/07-input.conf
|
||||||
xkb_layout "us,ru"
|
|
||||||
xkb_options "grp:alt_shift_toggle,grp_led:scroll"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
# Session plumbing so portals (screen sharing, file dialogs, dark mode) and D-Bus activated apps work on any distro.
|
||||||
|
# Fedora's sway-systemd already does the same; running it twice is harmless.
|
||||||
|
exec_always dbus-update-activation-environment --systemd WAYLAND_DISPLAY DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP XDG_SESSION_TYPE
|
||||||
|
exec systemctl --user import-environment WAYLAND_DISPLAY DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP XDG_SESSION_TYPE
|
||||||
|
exec systemctl --user start sway-session.target
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# Monitor layout: laptop on the left (scaled), external HDMI monitor on the right
|
||||||
|
output eDP-1 position 0 0 scale 1.25
|
||||||
|
output HDMI-A-1 position 1536 0
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# Input devices: edit freely. install.sh --layouts "us,de" rewrites the keyboard line.
|
||||||
|
# Keep a Latin layout FIRST: the hotkeys are bound with --to-code and work on the other layouts too.
|
||||||
|
input "type:keyboard" {
|
||||||
|
xkb_layout "us,ru"
|
||||||
|
xkb_options "grp:alt_shift_toggle,grp_led:scroll"
|
||||||
|
}
|
||||||
|
|
||||||
|
input type:touchpad {
|
||||||
|
tap enabled
|
||||||
|
tap_button_map lrm
|
||||||
|
natural_scroll enabled
|
||||||
|
dwt enabled
|
||||||
|
middle_emulation enabled
|
||||||
|
}
|
||||||
|
|
||||||
|
# Mouse / touchpad speed (-1 slowest .. 1 fastest) goes into your own config.d/99-personal.conf
|
||||||
@@ -18,37 +18,28 @@ gaps outer 6
|
|||||||
smart_gaps on
|
smart_gaps on
|
||||||
|
|
||||||
# border background text indicator child_border
|
# border background text indicator child_border
|
||||||
client.focused $accent $base $text $accent $accent
|
# Window borders and tab / title bars: same palette as kitty and DMS (Tokyo Night + purple accent)
|
||||||
client.focused_inactive $surface1 $base $subtext $surface1 $surface1
|
# border bg text indicator child_border
|
||||||
client.unfocused $surface0 $base $subtext $surface0 $surface0
|
client.focused #bb9af7 #bb9af7 #11111b #bb9af7 #bb9af7
|
||||||
client.urgent $red $base $text $red $red
|
client.focused_inactive #3b4261 #2a2f45 #c0caf5 #3b4261 #3b4261
|
||||||
|
client.unfocused #1f2335 #1a1b26 #7a83a8 #1f2335 #1f2335
|
||||||
|
client.urgent #f7768e #f7768e #11111b #f7768e #f7768e
|
||||||
client.placeholder $base $base $text $base $base
|
client.placeholder $base $base $text $base $base
|
||||||
client.background $base
|
client.background $base
|
||||||
|
|
||||||
# Autostart
|
# Autostart
|
||||||
exec_always sh -c 'pkill -x dunst; exec dunst'
|
|
||||||
exec_always sh -c 'pkill -x nm-applet; exec nm-applet --indicator'
|
exec_always sh -c 'pkill -x nm-applet; exec nm-applet --indicator'
|
||||||
bindsym $mod+Shift+x exec ~/.config/sway/lock.sh
|
bindsym --to-code $mod+Shift+x exec ~/.config/sway/lock.sh
|
||||||
|
|
||||||
# Touchpad
|
# Touchpad
|
||||||
input type:touchpad {
|
|
||||||
tap enabled
|
|
||||||
tap_button_map lrm
|
|
||||||
natural_scroll enabled
|
|
||||||
dwt enabled
|
|
||||||
middle_emulation enabled
|
|
||||||
pointer_accel 0.3
|
|
||||||
}
|
|
||||||
|
|
||||||
# Window rules
|
# Window rules
|
||||||
for_window [app_id="pavucontrol|nm-connection-editor|blueman-manager"] floating enable, resize set 700 500, border pixel 2
|
for_window [app_id="pavucontrol|nm-connection-editor|blueman-manager"] floating enable, resize set 700 500, border pixel 2
|
||||||
for_window [window_role="pop-up"] floating enable
|
for_window [window_role="pop-up"] floating enable
|
||||||
for_window [app_id="rofi"] border none
|
titlebar_padding 10 4
|
||||||
titlebar_padding 6 3
|
|
||||||
focus_follows_mouse no
|
focus_follows_mouse no
|
||||||
workspace_auto_back_and_forth yes
|
workspace_auto_back_and_forth yes
|
||||||
bindsym $mod+Shift+p exec ~/.config/rofi/powermenu.sh
|
bindsym --to-code $mod+Shift+p exec dms ipc call powermenu toggle
|
||||||
|
|
||||||
# Wallpaper + idle/lock
|
# Idle / lock
|
||||||
output * bg ~/Pictures/wallpapers/current fill
|
|
||||||
exec_always ~/.config/sway/idle.sh
|
exec_always ~/.config/sway/idle.sh
|
||||||
|
|||||||
@@ -29,10 +29,7 @@ dim_inactive_colors.urgent #ff5c5c
|
|||||||
# Thin outline instead of fat border -> cleaner look
|
# Thin outline instead of fat border -> cleaner look
|
||||||
titlebar_separator disable
|
titlebar_separator disable
|
||||||
|
|
||||||
# Frosted glass for layers
|
# Frosted glass for sway's own layers (DMS layers: 21-dms-effects.conf)
|
||||||
layer_effects "waybar" blur enable; blur_ignore_transparent enable; corner_radius 14; shadows enable
|
|
||||||
layer_effects "rofi" blur enable; blur_ignore_transparent enable; corner_radius 20; shadows enable
|
|
||||||
layer_effects "notifications" blur enable; blur_ignore_transparent enable; corner_radius 14; shadows enable
|
|
||||||
layer_effects "swaynag" blur enable; blur_ignore_transparent enable; corner_radius 12
|
layer_effects "swaynag" blur enable; blur_ignore_transparent enable; corner_radius 12
|
||||||
|
|
||||||
# Translucent terminals, glass shows through
|
# Translucent terminals, glass shows through
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
# SwayFX blur for DMS surfaces (layer names: swaymsg -t get_outputs -r | jq '.[].layer_shell_surfaces[].namespace').
|
||||||
|
# Only blur: DMS surfaces are bigger than what is drawn, so shadows / corner_radius here would paint
|
||||||
|
# a glow and rounded corners around the whole (often full-screen) layer.
|
||||||
|
# SwayFX-only: install.sh drops this file when plain sway is used.
|
||||||
|
layer_effects "dms:bar" blur enable; blur_ignore_transparent enable
|
||||||
|
layer_effects "dms:notification-popup" blur enable; blur_ignore_transparent enable
|
||||||
|
layer_effects "dms:osd" blur enable; blur_ignore_transparent enable
|
||||||
|
layer_effects "dms:dock" blur enable; blur_ignore_transparent enable
|
||||||
@@ -3,32 +3,36 @@
|
|||||||
# Drop-down scratchpad terminal: $mod+grave
|
# Drop-down scratchpad terminal: $mod+grave
|
||||||
exec kitty --class scratch
|
exec kitty --class scratch
|
||||||
for_window [app_id="scratch"] move scratchpad, resize set 1000 560, move position center, border pixel 2
|
for_window [app_id="scratch"] move scratchpad, resize set 1000 560, move position center, border pixel 2
|
||||||
bindsym $mod+grave scratchpad show
|
bindsym --to-code $mod+grave scratchpad show
|
||||||
|
|
||||||
# Workspace navigation
|
# Workspace navigation
|
||||||
bindsym $mod+Tab workspace next_on_output
|
bindsym --to-code $mod+Tab workspace next_on_output
|
||||||
bindsym $mod+Shift+Tab workspace prev_on_output
|
bindsym --to-code $mod+Shift+Tab workspace prev_on_output
|
||||||
bindsym $mod+Ctrl+Right workspace next_on_output
|
bindsym --to-code $mod+Ctrl+Right workspace next_on_output
|
||||||
bindsym $mod+Ctrl+Left workspace prev_on_output
|
bindsym --to-code $mod+Ctrl+Left workspace prev_on_output
|
||||||
|
|
||||||
# Quick layout / window helpers
|
# Quick layout / window helpers
|
||||||
bindsym $mod+Shift+f floating toggle, resize set 1000 600, move position center
|
bindsym --to-code $mod+Shift+f floating toggle, resize set 1000 600, move position center
|
||||||
bindsym $mod+c exec swaymsg [con_id=__focused__] move position center
|
bindsym --to-code $mod+c exec swaymsg [con_id=__focused__] move position center
|
||||||
|
|
||||||
# Screenshots: area -> clipboard, area -> file
|
# Screenshots (saved to ~/Pictures/Screenshots and copied to the clipboard)
|
||||||
bindsym Shift+Print exec ~/.config/sway/screenshot.sh clip
|
bindsym --to-code Print exec ~/.config/sway/screenshot.sh region
|
||||||
bindsym $mod+Print exec ~/.config/sway/screenshot.sh file
|
bindsym --to-code $mod+Shift+s exec ~/.config/sway/screenshot.sh region
|
||||||
|
bindsym --to-code Shift+Print exec ~/.config/sway/screenshot.sh full
|
||||||
|
bindsym --to-code Ctrl+Print exec ~/.config/sway/screenshot.sh window
|
||||||
|
bindsym --to-code Alt+Print exec ~/.config/sway/screenshot.sh scroll
|
||||||
|
bindsym --to-code $mod+Print exec ~/.config/sway/screenshot.sh last
|
||||||
|
bindsym --to-code Ctrl+Shift+Print exec ~/.config/sway/screenshot.sh edit
|
||||||
|
|
||||||
# Keep video/browser-video windows undimmed
|
# Keep video/browser-video windows undimmed
|
||||||
for_window [app_id="firefox"] inhibit_idle fullscreen
|
for_window [app_id="firefox"] inhibit_idle fullscreen
|
||||||
for_window [app_id="mpv"] floating enable, dim_inactive 0
|
for_window [app_id="mpv"] floating enable, dim_inactive 0
|
||||||
|
|
||||||
# Mirror internal screen to HDMI/TV on hotplug
|
|
||||||
exec_always ~/.config/sway/mirror.sh
|
|
||||||
|
|
||||||
# Rice helpers
|
# Rice helpers
|
||||||
bindsym $mod+Shift+w exec ~/.config/sway/wallpaper.sh
|
bindsym --to-code $mod+o exec nautilus --new-window
|
||||||
bindsym $mod+Shift+s exec ~/.config/sway/screenshot-menu.sh
|
bindsym --to-code $mod+F1 exec ~/.config/sway/cheatsheet.sh
|
||||||
bindsym $mod+F1 exec ~/.config/sway/cheatsheet.sh
|
|
||||||
# Performance mode: toggle blur + shadows
|
# Performance mode: toggle blur + shadows
|
||||||
bindsym $mod+Shift+b blur toggle; shadows toggle
|
bindsym --to-code $mod+Shift+b blur toggle; shadows toggle
|
||||||
|
# Control center (notifications + quick settings)
|
||||||
|
bindsym --to-code $mod+n exec dms ipc call control-center toggle
|
||||||
|
bindsym --to-code $mod+Shift+n exec dms ipc call notifications toggle
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
# DankMaterialShell: bar, launcher, control center, notifications (replaces waybar/swaync/rofi launcher)
|
||||||
|
exec_always sh -c 'pgrep -x dms >/dev/null || exec dms run'
|
||||||
|
|
||||||
|
# First login on a new machine: wallpaper + monitor layout (does nothing when already set up)
|
||||||
|
exec ~/.config/sway/firstrun.sh
|
||||||
|
|
||||||
|
# Hotkeys: $mod+d launcher, $mod+n control center, $mod+Shift+n notifications, $mod+Shift+p power menu (set in config / config.d)
|
||||||
|
bindsym --to-code $mod+Shift+v exec dms ipc call clipboard toggle
|
||||||
|
|
||||||
|
# Media keys (work on the lock screen too); DMS shows the OSD
|
||||||
|
bindsym --locked XF86AudioRaiseVolume exec dms ipc call audio increment 5
|
||||||
|
bindsym --locked XF86AudioLowerVolume exec dms ipc call audio decrement 5
|
||||||
|
bindsym --locked XF86AudioMute exec dms ipc call audio mute
|
||||||
|
bindsym --locked XF86AudioMicMute exec dms ipc call audio micmute
|
||||||
|
bindsym --locked XF86MonBrightnessUp exec dms ipc call brightness increment 5 ""
|
||||||
|
bindsym --locked XF86MonBrightnessDown exec dms ipc call brightness decrement 5 ""
|
||||||
|
bindsym --locked XF86AudioPlay exec dms ipc call mpris playPause
|
||||||
|
bindsym --locked XF86AudioNext exec dms ipc call mpris next
|
||||||
|
bindsym --locked XF86AudioPrev exec dms ipc call mpris previous
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Health check for the sway-rising setup. Prints OK / WARN / FAIL per item. Exit code = number of FAILs.
|
||||||
|
CFG=${XDG_CONFIG_HOME:-$HOME/.config}
|
||||||
|
fails=0
|
||||||
|
ok() { printf ' \033[32mOK\033[0m %s\n' "$*"; }
|
||||||
|
warn() { printf ' \033[33mWARN\033[0m %s\n' "$*"; }
|
||||||
|
bad() { printf ' \033[31mFAIL\033[0m %s\n' "$*"; fails=$((fails+1)); }
|
||||||
|
have() { command -v "$1" >/dev/null 2>&1; }
|
||||||
|
section() { printf '\n\033[1m%s\033[0m\n' "$*"; }
|
||||||
|
|
||||||
|
section "Compositor"
|
||||||
|
if have sway; then
|
||||||
|
v=$(sway --version 2>/dev/null | head -1); ok "$v"
|
||||||
|
case $v in *swayfx*) ok "SwayFX (blur, shadows, rounded corners available)";; *) warn "plain sway: effects are disabled";; esac
|
||||||
|
sway -C >/dev/null 2>&1 && ok "sway config is valid" || bad "sway -C reports errors"
|
||||||
|
else bad "sway / swayfx not installed"; fi
|
||||||
|
[ -n "${SWAYSOCK:-}" ] && ok "running inside sway" || warn "not inside a sway session (some checks skipped)"
|
||||||
|
|
||||||
|
section "Shell (DMS)"
|
||||||
|
if have dms; then
|
||||||
|
ok "dms installed"
|
||||||
|
pgrep -x dms >/dev/null && ok "dms is running" || { [ -n "${SWAYSOCK:-}" ] && bad "dms is not running" || warn "dms not running (not in session)"; }
|
||||||
|
else bad "dms not installed"; fi
|
||||||
|
[ -f "$CFG/dms/settings.json" ] && ok "DMS settings present" || warn "no DMS settings yet"
|
||||||
|
if have dms && pgrep -x dms >/dev/null; then
|
||||||
|
w=$(dms ipc call wallpaper get 2>/dev/null | head -1)
|
||||||
|
case $w in /*) ok "wallpaper set in DMS ($(basename "$w"))";; *) warn "no wallpaper chosen in DMS yet (firstrun.sh sets one at the next sway start)";; esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
section "Session / portals"
|
||||||
|
if systemctl --user is-active sway-session.target >/dev/null 2>&1; then ok "sway-session.target active"
|
||||||
|
else [ -n "${SWAYSOCK:-}" ] && bad "sway-session.target inactive (portals will not start)" || warn "sway-session.target inactive (not in session)"; fi
|
||||||
|
if [ -n "${SWAYSOCK:-}" ] && have gdbus; then
|
||||||
|
timeout 10 gdbus call --session --dest org.freedesktop.portal.Desktop --object-path /org/freedesktop/portal/desktop \
|
||||||
|
--method org.freedesktop.DBus.Properties.Get org.freedesktop.portal.Settings version >/dev/null 2>&1 \
|
||||||
|
&& ok "xdg-desktop-portal reachable" || bad "xdg-desktop-portal unreachable"
|
||||||
|
fi
|
||||||
|
|
||||||
|
section "Fonts and theme"
|
||||||
|
fc-list 2>/dev/null | grep -qi "JetBrains Mono" && ok "JetBrains Mono" || bad "JetBrains Mono missing"
|
||||||
|
fc-list 2>/dev/null | grep -qiE "Font ?Awesome" && ok "Font Awesome" || warn "Font Awesome missing (some icons)"
|
||||||
|
{ [ -d /usr/share/themes/adw-gtk3-dark ] || [ -d "$HOME/.local/share/themes/adw-gtk3-dark" ]; } && ok "adw-gtk3 theme" || warn "adw-gtk3 theme missing (GTK apps will not follow the palette)"
|
||||||
|
|
||||||
|
section "Terminal"
|
||||||
|
have kitty && ok "kitty" || bad "kitty missing"
|
||||||
|
section "Optional shell setup (install.sh --with-shell)"
|
||||||
|
opt() { printf ' \033[2m--\033[0m %s\n' "$*"; }
|
||||||
|
for t in zsh tmux git fzf zoxide eza bat fd rg ncdu lazygit; do
|
||||||
|
if have "$t" || { [ "$t" = fd ] && have fdfind; }; then ok "$t"; else opt "$t not installed (optional)"; fi
|
||||||
|
done
|
||||||
|
[ -d "$HOME/.oh-my-zsh" ] && ok "oh-my-zsh" || opt "oh-my-zsh not installed (optional)"
|
||||||
|
|
||||||
|
section "Per-machine config"
|
||||||
|
[ -f "$CFG/sway/config.d/05-outputs.conf" ] && ok "monitor layout (05-outputs.conf)" || warn "no monitor layout yet: run ~/.config/sway/outputs-setup.sh inside sway"
|
||||||
|
for t in nautilus grim swappy jq swaylock swayidle brightnessctl wl-copy notify-send; do have "$t" && ok "$t" || warn "$t missing"; done
|
||||||
|
|
||||||
|
printf '\n'; [ "$fails" -eq 0 ] && echo "No failures." || echo "$fails failure(s)."
|
||||||
|
exit "$fails"
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Runs at every sway start; does something only on a fresh machine (idempotent):
|
||||||
|
# - picks the shipped wallpaper in DMS when none is chosen yet
|
||||||
|
# - generates the monitor layout when this machine has none
|
||||||
|
cfg=${XDG_CONFIG_HOME:-$HOME/.config}
|
||||||
|
walls=$HOME/.local/share/backgrounds
|
||||||
|
|
||||||
|
# wait until DMS has registered its IPC targets (up to ~40 s)
|
||||||
|
i=0
|
||||||
|
while [ "$i" -lt 40 ]; do
|
||||||
|
dms ipc show 2>/dev/null | grep -q '^target wallpaper' && break
|
||||||
|
i=$((i+1)); sleep 1
|
||||||
|
done
|
||||||
|
cur=$(dms ipc call wallpaper get 2>/dev/null | head -1)
|
||||||
|
|
||||||
|
# DMS prints the path when a wallpaper is set; anything else means "none yet"
|
||||||
|
case "$cur" in
|
||||||
|
/*) ;;
|
||||||
|
*) [ -f "$walls/kitty.jpg" ] && dms ipc call wallpaper set "$walls/kitty.jpg" >/dev/null 2>&1 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# monitor layout (laptop panel left, the rest to the right); the file is per machine
|
||||||
|
[ -e "$cfg/sway/config.d/05-outputs.conf" ] || "$cfg/sway/outputs-setup.sh" --auto >/dev/null 2>&1
|
||||||
|
exit 0
|
||||||
@@ -1,6 +1,10 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# Lock with swaylock-effects (blur + clock) if installed, else plain swaylock.
|
# Lock with DankMaterialShell (matches the shell theme). Fall back to swaylock-effects / swaylock
|
||||||
|
# when DMS is not running or the IPC call fails.
|
||||||
pgrep -x swaylock >/dev/null && exit 0
|
pgrep -x swaylock >/dev/null && exit 0
|
||||||
|
if pgrep -x dms >/dev/null && timeout 3 dms ipc call lock lock >/dev/null 2>&1; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
fx=$HOME/.local/bin/swaylock-effects
|
fx=$HOME/.local/bin/swaylock-effects
|
||||||
if [ -x "$fx" ]; then
|
if [ -x "$fx" ]; then
|
||||||
exec "$fx" -f -C "$HOME/.config/swaylock/config-effects"
|
exec "$fx" -f -C "$HOME/.config/swaylock/config-effects"
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Mirror the internal display to any external output (sway has no native mirroring).
|
|
||||||
# Watches output hotplug events; needs wl-mirror.
|
|
||||||
exec 9>"${XDG_RUNTIME_DIR:-/tmp}/sway-mirror.lock"
|
|
||||||
flock -n 9 || exit 0
|
|
||||||
|
|
||||||
internal=eDP-1
|
|
||||||
|
|
||||||
sync() {
|
|
||||||
pkill -x wl-mirror
|
|
||||||
for ext in $(swaymsg -t get_outputs -r | jq -r --arg i "$internal" '.[] | select(.active and .name != $i) | .name'); do
|
|
||||||
wl-mirror --fullscreen-output "$ext" "$internal" &
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
sync
|
|
||||||
swaymsg -t subscribe -m '["output"]' | while read -r _; do
|
|
||||||
sleep 1
|
|
||||||
sync
|
|
||||||
done
|
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Generate ~/.config/sway/config.d/05-outputs.conf from the monitors sway sees right now.
|
||||||
|
# Laptop panel first (left), the rest follow to the right. Run inside a sway session.
|
||||||
|
# Usage: outputs-setup.sh [--auto] (--auto: no questions, guess scales)
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
AUTO=0; [ "${1:-}" = "--auto" ] && AUTO=1
|
||||||
|
OUT=${XDG_CONFIG_HOME:-$HOME/.config}/sway/config.d/05-outputs.conf
|
||||||
|
|
||||||
|
command -v swaymsg >/dev/null && [ -n "${SWAYSOCK:-}" ] || { echo "Run this inside a sway session." >&2; exit 1; }
|
||||||
|
command -v python3 >/dev/null || { echo "python3 is required." >&2; exit 1; }
|
||||||
|
|
||||||
|
mapfile -t ROWS < <(swaymsg -t get_outputs -r | python3 -c '
|
||||||
|
import json,sys
|
||||||
|
outs=[o for o in json.load(sys.stdin) if o.get("active") or o.get("power", True)]
|
||||||
|
# internal panels (eDP/LVDS/DSI) first, then the others by name
|
||||||
|
outs.sort(key=lambda o:(0 if o["name"].startswith(("eDP","LVDS","DSI")) else 1, o["name"]))
|
||||||
|
for o in outs:
|
||||||
|
m=o.get("current_mode") or {}
|
||||||
|
print(o["name"], m.get("width",0), m.get("height",0), o.get("make","?").replace(" ","_"), o.get("model","?").replace(" ","_"))
|
||||||
|
')
|
||||||
|
[ "${#ROWS[@]}" -gt 0 ] || { echo "No outputs found." >&2; exit 1; }
|
||||||
|
|
||||||
|
guess_scale() { # name width height
|
||||||
|
case $1 in
|
||||||
|
eDP*|LVDS*|DSI*)
|
||||||
|
if [ "$2" -ge 3000 ]; then echo 2
|
||||||
|
elif [ "$2" -ge 2400 ]; then echo 1.5
|
||||||
|
elif [ "$2" -ge 1900 ] && [ "$3" -ge 1200 ]; then echo 1.25
|
||||||
|
else echo 1; fi ;;
|
||||||
|
*) echo 1 ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
x=0; body=""
|
||||||
|
for row in "${ROWS[@]}"; do
|
||||||
|
read -r name w h make model <<<"$row"
|
||||||
|
scale=$(guess_scale "$name" "$w" "$h")
|
||||||
|
if [ "$AUTO" = 0 ]; then
|
||||||
|
read -r -p "$name ($make $model, ${w}x${h}) scale [$scale]: " ans || ans=""
|
||||||
|
[ -n "$ans" ] && scale=$ans
|
||||||
|
fi
|
||||||
|
body+="output $name position $x 0 scale $scale"$'\n'
|
||||||
|
x=$(python3 -c "print(int($x + $w / $scale))")
|
||||||
|
done
|
||||||
|
|
||||||
|
mkdir -p "$(dirname "$OUT")"
|
||||||
|
[ -e "$OUT" ] && cp -a "$OUT" "$OUT.bak"
|
||||||
|
{
|
||||||
|
echo "# Monitor layout, generated by outputs-setup.sh (edit freely; re-run to regenerate)"
|
||||||
|
printf '%s' "$body"
|
||||||
|
} > "$OUT"
|
||||||
|
echo "Wrote $OUT:"; cat "$OUT"
|
||||||
|
swaymsg reload >/dev/null && echo "sway reloaded."
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
choice=$(printf '%s\n' ' Area → clipboard' ' Area → file' ' Screen → clipboard' ' Screen → file' \
|
|
||||||
| rofi -dmenu -i -p "Screenshot" -theme ~/.config/rofi/catppuccin.rasi \
|
|
||||||
-theme-str 'window {width: 380px;} listview {lines: 4;} entry {enabled: false;}')
|
|
||||||
dir=$HOME/Pictures/Screenshots; mkdir -p "$dir"
|
|
||||||
f=$dir/$(date +%F_%H-%M-%S).png
|
|
||||||
case "$choice" in
|
|
||||||
*"Area → clipboard") ~/.config/sway/screenshot.sh clip ;;
|
|
||||||
*"Area → file") ~/.config/sway/screenshot.sh file ;;
|
|
||||||
*"Screen → clipboard") sleep 0.3; grim - | wl-copy ;;
|
|
||||||
*"Screen → file") sleep 0.3; grim "$f" ;;
|
|
||||||
*) exit 0 ;;
|
|
||||||
esac
|
|
||||||
notify-send -t 2000 "Screenshot" "Saved"
|
|
||||||
@@ -1,10 +1,30 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# usage: screenshot.sh clip | file
|
# Screenshots. Every capture goes to ~/Pictures/Screenshots AND the clipboard, with a notification.
|
||||||
geo=$(slurp) || exit 0
|
# usage: screenshot.sh region | full | all | window | scroll | last | edit
|
||||||
if [ "$1" = file ]; then
|
# region select an area (DMS selector: drag, Enter/Space to confirm, Esc to cancel)
|
||||||
dir=$HOME/Pictures/Screenshots
|
# full the focused monitor all all monitors in one image
|
||||||
|
# window the focused window last repeat the previous area
|
||||||
|
# scroll stitch a scrolling area into one tall image (Enter finishes)
|
||||||
|
# edit select an area and annotate it in swappy (arrows, text, blur; save/copy from there)
|
||||||
|
dir="$HOME/Pictures/Screenshots"
|
||||||
mkdir -p "$dir"
|
mkdir -p "$dir"
|
||||||
grim -g "$geo" "$dir/$(date +%F_%H-%M-%S).png"
|
mode=${1:-region}
|
||||||
else
|
|
||||||
grim -g "$geo" - | wl-copy
|
case "$mode" in
|
||||||
|
region|full|all|last|scroll)
|
||||||
|
exec dms screenshot "$mode" --dir "$dir" ;;
|
||||||
|
window)
|
||||||
|
# DMS cannot capture a single window on sway, so use grim on the focused container
|
||||||
|
geo=$(swaymsg -t get_tree | jq -r '.. | select(.focused? == true) | .rect | "\(.x),\(.y) \(.width)x\(.height)"' | head -1)
|
||||||
|
[ -n "$geo" ] || { notify-send -u low "Screenshot" "No focused window"; exit 1; }
|
||||||
|
f="$dir/$(date +%F_%H-%M-%S)_window.png"
|
||||||
|
grim -g "$geo" "$f" && wl-copy < "$f" && notify-send -t 3000 -i "$f" "Screenshot" "Window saved and copied"
|
||||||
|
;;
|
||||||
|
edit)
|
||||||
|
if ! command -v swappy >/dev/null; then
|
||||||
|
notify-send -u critical "Screenshot" "swappy is not installed: sudo dnf install swappy"; exit 1
|
||||||
fi
|
fi
|
||||||
|
dms screenshot region --stdout --no-file --no-clipboard --no-notify | swappy -f -
|
||||||
|
;;
|
||||||
|
*) echo "usage: $0 region|full|all|window|scroll|last|edit" >&2; exit 1 ;;
|
||||||
|
esac
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Wallpaper picker with previews. Also used by sway at start (arg: apply).
|
|
||||||
dir=$HOME/Pictures/wallpapers
|
|
||||||
cur=$dir/current
|
|
||||||
if [ "$1" != apply ]; then
|
|
||||||
pick=$(find "$dir" -maxdepth 1 -type f \( -name '*.jpg' -o -name '*.png' \) | sort | while read -r f; do
|
|
||||||
printf '%s\0icon\x1f%s\n' "$(basename "$f" | sed 's/\.[^.]*$//')" "$f"
|
|
||||||
done | rofi -dmenu -i -p "Wallpaper" -show-icons -theme ~/.config/rofi/catppuccin.rasi \
|
|
||||||
-theme-str 'window {width: 760px;} listview {columns: 3; lines: 2;} element {orientation: vertical; padding: 10px;} element-icon {size: 9em;} element-text {horizontal-align: 0.5;} entry {enabled: false;}')
|
|
||||||
[ -n "$pick" ] || exit 0
|
|
||||||
file=$(find "$dir" -maxdepth 1 -type f -name "$pick.*" | head -1)
|
|
||||||
ln -sf "$file" "$cur"
|
|
||||||
fi
|
|
||||||
swaymsg output '*' bg "$cur" fill >/dev/null
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
{
|
|
||||||
"layer": "top",
|
|
||||||
"position": "top",
|
|
||||||
"height": 34,
|
|
||||||
"margin-top": 8,
|
|
||||||
"margin-left": 10,
|
|
||||||
"margin-right": 10,
|
|
||||||
"spacing": 6,
|
|
||||||
"modules-left": ["sway/workspaces", "sway/mode", "sway/window"],
|
|
||||||
"modules-center": ["clock", "mpris"],
|
|
||||||
"modules-right": ["idle_inhibitor", "sway/language", "group/hw", "backlight", "pulseaudio", "network", "battery", "tray", "custom/power"],
|
|
||||||
|
|
||||||
"sway/workspaces": { "disable-scroll": true, "all-outputs": true, "format": "{icon}", "format-icons": {"1": "", "2": "", "3": "", "4": "", "5": "", "urgent": "", "default": ""} },
|
|
||||||
"sway/window": { "max-length": 45, "format": "{title}", "rewrite": { "(.*) — Mozilla Firefox": " $1", "(.*) - Chromium": " $1" } },
|
|
||||||
"sway/language": { "format": " {short}" },
|
|
||||||
"clock": { "format": " {:%H:%M}", "format-alt": " {:%A, %d %B %Y}", "tooltip-format": "<tt>{calendar}</tt>" },
|
|
||||||
"mpris": { "format": "{player_icon} {title}", "format-paused": " {title}", "player-icons": { "default": "" }, "max-length": 36, "tooltip-format": "{artist} — {title}" },
|
|
||||||
"group/hw": { "orientation": "inherit", "drawer": { "transition-duration": 350, "transition-left-to-right": false }, "modules": ["custom/hw", "temperature", "cpu", "memory"] },
|
|
||||||
"custom/hw": { "format": "\uf085", "tooltip": false },
|
|
||||||
"idle_inhibitor": { "format": "{icon}", "format-icons": { "activated": "", "deactivated": "" }, "tooltip-format-activated": "Idle inhibited", "tooltip-format-deactivated": "Idle allowed" },
|
|
||||||
"temperature": { "critical-threshold": 85, "format": " {temperatureC}°", "interval": 5 },
|
|
||||||
"cpu": { "format": " {usage}%", "interval": 3 },
|
|
||||||
"memory": { "format": " {percentage}%", "interval": 5 },
|
|
||||||
"backlight": { "format": "{icon} {percent}%", "format-icons": ["", ""], "on-scroll-up": "brightnessctl set 5%+", "on-scroll-down": "brightnessctl set 5%-" },
|
|
||||||
"pulseaudio": {
|
|
||||||
"format": "{icon} {volume}%",
|
|
||||||
"format-muted": " muted",
|
|
||||||
"format-icons": { "default": ["", "", ""] },
|
|
||||||
"on-click": "pavucontrol",
|
|
||||||
"on-click-right": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
|
|
||||||
},
|
|
||||||
"network": {
|
|
||||||
"format-wifi": " {essid}",
|
|
||||||
"format-ethernet": " {ipaddr}",
|
|
||||||
"format-disconnected": " offline",
|
|
||||||
"tooltip-format": "{ifname} {signalStrength}%"
|
|
||||||
},
|
|
||||||
"battery": {
|
|
||||||
"states": { "warning": 25, "critical": 12 },
|
|
||||||
"format": "{icon} {capacity}%",
|
|
||||||
"format-charging": " {capacity}%",
|
|
||||||
"format-icons": ["", "", "", "", ""]
|
|
||||||
},
|
|
||||||
"tray": { "spacing": 8 },
|
|
||||||
"custom/power": { "format": "", "tooltip": false, "on-click": "~/.config/rofi/powermenu.sh" }
|
|
||||||
}
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
@define-color base #0c0c0c;
|
|
||||||
@define-color surface0 #1c1c1c;
|
|
||||||
@define-color surface1 #2e2e2e;
|
|
||||||
@define-color text #e8e8e8;
|
|
||||||
@define-color subtext #8c8c8c;
|
|
||||||
@define-color red #ff5c5c;
|
|
||||||
@define-color yellow #d9c99a;
|
|
||||||
|
|
||||||
* {
|
|
||||||
font-family: "JetBrains Mono", "Font Awesome 6 Free";
|
|
||||||
font-size: 13px;
|
|
||||||
border: none;
|
|
||||||
border-radius: 0;
|
|
||||||
min-height: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
window#waybar { background: transparent; color: @text; }
|
|
||||||
|
|
||||||
/* glass pills: translucent so swayfx blur shows through */
|
|
||||||
#workspaces, #window, #clock, #language, #cpu, #memory, #pulseaudio, #network, #battery,
|
|
||||||
#tray, #mode, #custom-power, #backlight, #idle_inhibitor, #temperature, #mpris {
|
|
||||||
background: alpha(@base, 0.55);
|
|
||||||
border: 1px solid alpha(@text, 0.08);
|
|
||||||
border-radius: 14px;
|
|
||||||
padding: 0 12px;
|
|
||||||
margin: 0;
|
|
||||||
color: @text;
|
|
||||||
transition: all 0.25s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces { padding: 0 4px; }
|
|
||||||
#workspaces button {
|
|
||||||
color: @subtext;
|
|
||||||
padding: 0 9px;
|
|
||||||
margin: 4px 2px;
|
|
||||||
border-radius: 10px;
|
|
||||||
background: transparent;
|
|
||||||
transition: all 0.25s ease;
|
|
||||||
}
|
|
||||||
#workspaces button:hover { background: alpha(@text, 0.12); color: @text; box-shadow: none; text-shadow: none; }
|
|
||||||
#workspaces button.focused { background: alpha(@text, 0.92); color: @base; padding: 0 16px; box-shadow: 0 0 12px alpha(@text, 0.35); }
|
|
||||||
#workspaces button.urgent { background: @red; color: @base; }
|
|
||||||
|
|
||||||
#mode { background: @text; color: @base; font-weight: bold; }
|
|
||||||
#window { color: @subtext; }
|
|
||||||
window#waybar.empty #window { background: transparent; border-color: transparent; }
|
|
||||||
#clock { font-weight: bold; padding: 0 16px; }
|
|
||||||
#mpris { color: @subtext; }
|
|
||||||
|
|
||||||
#cpu:hover, #memory:hover, #pulseaudio:hover, #network:hover, #battery:hover,
|
|
||||||
#language:hover, #backlight:hover, #idle_inhibitor:hover, #temperature:hover, #mpris:hover {
|
|
||||||
background: alpha(@text, 0.14);
|
|
||||||
border-color: alpha(@text, 0.25);
|
|
||||||
}
|
|
||||||
#idle_inhibitor.activated { background: @text; color: @base; }
|
|
||||||
#network.disconnected { color: @red; }
|
|
||||||
#battery.charging { color: @text; }
|
|
||||||
#battery.warning:not(.charging) { color: @yellow; }
|
|
||||||
#battery.critical:not(.charging) { color: @red; animation: blink 1s steps(2) infinite; }
|
|
||||||
#temperature.critical { color: @red; }
|
|
||||||
#custom-power { padding: 0 14px; }
|
|
||||||
#custom-power:hover { background: @red; color: @base; border-color: @red; }
|
|
||||||
|
|
||||||
@keyframes blink { to { background: alpha(@red, 0.5); } }
|
|
||||||
|
|
||||||
tooltip { background: alpha(@base, 0.85); border: 1px solid alpha(@text, 0.12); border-radius: 12px; }
|
|
||||||
tooltip label { color: @text; padding: 2px; }
|
|
||||||
|
|
||||||
/* collapsible hardware drawer */
|
|
||||||
#hw { background: alpha(@base, 0.55); border: 1px solid alpha(@text, 0.08); border-radius: 14px; padding: 0 4px; transition: all 0.25s ease; }
|
|
||||||
#hw:hover { border-color: alpha(@text, 0.25); }
|
|
||||||
#hw #custom-hw, #hw #temperature, #hw #cpu, #hw #memory { background: transparent; border: none; box-shadow: none; }
|
|
||||||
#custom-hw { color: @subtext; }
|
|
||||||
@@ -1,47 +1,75 @@
|
|||||||
# sway-rising
|
# sway-rising
|
||||||
|
|
||||||
Монохромный «стеклянный» райс для **SwayFX 0.6**: матовый blur, скруглённые углы, мягкое свечение у активного окна, плавающие «острова» в waybar, полупрозрачные rofi / dunst / swaylock.
|
«Стеклянный» райс для **Fedora**: матовый blur, скруглённые углы, мягкое свечение у активного окна, **SwayFX** (тайлинг-композитор) и **DankMaterialShell** (бар, лаунчер, панель управления с Wi-Fi / Bluetooth / VPN, уведомления, экран блокировки, обои), терминал **kitty** с красивой палитрой, удобные скриншоты и хоткеи. Ставится одной командой, откатывается одной командой.
|
||||||
|
|
||||||
## Что внутри
|
## Установка
|
||||||
|
|
||||||
| Путь | Что это |
|
Нужны: Fedora (лучше Workstation), `git`, интернет, `sudo`.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git clone https://git.ibrash.duckdns.org/aibrash/sway-rising.git sway-rising && cd sway-rising
|
||||||
|
./install.sh --dry-run # необязательно: показать, что будет сделано, ничего не меняя
|
||||||
|
./install.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Скрипт спросит про два сторонних репозитория (COPR) для SwayFX и DMS и про раскладки клавиатуры, остальное делает сам. Без вопросов: `./install.sh --yes`.
|
||||||
|
|
||||||
|
Перед началом ваши настройки **сохраняются в `~/rice-backup-<дата>`**. Ваши программы, `~/.zshrc`, tmux, ssh и браузер не трогаются.
|
||||||
|
|
||||||
|
Что ставится: сессия sway (`SwayFX`, `sway-systemd`, порталы), `DankMaterialShell`, kitty, Nautilus, swaylock/swayidle, grim + swappy (скриншоты), шрифты JetBrains Mono и Font Awesome, тема `adw-gtk3`.
|
||||||
|
|
||||||
|
Хочется ещё и zsh с oh-my-zsh, tmux и удобными утилитами (fzf, zoxide, eza, bat, fd, ripgrep, lazygit)? Добавьте `--with-shell`.
|
||||||
|
|
||||||
|
После установки **выйдите и выберите на экране входа сессию «Sway»**. При первом запуске райс сам выберет обои и расставит ваши мониторы (ноутбук слева, внешние справа, масштаб подбирается по разрешению).
|
||||||
|
|
||||||
|
Если на машине стоит Fedora Sway Spin, в ней есть обычный `sway`, который конфликтует с SwayFX: скрипт предупредит и подскажет команду `sudo dnf remove sway sway-config-fedora`.
|
||||||
|
|
||||||
|
## Настройка под себя
|
||||||
|
|
||||||
|
| Что | Как |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `.config/sway/config.d/10-appearance.conf` | цвета, рамки, отступы, обои, swayidle (через `idle.sh`) |
|
| Цвета, шрифты, виджеты бара, прозрачность | интерфейс DMS (значок настроек в панели `Super+N`) |
|
||||||
| `.config/sway/config.d/20-swayfx.conf` | эффекты SwayFX: blur, тени, скругления, прозрачность, layer_effects |
|
| Обои | интерфейс DMS: Settings → Wallpaper |
|
||||||
| `.config/sway/config.d/30-workflow.conf` | хоткеи и помощники (scratchpad, скриншоты, обои, шпаргалка) |
|
| Раскладки клавиатуры, тачпад | `~/.config/sway/config.d/07-input.conf` или `./install.sh --layouts "us,de"` |
|
||||||
| `.config/sway/*.sh` | `wallpaper.sh`, `screenshot-menu.sh`, `screenshot.sh`, `cheatsheet.sh`, `idle.sh`, `mirror.sh` |
|
| Мониторы и масштаб | `~/.config/sway/outputs-setup.sh` (с вопросами) или файл `config.d/05-outputs.conf` |
|
||||||
| `.config/waybar` | стеклянные плашки, выдвижной блок железа, mpris, яркость, idle-inhibitor |
|
| Свои твики (скорость мыши, автозапуск программ) | `~/.config/sway/config.d/99-personal.conf`, пример: `examples/99-personal.conf.example`. Установщик такие файлы **никогда не трогает** |
|
||||||
| `.config/rofi` | полупрозрачная тема + меню выключения |
|
| Хоткеи | `config` и `config.d/30-workflow.conf`; список всех: `Super+F1` |
|
||||||
| `.config/dunst` | полупрозрачные уведомления со скруглением |
|
|
||||||
| `.config/swaylock` | локскрин с обоями |
|
|
||||||
| `wallpapers/` | `original.jpg` (основные), `mono-glow`, `mono-orb`, `mono-smoke`, `mono-grid`, `mono-dusk` |
|
|
||||||
|
|
||||||
### Что было добавлено
|
Повторный запуск `./install.sh` безопасен: он обновит райс и заново сделает бэкап, а ваши `07-input.conf`, настройки DMS (`~/.config/dms/settings.json`) и все `99-*.conf` оставит как есть.
|
||||||
- **Blur 4 прохода** + brightness / contrast / saturation, шум; свечение у фокусного окна, тёмная тень у остальных.
|
|
||||||
- **Waybar:** стеклянные плашки, растягивающийся активный воркспейс, модули mpris, backlight, temperature, idle-inhibitor, выдвижной блок `⚙` (температура / CPU / RAM), мигание при низком заряде.
|
|
||||||
- **Rofi и dunst** сделаны полупрозрачными, чтобы под ними был виден blur.
|
|
||||||
- **Выбор обоев** с превью (rofi), 6 обоев в наборе.
|
|
||||||
- **Меню скриншотов** (область / экран, в буфер / в файл).
|
|
||||||
- **Шпаргалка по хоткеям** прямо из конфига.
|
|
||||||
- **Режим производительности:** переключатель blur и теней.
|
|
||||||
- **swayidle:** блокировка через 5 мин, экран гаснет через 10 мин.
|
|
||||||
- **Swaylock-effects:** размытый скриншот экрана, виньетка, часы и дата. Запускается через `sway/lock.sh`. Если swaylock-effects не установлен, используется обычный swaylock.
|
|
||||||
|
|
||||||
## Важные хоткеи (`Super` = Mod4)
|
## Откат и диагностика
|
||||||
|
|
||||||
|
- **Вернуть всё как было:** `./install.sh --restore` (берёт самый старый бэкап, то есть состояние до райса; можно указать папку: `--restore ~/rice-backup-...`). Пакеты при этом остаются, убрать их: `sudo dnf remove swayfx dms`.
|
||||||
|
- **Проверка здоровья:** `./install.sh --check` (то же: `~/.config/sway/doctor.sh`) покажет, что установлено и что работает. Диагностика самого DMS: `dms doctor`.
|
||||||
|
|
||||||
|
## Скриншоты
|
||||||
|
|
||||||
|
Все снимки сохраняются в `~/Pictures/Screenshots` **и** копируются в буфер обмена, DMS показывает уведомление.
|
||||||
|
|
||||||
|
| Клавиши | Что снимает |
|
||||||
|
|---|---|
|
||||||
|
| `Print` или `Super+Shift+S` | область: выделить мышью, `Enter` или пробел подтверждает, `Esc` отменяет |
|
||||||
|
| `Shift+Print` | весь текущий монитор |
|
||||||
|
| `Ctrl+Print` | активное окно |
|
||||||
|
| `Alt+Print` | прокручиваемая область одним длинным снимком (`Enter` завершает) |
|
||||||
|
| `Super+Print` | повторить прошлую область |
|
||||||
|
| `Ctrl+Shift+Print` | область с редактором swappy (стрелки, текст, размытие) |
|
||||||
|
|
||||||
|
## Хоткеи (`Super` = Mod4)
|
||||||
|
|
||||||
| Клавиши | Действие |
|
| Клавиши | Действие |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `Super+Return` | терминал (kitty) |
|
| `Super+Return` | терминал (kitty) |
|
||||||
| `Super+D` | запуск приложений (rofi) |
|
| `Super+D` | лаунчер DMS |
|
||||||
|
| `Super+N` | панель управления DMS (Wi-Fi, Bluetooth, VPN, звук, яркость) |
|
||||||
|
| `Super+Shift+N` | центр уведомлений |
|
||||||
|
| `Super+Shift+V` | история буфера обмена |
|
||||||
|
| `Super+O` | файловый менеджер (Nautilus) |
|
||||||
| `Super+Shift+Q` | закрыть окно |
|
| `Super+Shift+Q` | закрыть окно |
|
||||||
| `Super+Shift+C` | перезагрузить конфиг |
|
| `Super+Shift+C` | перезагрузить конфиг |
|
||||||
| `Super+Shift+E` | выйти из sway |
|
| `Super+Shift+E` / `Super+Shift+P` | меню выключения DMS |
|
||||||
| `Super+Shift+X` | заблокировать экран |
|
| `Super+Shift+X` | заблокировать экран |
|
||||||
| `Super+Shift+P` | меню выключения |
|
|
||||||
| `Super+F1` | **шпаргалка по всем хоткеям** |
|
| `Super+F1` | **шпаргалка по всем хоткеям** |
|
||||||
| `Super+Shift+W` | выбор обоев |
|
|
||||||
| `Super+Shift+S` | меню скриншотов |
|
|
||||||
| `Shift+Print` / `Super+Print` | область → буфер / область → файл |
|
|
||||||
| `Super+Shift+B` | режим производительности (blur + тени) |
|
| `Super+Shift+B` | режим производительности (blur + тени) |
|
||||||
| ``Super+` `` | выпадающий терминал (scratchpad) |
|
| ``Super+` `` | выпадающий терминал (scratchpad) |
|
||||||
| `Super+H/J/K/L` | фокус влево / вниз / вверх / вправо |
|
| `Super+H/J/K/L` | фокус влево / вниз / вверх / вправо |
|
||||||
@@ -54,27 +82,29 @@
|
|||||||
| `Super+C` | центрировать плавающее окно |
|
| `Super+C` | центрировать плавающее окно |
|
||||||
| `Super+R` | режим изменения размера (`H/J/K/L`, `Esc`) |
|
| `Super+R` | режим изменения размера (`H/J/K/L`, `Esc`) |
|
||||||
| `Super+S` / `Super+W` / `Super+E` | layout: stacking / tabbed / split |
|
| `Super+S` / `Super+W` / `Super+E` | layout: stacking / tabbed / split |
|
||||||
| `Alt+Shift` | переключение раскладки (us / ru) |
|
| `Alt+Shift` | переключение раскладки; все хоткеи работают на любой раскладке |
|
||||||
|
|
||||||
## Swaylock-effects (необязательно)
|
## Что внутри
|
||||||
|
|
||||||
В Fedora пакета нет, он есть в COPR `pheeef/swaylock-effects`. `dnf swap` не проходит из-за зависимости `sway-config-fedora`, поэтому бинарник ставится рядом с системным swaylock и ничего не заменяет:
|
| Путь | Что это |
|
||||||
|
|---|---|
|
||||||
|
| `install.sh` | установщик (Fedora): пакеты, бэкап, конфиги, `--restore`, `--check`, `--dry-run` |
|
||||||
|
| `.config/sway/config` | базовый конфиг sway; все хоткеи работают и на других раскладках (`bindsym --to-code`) |
|
||||||
|
| `.config/sway/config.d/00-session.conf` | окружение и `sway-session.target`, чтобы работали порталы (демонстрация экрана, диалоги) |
|
||||||
|
| `.config/sway/config.d/05-outputs.conf.example` | пример раскладки мониторов (свой файл создаёт `outputs-setup.sh`) |
|
||||||
|
| `.config/sway/config.d/07-input.conf` | клавиатура и тачпад |
|
||||||
|
| `.config/sway/config.d/10-appearance.conf` | цвета рамок и вкладок, отступы, правила окон, idle |
|
||||||
|
| `.config/sway/config.d/20-swayfx.conf`, `21-dms-effects.conf` | эффекты SwayFX: blur, тени, скругления, прозрачность; blur для слоёв DMS |
|
||||||
|
| `.config/sway/config.d/30-workflow.conf` | scratchpad-терминал, скриншоты, шпаргалка, режим производительности |
|
||||||
|
| `.config/sway/config.d/50-dms.conf` | запуск DMS, буфер обмена, медиаклавиши (громкость, яркость, плеер) |
|
||||||
|
| `.config/sway/screenshot.sh` | все режимы скриншотов (см. ниже) |
|
||||||
|
| `.config/sway/{lock,idle,cheatsheet,firstrun}.sh` | блокировка (DMS, запасной swaylock), swayidle, шпаргалка, первый запуск (обои и мониторы) |
|
||||||
|
| `.config/sway/outputs-setup.sh`, `doctor.sh` | раскладка мониторов под железо; проверка здоровья системы |
|
||||||
|
| `.config/dms/settings.json` | настройки DMS: тема, шрифты, виджеты бара (раскладка, VPN, температура, приватность), панель управления |
|
||||||
|
| `.config/kitty/kitty.conf` | JetBrains Mono, палитра Tokyo Night, прозрачность, вкладки (`Ctrl+Shift+←/→`) и сплиты (`Ctrl+Alt+стрелки`); `Ctrl+C` копирует выделенное (без выделения прерывает), `Ctrl+V` вставляет |
|
||||||
|
| `.config/swappy/config` | редактор скриншотов (стрелки, текст, размытие) |
|
||||||
|
| `.config/swaylock/` | запасная блокировка, если DMS не запущен |
|
||||||
|
| `home/` | только для `--with-shell`: `.zshrc`, `.tmux.conf`, алиасы (`ports`, `jce`, `dnfu`, `tm`) и автоподключение fzf / zoxide / eza |
|
||||||
|
| `wallpapers/` | обои (кладутся в `~/.local/share/backgrounds`, дальше обоями управляет DMS) |
|
||||||
|
| `examples/` | пример личных настроек |
|
||||||
|
|
||||||
```sh
|
|
||||||
mkdir /tmp/slfx && cd /tmp/slfx && dnf download swaylock-effects # после dnf copr enable pheeef/swaylock-effects
|
|
||||||
rpm2cpio swaylock-effects-*.x86_64.rpm | cpio -idm
|
|
||||||
install -Dm755 usr/bin/swaylock ~/.local/bin/swaylock-effects
|
|
||||||
```
|
|
||||||
|
|
||||||
## Установка
|
|
||||||
|
|
||||||
Нужны: swayfx, waybar, rofi, dunst, swaylock, swayidle, kitty, grim, slurp, wl-clipboard, playerctl, brightnessctl, JetBrains Mono, Font Awesome 6.
|
|
||||||
|
|
||||||
```sh
|
|
||||||
cp -r .config/* ~/.config/
|
|
||||||
mkdir -p ~/Pictures/wallpapers && cp wallpapers/* ~/Pictures/wallpapers/
|
|
||||||
ln -sf ~/Pictures/wallpapers/original.jpg ~/Pictures/wallpapers/current
|
|
||||||
swaymsg reload
|
|
||||||
```
|
|
||||||
|
|
||||||
Waybar запускает сам sway (`/usr/share/sway/config.d/90-bar.conf`). Руками его запускать не нужно, иначе будет два бара. Перезагрузка стиля: `pkill -SIGUSR2 waybar`.
|
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
# Copy to ~/.config/sway/config.d/99-personal.conf. install.sh never touches 99-*.conf files.
|
||||||
|
|
||||||
|
# Mouse / touchpad speed (-1 slowest .. 1 fastest)
|
||||||
|
input type:pointer {
|
||||||
|
pointer_accel -0.5
|
||||||
|
}
|
||||||
|
input type:touchpad {
|
||||||
|
pointer_accel 0.3
|
||||||
|
}
|
||||||
|
|
||||||
|
# Autostart apps (xdg-autostart does not run under sway)
|
||||||
|
# exec sh -c 'sleep 5; command -v nextcloud >/dev/null && nextcloud --background'
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
# Sysadmin helpers. Tools that are not installed are skipped silently.
|
||||||
|
|
||||||
|
# --- systemd / logs / network ---
|
||||||
|
alias sc='systemctl'
|
||||||
|
alias scu='systemctl --user'
|
||||||
|
alias jc='journalctl'
|
||||||
|
alias jcf='journalctl -f'
|
||||||
|
alias jce='journalctl -p err -b' # errors since boot
|
||||||
|
alias ports='ss -tulpn' # listening sockets
|
||||||
|
alias myip='curl -s ifconfig.me; echo'
|
||||||
|
alias df='df -hT -x tmpfs -x devtmpfs'
|
||||||
|
alias free='free -h'
|
||||||
|
alias dnfu='sudo dnf upgrade --refresh'
|
||||||
|
|
||||||
|
# --- safer defaults ---
|
||||||
|
alias cp='cp -iv'
|
||||||
|
alias mv='mv -iv'
|
||||||
|
alias mkdir='mkdir -pv'
|
||||||
|
|
||||||
|
# --- nicer replacements, enabled when installed ---
|
||||||
|
if command -v eza >/dev/null; then
|
||||||
|
alias ls='eza --icons --group-directories-first'
|
||||||
|
alias ll='eza -lah --icons --group-directories-first --git'
|
||||||
|
alias lt='eza --tree --level=2 --icons'
|
||||||
|
else
|
||||||
|
alias ll='ls -lah --color=auto'
|
||||||
|
fi
|
||||||
|
command -v bat >/dev/null && alias cat='bat --paging=never --style=plain'
|
||||||
|
command -v zoxide >/dev/null && eval "$(zoxide init zsh)"
|
||||||
|
if command -v fzf >/dev/null; then
|
||||||
|
for f in /usr/share/fzf/shell/key-bindings.zsh /usr/share/fzf/shell/completion.zsh; do [ -r "$f" ] && source "$f"; done
|
||||||
|
export FZF_DEFAULT_OPTS='--height=40% --layout=reverse --border --color=bg+:#3b4261,fg+:#c0caf5,hl:#bb9af7,hl+:#bb9af7,pointer:#ff9e64,prompt:#7dcfff'
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- tmux: attach to "main" or create it ---
|
||||||
|
tm() { tmux new-session -A -s "${1:-main}"; }
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
# Меняем префикс на Ctrl+A
|
||||||
|
unbind C-b
|
||||||
|
set -g prefix C-a
|
||||||
|
bind C-a send-prefix
|
||||||
|
|
||||||
|
# Включаем поддержку мыши (чтобы скроллить и кликать по панелям как в GUI!)
|
||||||
|
set -g mouse on
|
||||||
|
|
||||||
|
# ---------- Usability ----------
|
||||||
|
set -g base-index 1 # windows and panes start at 1
|
||||||
|
setw -g pane-base-index 1
|
||||||
|
set -g renumber-windows on
|
||||||
|
set -g escape-time 10 # no lag on Esc (vim)
|
||||||
|
set -g history-limit 50000
|
||||||
|
set -g focus-events on
|
||||||
|
set -g set-clipboard on # copy from tmux into the system clipboard (OSC52, kitty)
|
||||||
|
set -g default-terminal "tmux-256color"
|
||||||
|
set -ag terminal-overrides ",xterm-kitty:RGB"
|
||||||
|
setw -g aggressive-resize on
|
||||||
|
|
||||||
|
# Splits in the current directory, intuitive keys
|
||||||
|
bind | split-window -h -c "#{pane_current_path}"
|
||||||
|
bind - split-window -v -c "#{pane_current_path}"
|
||||||
|
bind c new-window -c "#{pane_current_path}"
|
||||||
|
unbind '"'
|
||||||
|
unbind %
|
||||||
|
|
||||||
|
# Vim-style pane navigation / resize
|
||||||
|
bind h select-pane -L
|
||||||
|
bind j select-pane -D
|
||||||
|
bind k select-pane -U
|
||||||
|
bind l select-pane -R
|
||||||
|
bind -r H resize-pane -L 5
|
||||||
|
bind -r J resize-pane -D 5
|
||||||
|
bind -r K resize-pane -U 5
|
||||||
|
bind -r L resize-pane -R 5
|
||||||
|
|
||||||
|
# Reload config
|
||||||
|
bind r source-file ~/.tmux.conf \; display-message "tmux.conf reloaded"
|
||||||
|
|
||||||
|
# ---------- Look (Tokyo Night, matches kitty) ----------
|
||||||
|
set -g status-position top
|
||||||
|
set -g status-interval 5
|
||||||
|
set -g status-style "bg=#1f2335,fg=#a9b1d6"
|
||||||
|
set -g status-left-length 30
|
||||||
|
set -g status-left "#[bg=#bb9af7,fg=#11111b,bold] #S #[bg=#1f2335,fg=#bb9af7] "
|
||||||
|
set -g status-right-length 60
|
||||||
|
set -g status-right "#[fg=#7dcfff]#{?client_prefix,PREFIX ,}#[fg=#a9b1d6]#H #[fg=#565f89]| #[fg=#a9b1d6]%d.%m %H:%M "
|
||||||
|
setw -g window-status-format " #I:#W "
|
||||||
|
setw -g window-status-current-format "#[bg=#3b4261,fg=#c0caf5,bold] #I:#W "
|
||||||
|
set -g pane-border-style "fg=#3b4261"
|
||||||
|
set -g pane-active-border-style "fg=#bb9af7"
|
||||||
|
set -g message-style "bg=#bb9af7,fg=#11111b"
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
# sway-rising zsh config (installed only when you have no ~/.zshrc)
|
||||||
|
export ZSH="$HOME/.oh-my-zsh"
|
||||||
|
ZSH_THEME="robbyrussell"
|
||||||
|
plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
|
||||||
|
source $ZSH/oh-my-zsh.sh
|
||||||
|
|
||||||
|
export PATH="$HOME/.local/bin:$PATH"
|
||||||
|
|
||||||
|
# Aliases and tool hooks (fzf, zoxide, eza) live in ~/.oh-my-zsh/custom/sysadmin.zsh
|
||||||
|
|
||||||
|
# nvm (optional)
|
||||||
|
export NVM_DIR="$HOME/.nvm"
|
||||||
|
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
|
||||||
@@ -0,0 +1,290 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# sway-rising installer (Fedora): the "glass" look on SwayFX + DankMaterialShell, with kitty,
|
||||||
|
# fonts, wallpaper, hotkeys and screenshots. Your existing configs are backed up first.
|
||||||
|
#
|
||||||
|
# Usage: ./install.sh [options]
|
||||||
|
# -y, --yes do not ask questions (non-interactive)
|
||||||
|
# --dry-run print what would be done, change nothing
|
||||||
|
# --check only run the health check and exit
|
||||||
|
# --restore [DIR] put your old configs back from a backup (default: the OLDEST ~/rice-backup-*, i.e. before the rice)
|
||||||
|
# --layouts L keyboard layouts, e.g. "us,de" (default: ask; "us,ru" with --yes)
|
||||||
|
# --no-packages configs only, skip package installation
|
||||||
|
# --no-dms do not install DankMaterialShell
|
||||||
|
# --with-shell also install zsh, oh-my-zsh, tmux and CLI tools (fzf, zoxide, eza, ...) with their configs
|
||||||
|
# --force-shell with --with-shell: replace an existing ~/.zshrc (the old one is backed up)
|
||||||
|
# -h, --help
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
REPO=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||||
|
CFG=${XDG_CONFIG_HOME:-$HOME/.config}
|
||||||
|
WALLS=$HOME/.local/share/backgrounds
|
||||||
|
STAMP=$(date +%F-%H%M%S)
|
||||||
|
BACKUP=$HOME/rice-backup-$STAMP
|
||||||
|
n=1; while [ -e "$BACKUP" ]; do n=$((n+1)); BACKUP=$HOME/rice-backup-$STAMP-$n; done # never reuse a backup folder
|
||||||
|
MANAGED_DIRS=(sway swaylock kitty dms swappy) # configs this repo owns
|
||||||
|
PRESERVE=(sway/config.d/07-input.conf dms/settings.json) # meant to be edited by the user: installed only when missing
|
||||||
|
LEGACY_DIRS=(waybar rofi dunst swaync) # older versions of the rice; only backed up
|
||||||
|
|
||||||
|
YES=0; DRY=0; CHECK=0; RESTORE=0; RESTORE_DIR=""; PACKAGES=1; DMS=1; WITH_SHELL=0; FORCE_SHELL=0; LAYOUTS=""
|
||||||
|
while [ $# -gt 0 ]; do
|
||||||
|
case $1 in
|
||||||
|
-y|--yes) YES=1 ;;
|
||||||
|
--dry-run) DRY=1 ;;
|
||||||
|
--check) CHECK=1 ;;
|
||||||
|
--restore) RESTORE=1; if [ $# -gt 1 ] && [ "${2#-}" = "$2" ]; then RESTORE_DIR=$2; shift; fi ;;
|
||||||
|
--layouts) [ $# -gt 1 ] || { echo "--layouts needs a value" >&2; exit 1; }; LAYOUTS=$2; shift ;;
|
||||||
|
--no-packages) PACKAGES=0 ;;
|
||||||
|
--no-dms) DMS=0 ;;
|
||||||
|
--with-shell) WITH_SHELL=1 ;;
|
||||||
|
--force-shell) FORCE_SHELL=1 ;;
|
||||||
|
-h|--help) sed -n '2,15p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
|
||||||
|
*) echo "unknown option: $1 (try --help)" >&2; exit 1 ;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
say() { printf '\033[1;37m==>\033[0m %s\n' "$*"; }
|
||||||
|
warn() { printf '\033[1;33m!!\033[0m %s\n' "$*" >&2; }
|
||||||
|
ask() { [ "$YES" = 1 ] && return 0; read -r -p "$1 [y/N] " r || return 1; [[ $r =~ ^[yYдД] ]]; }
|
||||||
|
run() { if [ "$DRY" = 1 ]; then printf ' [dry-run] %s\n' "$*"; else "$@"; fi; }
|
||||||
|
have() { command -v "$1" >/dev/null 2>&1; }
|
||||||
|
|
||||||
|
FAILED=() # steps that did not work, shown at the end
|
||||||
|
NOTES=() # follow-up hints for the user
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------- packages (Fedora names, all verified with dnf)
|
||||||
|
CORE_PKGS=(
|
||||||
|
sway-systemd dbus-tools # session target + env for portals
|
||||||
|
kitty nautilus swaylock swayidle grim swappy jq wl-clipboard brightnessctl libnotify
|
||||||
|
network-manager-applet wireplumber pipewire-pulseaudio
|
||||||
|
xdg-desktop-portal xdg-desktop-portal-wlr xdg-desktop-portal-gtk
|
||||||
|
jetbrains-mono-fonts fontawesome-6-free-fonts adw-gtk3-theme
|
||||||
|
)
|
||||||
|
SHELL_PKGS=(zsh tmux git curl fzf zoxide eza bat fd-find ripgrep ncdu fastfetch)
|
||||||
|
|
||||||
|
check_fedora() {
|
||||||
|
local ID="" ID_LIKE=""
|
||||||
|
[ -r /etc/os-release ] && . /etc/os-release
|
||||||
|
case " $ID $ID_LIKE " in *" fedora "*) return 0 ;; esac
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
dnf_install() { [ $# -gt 0 ] || return 0
|
||||||
|
if run sudo dnf install -y "$@"; then return 0; fi
|
||||||
|
warn "Batch install failed, retrying package by package"
|
||||||
|
local p; for p in "$@"; do run sudo dnf install -y "$p" || FAILED+=("package:$p"); done
|
||||||
|
}
|
||||||
|
|
||||||
|
install_swayfx() {
|
||||||
|
if have sway && sway --version 2>/dev/null | grep -qi swayfx; then say "SwayFX already installed"; return 0; fi
|
||||||
|
say "SwayFX comes from the swayfx/swayfx COPR (it conflicts with the stock 'sway' package)"
|
||||||
|
if rpm -q sway >/dev/null 2>&1; then
|
||||||
|
warn "Stock 'sway' is installed. Remove it first: sudo dnf remove sway sway-config-fedora then re-run."
|
||||||
|
FAILED+=("swayfx: stock sway is in the way"); return 0
|
||||||
|
fi
|
||||||
|
if ask "Enable COPR swayfx/swayfx and install swayfx?"; then
|
||||||
|
run sudo dnf copr enable -y swayfx/swayfx && dnf_install swayfx || FAILED+=("swayfx")
|
||||||
|
else warn "Skipping swayfx: the effects (blur, shadows, rounding) need it."; fi
|
||||||
|
}
|
||||||
|
|
||||||
|
install_dms() {
|
||||||
|
if have dms; then say "DankMaterialShell already installed"; return 0; fi
|
||||||
|
say "DankMaterialShell (bar, launcher, control center, notifications) comes from the avengemedia/dms COPR"
|
||||||
|
if ask "Enable COPR avengemedia/dms and install dms?"; then
|
||||||
|
run sudo dnf copr enable -y avengemedia/dms && dnf_install dms || FAILED+=("dms")
|
||||||
|
else warn "Skipping dms: no bar / control center / notifications will be started."; fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# lazygit is not in Fedora: official release binary, checksum verified (only with --with-shell)
|
||||||
|
install_lazygit() {
|
||||||
|
have lazygit && return 0
|
||||||
|
local arch; case $(uname -m) in x86_64) arch=x86_64 ;; aarch64) arch=arm64 ;; *) warn "lazygit: unsupported arch"; return 0 ;; esac
|
||||||
|
say "Installing lazygit (official release binary)"
|
||||||
|
if [ "$DRY" = 1 ]; then echo " [dry-run] download lazygit_*_linux_$arch.tar.gz, verify sha256, install to ~/.local/bin"; return 0; fi
|
||||||
|
local tmp tag ver; tmp=$(mktemp -d)
|
||||||
|
tag=$(curl -fsSL https://api.github.com/repos/jesseduffield/lazygit/releases/latest | sed -n 's/.*"tag_name": *"\([^"]*\)".*/\1/p' | head -1)
|
||||||
|
if [ -z "$tag" ]; then warn "lazygit: could not get the latest version"; FAILED+=("lazygit"); rm -rf "$tmp"; return 0; fi
|
||||||
|
ver=${tag#v}
|
||||||
|
local base=https://github.com/jesseduffield/lazygit/releases/download/$tag asset=lazygit_${ver}_linux_${arch}.tar.gz
|
||||||
|
if ( cd "$tmp" && curl -fsSLO "$base/$asset" && curl -fsSLO "$base/checksums.txt" \
|
||||||
|
&& [ "$(grep " $asset\$" checksums.txt | awk '{print $1}')" = "$(sha256sum "$asset" | awk '{print $1}')" ] \
|
||||||
|
&& tar -xzf "$asset" lazygit ); then
|
||||||
|
install -Dm755 "$tmp/lazygit" "$HOME/.local/bin/lazygit"
|
||||||
|
else warn "lazygit: download or checksum failed"; FAILED+=("lazygit"); fi
|
||||||
|
rm -rf "$tmp"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------- zsh / oh-my-zsh (only with --with-shell)
|
||||||
|
install_shell_extras() {
|
||||||
|
local zsh_custom=$HOME/.oh-my-zsh/custom p
|
||||||
|
if [ ! -d "$HOME/.oh-my-zsh" ]; then
|
||||||
|
say "Installing oh-my-zsh"
|
||||||
|
run git clone --depth 1 https://github.com/ohmyzsh/ohmyzsh.git "$HOME/.oh-my-zsh" || FAILED+=("oh-my-zsh")
|
||||||
|
fi
|
||||||
|
for p in zsh-autosuggestions zsh-syntax-highlighting; do
|
||||||
|
[ -d "$zsh_custom/plugins/$p" ] || run git clone --depth 1 "https://github.com/zsh-users/$p.git" "$zsh_custom/plugins/$p" || FAILED+=("zsh plugin $p")
|
||||||
|
done
|
||||||
|
if [ "$(basename "${SHELL:-}")" != zsh ] && have zsh; then
|
||||||
|
if ask "Make zsh your login shell (chsh)?"; then run chsh -s "$(command -v zsh)" || NOTES+=("chsh failed; run: chsh -s $(command -v zsh)"); fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------- configs
|
||||||
|
choose_layouts() {
|
||||||
|
[ -n "$LAYOUTS" ] && return 0
|
||||||
|
if [ "$YES" = 1 ] || [ ! -t 0 ] || [ "$DRY" = 1 ]; then return 0; fi # keep the shipped "us,ru"
|
||||||
|
read -r -p "Keyboard layouts, comma separated (first one must be Latin) [us,ru]: " LAYOUTS || LAYOUTS=""
|
||||||
|
}
|
||||||
|
|
||||||
|
apply_layouts() {
|
||||||
|
[ -n "$LAYOUTS" ] && [ "$LAYOUTS" != "us,ru" ] || return 0
|
||||||
|
if ! [[ $LAYOUTS =~ ^[a-z0-9_,()-]+$ ]]; then warn "Ignoring odd layout string '$LAYOUTS'"; return 0; fi
|
||||||
|
say "Keyboard layouts: $LAYOUTS"
|
||||||
|
if [ "$DRY" = 1 ]; then echo " [dry-run] set xkb_layout \"$LAYOUTS\" in config.d/07-input.conf"; return 0; fi
|
||||||
|
sed -i "s|xkb_layout \".*\"|xkb_layout \"$LAYOUTS\"|" "$CFG/sway/config.d/07-input.conf"
|
||||||
|
}
|
||||||
|
|
||||||
|
backup_and_copy_configs() {
|
||||||
|
say "Backing up existing configs to $BACKUP"
|
||||||
|
run mkdir -p "$BACKUP"
|
||||||
|
local d
|
||||||
|
for d in "${MANAGED_DIRS[@]}" "${LEGACY_DIRS[@]}"; do
|
||||||
|
if [ -e "$CFG/$d" ]; then run cp -a "$CFG/$d" "$BACKUP/"; fi
|
||||||
|
done
|
||||||
|
|
||||||
|
say "Copying configs to $CFG"
|
||||||
|
run mkdir -p "$CFG"
|
||||||
|
# files the user is meant to edit (keyboard, DMS theme) are installed only when missing; 99-*.conf are never in the repo
|
||||||
|
local kept=() f tmp
|
||||||
|
tmp=$(mktemp -d)
|
||||||
|
for f in "${PRESERVE[@]}"; do
|
||||||
|
if [ "$DRY" = 0 ] && [ -f "$CFG/$f" ]; then mkdir -p "$tmp/$(dirname "$f")"; cp -a "$CFG/$f" "$tmp/$f"; kept+=("$f"); fi
|
||||||
|
done
|
||||||
|
if [ "$DRY" = 1 ]; then echo " [dry-run] cp -a $REPO/.config/. $CFG/ (keeping existing: ${PRESERVE[*]})"; else cp -a "$REPO/.config/." "$CFG/"; fi
|
||||||
|
for f in "${kept[@]}"; do cp -a "$tmp/$f" "$CFG/$f"; NOTES+=("Kept your existing $f (not overwritten)"); done
|
||||||
|
rm -rf "$tmp"
|
||||||
|
run rm -f "$CFG/sway/config.d/40-bar.conf" # waybar is replaced by DMS; a stale file from an old version would start a second bar
|
||||||
|
if [ "$DRY" = 0 ]; then chmod +x "$CFG"/sway/*.sh 2>/dev/null || true; fi
|
||||||
|
run mkdir -p "$HOME/Pictures/Screenshots"
|
||||||
|
|
||||||
|
if [ "$WITH_SHELL" = 1 ] && [ -d "$REPO/home" ]; then
|
||||||
|
say "Copying shell/tmux files into $HOME (existing ones are backed up)"
|
||||||
|
local f
|
||||||
|
while IFS= read -r f; do
|
||||||
|
if [ "$f" = ".zshrc" ] && [ -e "$HOME/.zshrc" ] && [ "$FORCE_SHELL" = 0 ]; then
|
||||||
|
NOTES+=("Your ~/.zshrc was kept. To use the rice's one: ./install.sh --with-shell --force-shell (the old one is backed up)"); continue
|
||||||
|
fi
|
||||||
|
if [ -e "$HOME/$f" ]; then run mkdir -p "$BACKUP/$(dirname "$f")"; run cp -a "$HOME/$f" "$BACKUP/$f"; fi
|
||||||
|
run mkdir -p "$HOME/$(dirname "$f")"
|
||||||
|
run cp -a "$REPO/home/$f" "$HOME/$f"
|
||||||
|
done < <(cd "$REPO/home" && find . -type f | sed 's|^\./||')
|
||||||
|
fi
|
||||||
|
install_wallpapers
|
||||||
|
}
|
||||||
|
|
||||||
|
# Wallpapers are managed by DMS; we only drop the shipped favourites into its folder.
|
||||||
|
# The first sway start (firstrun.sh) picks one in DMS if none is chosen yet.
|
||||||
|
install_wallpapers() {
|
||||||
|
compgen -G "$REPO/wallpapers/*" >/dev/null || return 0
|
||||||
|
say "Copying wallpapers to $WALLS"
|
||||||
|
run mkdir -p "$WALLS"
|
||||||
|
if [ "$DRY" = 1 ]; then echo " [dry-run] cp -n wallpapers/* $WALLS/"; else cp -n "$REPO"/wallpapers/* "$WALLS/"; fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# GTK theme: adw-gtk3 (DMS recolors it)
|
||||||
|
apply_gtk_theme() {
|
||||||
|
have gsettings || return 0
|
||||||
|
[ -d /usr/share/themes/adw-gtk3-dark ] || return 0
|
||||||
|
run gsettings set org.gnome.desktop.interface gtk-theme 'adw-gtk3-dark' || true
|
||||||
|
run gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark' || true
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_outputs() {
|
||||||
|
if [ -e "$CFG/sway/config.d/05-outputs.conf" ]; then say "Monitor layout already configured (05-outputs.conf)"; return 0; fi
|
||||||
|
if [ -n "${SWAYSOCK:-}" ] && [ "$DRY" = 0 ]; then
|
||||||
|
say "Generating the monitor layout"
|
||||||
|
"$CFG/sway/outputs-setup.sh" --auto || true
|
||||||
|
else
|
||||||
|
NOTES+=("Monitors: the first sway start generates the layout automatically; fine-tune with ~/.config/sway/outputs-setup.sh")
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
verify() {
|
||||||
|
if have sway && [ "$DRY" = 0 ]; then
|
||||||
|
if sway -C >/dev/null 2>&1; then say "sway config is valid"; else warn "sway -C reported a problem; run: sway -C"; FAILED+=("sway config check"); fi
|
||||||
|
fi
|
||||||
|
if [ -n "${SWAYSOCK:-}" ] && have swaymsg && [ "$DRY" = 0 ]; then
|
||||||
|
swaymsg reload >/dev/null && say "sway reloaded"
|
||||||
|
else
|
||||||
|
NOTES+=("Log out and pick the 'Sway' session on the login screen to see the result.")
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------- restore
|
||||||
|
restore_backup() {
|
||||||
|
local src=$RESTORE_DIR
|
||||||
|
# the oldest backup holds your configs from before the rice; newer ones hold earlier installs of the rice itself
|
||||||
|
[ -n "$src" ] || src=$(ls -d "$HOME"/rice-backup-* 2>/dev/null | sort | head -1 || true)
|
||||||
|
if [ -z "$src" ] || [ ! -d "$src" ]; then warn "No backup found (looked for $HOME/rice-backup-*)"; exit 1; fi
|
||||||
|
say "Restoring from $src"
|
||||||
|
ask "This replaces the rice configs in $CFG with the backed up ones. Continue?" || exit 0
|
||||||
|
local e name d
|
||||||
|
for e in "$src"/* "$src"/.[!.]*; do
|
||||||
|
[ -e "$e" ] || continue
|
||||||
|
name=$(basename "$e")
|
||||||
|
case $name in
|
||||||
|
.*) run cp -a "$e" "$HOME/" ;; # shell/tmux files
|
||||||
|
*) run rm -rf "$CFG/$name"; run cp -a "$e" "$CFG/" ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
for d in "${MANAGED_DIRS[@]}"; do
|
||||||
|
[ -e "$src/$d" ] || NOTES+=("$d had no config before the install, so it was left as is: remove it with rm -rf $CFG/$d")
|
||||||
|
done
|
||||||
|
NOTES+=("Packages are not removed. To drop the rice: sudo dnf remove swayfx dms (then pick your old session at login)")
|
||||||
|
}
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------- main
|
||||||
|
if [ "$CHECK" = 1 ]; then exec "$REPO/.config/sway/doctor.sh"; fi
|
||||||
|
if [ "$(id -u)" = 0 ]; then warn "Do not run as root; the script uses sudo where needed."; exit 1; fi
|
||||||
|
|
||||||
|
if [ "$RESTORE" = 1 ]; then
|
||||||
|
restore_backup
|
||||||
|
if [ ${#NOTES[@]} -gt 0 ]; then printf '\033[1mNext steps:\033[0m\n'; printf ' - %s\n' "${NOTES[@]}"; fi
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_fedora; then say "Fedora detected"; else
|
||||||
|
warn "This installer is for Fedora. Packages are skipped, configs only."; PACKAGES=0
|
||||||
|
fi
|
||||||
|
[ "$DRY" = 1 ] && say "DRY RUN: nothing will be changed"
|
||||||
|
choose_layouts
|
||||||
|
|
||||||
|
if [ "$PACKAGES" = 1 ]; then
|
||||||
|
say "Installing core packages (${#CORE_PKGS[@]})"
|
||||||
|
dnf_install "${CORE_PKGS[@]}"
|
||||||
|
install_swayfx
|
||||||
|
if [ "$DMS" = 1 ]; then install_dms; fi
|
||||||
|
if [ "$WITH_SHELL" = 1 ]; then
|
||||||
|
say "Installing shell packages (${#SHELL_PKGS[@]})"
|
||||||
|
dnf_install "${SHELL_PKGS[@]}"
|
||||||
|
install_lazygit
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
backup_and_copy_configs
|
||||||
|
apply_layouts
|
||||||
|
if [ "$PACKAGES" = 1 ]; then apply_gtk_theme; fi
|
||||||
|
if [ "$WITH_SHELL" = 1 ]; then install_shell_extras; fi
|
||||||
|
setup_outputs
|
||||||
|
verify
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Backup of your old configs: $BACKUP (undo with: ./install.sh --restore)"
|
||||||
|
if [ ${#FAILED[@]} -gt 0 ]; then printf '\033[1;33mDid not work:\033[0m\n'; printf ' - %s\n' "${FAILED[@]}"; fi
|
||||||
|
if [ ${#NOTES[@]} -gt 0 ]; then printf '\033[1mNext steps:\033[0m\n'; printf ' - %s\n' "${NOTES[@]}"; fi
|
||||||
|
cat <<EOF
|
||||||
|
|
||||||
|
Health check any time: ./install.sh --check (or ~/.config/sway/doctor.sh)
|
||||||
|
Hotkeys: Super+F1 cheatsheet, Super+D launcher, Super+N control center, Print screenshot, Super+Shift+X lock.
|
||||||
|
Your own tweaks go into ~/.config/sway/config.d/99-personal.conf (never touched by this script).
|
||||||
|
EOF
|
||||||
|
Before Width: | Height: | Size: 468 KiB After Width: | Height: | Size: 468 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 113 KiB |
|
Before Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 47 KiB |