Skip to content

Commit ca0c23c

Browse files
committed
Integrate Quickshell-Overview with Qt6 fixes and automation scripts
## Overview This commit integrates the corrected Quickshell-Overview feature across all installation and update workflows. The overview provides an AGS alternative with live window previews toggled via Super+TAB keybind. ## Changes ### 1. Quickshell Overview QML Files - Added config/quickshell/overview/ subdirectory with Qt6-compatible QML - Includes 20+ files covering: * OverviewWindow.qml with proper clipping (no OpacityMask, uses QtQuick.Effects) * OverviewWidget.qml for window handling * Overview.qml main component with Hyprland integration * Common utilities and styling * Services for Hyprland data and global state management ### 2. copy.sh Updates - Removes default shell.qml that blocks quickshell named config detection - Auto-copies config/quickshell/overview to ~/.config/quickshell/overview/ - Updates old 'qs' startup commands to 'qs -c overview' - Handles both fresh installs and config overwrite scenarios ### 3. upgrade.sh Updates - Added config/quickshell/ to upgrade directory list - Excludes shell.qml to preserve overview config detection capability - Enables seamless upgrades without losing quickshell settings ### 4. IPC Command Fixes - Corrected OverviewToggle.sh to use proper 'qs ipc -c overview call overview toggle' - Fixed startup commands from old 'qs' to 'qs -c overview' - Hyprland-Dots now uses corrected toggle script ## Qt6 Compatibility - Replaced Qt5Compat.GraphicalEffects with QtQuick.Effects - Removed OpacityMask in favor of Qt6-compatible clipping technique - All QML properly imports Qt6 modules ## Release Script - release.sh automatically uses copy.sh, inheriting all quickshell updates ## Testing - Verified on target systems (Fedora 43 VM, jak-nixos) - qs -c overview successfully launches overview config when shell.qml is removed - IPC toggle commands work correctly within Wayland sessions ## Files Modified - config/quickshell/overview/* (20 new files) - copy.sh (enhanced QS handling) - upgrade.sh (added quickshell to upgrade paths)
1 parent 510eafb commit ca0c23c

22 files changed

Lines changed: 1328 additions & 0 deletions
Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
# Quickshell Overview for Hyprland
2+
3+
<div align="center">
4+
5+
A standalone workspace overview module for Hyprland using Quickshell - shows all workspaces with live window previews, drag-and-drop support, and Super+Tab keybind.
6+
7+
![Quickshell](https://img.shields.io/badge/Quickshell-0.2.0-blue?style=flat-square)
8+
![Hyprland](https://img.shields.io/badge/Hyprland-Compatible-purple?style=flat-square)
9+
![Qt6](https://img.shields.io/badge/Qt-6-green?style=flat-square)
10+
![License](https://img.shields.io/badge/License-GPL-orange?style=flat-square)
11+
12+
</div>
13+
14+
---
15+
16+
## 📸 Preview
17+
18+
![Overview Screenshot](assets/image.png)
19+
20+
https://github.com/user-attachments/assets/79ceb141-6b9e-4956-8e09-aaf72b66550c
21+
22+
> *Workspace overview showing live window previews with drag-and-drop support*
23+
24+
---
25+
26+
## ✨ Features
27+
28+
- 🖼️ Visual workspace overview showing all workspaces and windows
29+
- 🎯 Click windows to focus them
30+
- 🖱️ Middle-click windows to close them
31+
- 🔄 Drag and drop windows between workspaces
32+
- ⌨️ Keyboard navigation (Arrow keys to switch workspaces, Escape/Enter to close)
33+
- 💡 Hover tooltips showing window information
34+
- 🎨 Material Design 3 theming
35+
- ⚡ Smooth animations and transitions
36+
37+
## 📦 Installation
38+
39+
### Prerequisites
40+
41+
- **Hyprland** compositor
42+
- **Quickshell** ([installation guide](https://quickshell.org/docs/v0.1.0/guide/install-setup/))
43+
- **Qt 6** with modules: QtQuick, QtQuick.Controls, Qt5Compat.GraphicalEffects
44+
45+
### Setup
46+
47+
1. **Clone this repository** to your Quickshell config directory:
48+
```bash
49+
git clone https://github.com/Shanu-Kumawat/quickshell-overview ~/.config/quickshell/overview
50+
```
51+
52+
2. **Add keybind** to your Hyprland config (`~/.config/hypr/hyprland.conf`):
53+
```conf
54+
bind = Super, TAB, exec, qs ipc -c overview call overview toggle
55+
```
56+
57+
3. **Auto-start** the overview (add to Hyprland config):
58+
```conf
59+
exec-once = qs -c overview
60+
```
61+
62+
4. **Reload Hyprland**:
63+
```bash
64+
hyprctl reload
65+
```
66+
67+
### Manual Start (if needed)
68+
69+
```bash
70+
qs -c overview &
71+
```
72+
73+
## 🎮 Usage
74+
75+
| Action | Description |
76+
|--------|-------------|
77+
| **Super + Tab** | Toggle the overview |
78+
| **Left/Right Arrow Keys** | Navigate between workspaces horizontally |
79+
| **Up/Down Arrow Keys** | Navigate between workspace rows |
80+
| **Escape / Enter** | Close the overview |
81+
| **Click workspace** | Switch to that workspace |
82+
| **Click window** | Focus that window |
83+
| **Middle-click window** | Close that window |
84+
| **Drag window** | Move window to different workspace |
85+
86+
---
87+
88+
## ⚙️ Configuration
89+
90+
> **⚠️ Want to change the size, position, or number of workspaces?**
91+
> Edit `~/.config/quickshell/overview/common/Config.qml` - it's all there!
92+
93+
### Workspace Grid
94+
95+
Edit `~/.config/quickshell/overview/common/Config.qml`:
96+
97+
```qml
98+
property QtObject overview: QtObject {
99+
property int rows: 2 // Number of workspace rows
100+
property int columns: 5 // Number of workspace columns (10 total workspaces)
101+
property real scale: 0.16 // Overview scale factor (0.1-0.3, smaller = more compact)
102+
property bool enable: true
103+
}
104+
```
105+
106+
**Common adjustments:**
107+
- **Too small?** Increase `scale` (try 0.20 or 0.25)
108+
- **Too big?** Decrease `scale` (try 0.12 or 0.14)
109+
- **More workspaces?** Change `rows` and `columns` (e.g., 3 rows × 4 columns = 12 workspaces)
110+
111+
### Position
112+
113+
Edit `~/.config/quickshell/overview/modules/overview/Overview.qml` (line ~111):
114+
115+
```qml
116+
anchors {
117+
horizontalCenter: parent.horizontalCenter
118+
top: parent.top
119+
topMargin: 100 // Change this value to move up/down
120+
}
121+
```
122+
123+
### Theme & Colors
124+
125+
Edit `~/.config/quickshell/overview/common/Appearance.qml` to customize:
126+
- Colors (m3colors and colors objects)
127+
- Font families and sizes
128+
- Animation curves and durations
129+
- Border radius values
130+
131+
---
132+
133+
## 📋 Requirements
134+
135+
- **Hyprland** compositor (tested on latest versions)
136+
- **Quickshell** (Qt6-based shell framework)
137+
- **Qt 6** with the following modules:
138+
- QtQuick
139+
- QtQuick.Controls
140+
- QtQuick.Layouts
141+
- Qt5Compat.GraphicalEffects
142+
- Quickshell.Wayland
143+
- Quickshell.Hyprland
144+
145+
## 🚫 Removed Features (from original illogical-impulse)
146+
147+
The following features were removed to make it standalone:
148+
149+
- App search functionality
150+
- Emoji picker
151+
- Clipboard history integration
152+
- Search widget
153+
- Integration with the full illogical-impulse shell ecosystem
154+
155+
## 📁 File Structure
156+
157+
```
158+
~/.config/quickshell/overview/
159+
├── shell.qml # Main entry point
160+
├── README.md # This file
161+
├── hyprland-config.conf # Configuration reference
162+
├── common/
163+
│ ├── Appearance.qml # Theme and styling
164+
│ ├── Config.qml # Configuration options
165+
│ ├── functions/
166+
│ │ └── ColorUtils.qml # Color manipulation utilities
167+
│ └── widgets/
168+
│ ├── StyledText.qml # Styled text component
169+
│ ├── StyledRectangularShadow.qml
170+
│ ├── StyledToolTip.qml
171+
│ └── StyledToolTipContent.qml
172+
├── services/
173+
│ ├── GlobalStates.qml # Global state management
174+
│ └── HyprlandData.qml # Hyprland data provider
175+
└── modules/
176+
└── overview/
177+
├── Overview.qml # Main overview component
178+
├── OverviewWidget.qml # Workspace grid widget
179+
└── OverviewWindow.qml # Individual window preview
180+
```
181+
182+
## 🎯 IPC Commands
183+
184+
```bash
185+
# Toggle overview
186+
qs ipc -c overview call overview toggle
187+
188+
# Open overview
189+
qs ipc -c overview call overview open
190+
191+
# Close overview
192+
qs ipc -c overview call overview close
193+
```
194+
195+
## 🐛 Known Issues
196+
197+
- Window icons may fallback to generic icon if app class name doesn't match icon theme
198+
- Potential crashes during rapid window state changes due to Wayland screencopy buffer management
199+
200+
## Credits
201+
202+
Extracted from the overview feature in [illogical-impulse](https://github.com/end-4/dots-hyprland) by [end-4](https://github.com/end-4).
203+
204+
Adapted as a standalone component for Hyprland + Quickshell users who want just the overview functionality.
205+
206+
---
207+
208+
<div align="center">
209+
210+
**Note:** Maintenance will be limited due to time constraints, but **PRs and code improvements are welcome!** Feel free to contribute or fork for your own needs.
211+
212+
Made with ❤️ for the Hyprland community
213+
214+
</div>
1.4 MB
Loading
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
pragma Singleton
2+
pragma ComponentBehavior: Bound
3+
4+
import QtQuick
5+
import Quickshell
6+
import "functions"
7+
8+
Singleton {
9+
id: root
10+
property QtObject m3colors
11+
property QtObject animation
12+
property QtObject animationCurves
13+
property QtObject colors
14+
property QtObject rounding
15+
property QtObject font
16+
property QtObject sizes
17+
18+
m3colors: QtObject {
19+
property bool darkmode: true
20+
property color m3primary: "#E5B6F2"
21+
property color m3onPrimary: "#452152"
22+
property color m3primaryContainer: "#5D386A"
23+
property color m3onPrimaryContainer: "#F9D8FF"
24+
property color m3secondary: "#D5C0D7"
25+
property color m3onSecondary: "#392C3D"
26+
property color m3secondaryContainer: "#534457"
27+
property color m3onSecondaryContainer: "#F2DCF3"
28+
property color m3background: "#161217"
29+
property color m3onBackground: "#EAE0E7"
30+
property color m3surface: "#161217"
31+
property color m3surfaceContainerLow: "#1F1A1F"
32+
property color m3surfaceContainer: "#231E23"
33+
property color m3surfaceContainerHigh: "#2D282E"
34+
property color m3surfaceContainerHighest: "#383339"
35+
property color m3onSurface: "#EAE0E7"
36+
property color m3surfaceVariant: "#4C444D"
37+
property color m3onSurfaceVariant: "#CFC3CD"
38+
property color m3inverseSurface: "#EAE0E7"
39+
property color m3inverseOnSurface: "#342F34"
40+
property color m3outline: "#988E97"
41+
property color m3outlineVariant: "#4C444D"
42+
property color m3shadow: "#000000"
43+
}
44+
45+
colors: QtObject {
46+
property color colSubtext: m3colors.m3outline
47+
property color colLayer0: m3colors.m3background
48+
property color colOnLayer0: m3colors.m3onBackground
49+
property color colLayer0Border: ColorUtils.mix(root.m3colors.m3outlineVariant, colLayer0, 0.4)
50+
property color colLayer1: m3colors.m3surfaceContainerLow
51+
property color colOnLayer1: m3colors.m3onSurfaceVariant
52+
property color colOnLayer1Inactive: ColorUtils.mix(colOnLayer1, colLayer1, 0.45)
53+
property color colLayer1Hover: ColorUtils.mix(colLayer1, colOnLayer1, 0.92)
54+
property color colLayer1Active: ColorUtils.mix(colLayer1, colOnLayer1, 0.85)
55+
property color colLayer2: m3colors.m3surfaceContainer
56+
property color colOnLayer2: m3colors.m3onSurface
57+
property color colLayer2Hover: ColorUtils.mix(colLayer2, colOnLayer2, 0.90)
58+
property color colLayer2Active: ColorUtils.mix(colLayer2, colOnLayer2, 0.80)
59+
property color colPrimary: m3colors.m3primary
60+
property color colOnPrimary: m3colors.m3onPrimary
61+
property color colSecondary: m3colors.m3secondary
62+
property color colSecondaryContainer: m3colors.m3secondaryContainer
63+
property color colOnSecondaryContainer: m3colors.m3onSecondaryContainer
64+
property color colTooltip: m3colors.m3inverseSurface
65+
property color colOnTooltip: m3colors.m3inverseOnSurface
66+
property color colShadow: ColorUtils.transparentize(m3colors.m3shadow, 0.7)
67+
property color colOutline: m3colors.m3outline
68+
}
69+
70+
rounding: QtObject {
71+
property int unsharpen: 2
72+
property int verysmall: 8
73+
property int small: 12
74+
property int normal: 17
75+
property int large: 23
76+
property int full: 9999
77+
property int screenRounding: large
78+
property int windowRounding: 18
79+
}
80+
81+
font: QtObject {
82+
property QtObject family: QtObject {
83+
property string main: "sans-serif"
84+
property string title: "sans-serif"
85+
property string expressive: "sans-serif"
86+
}
87+
property QtObject pixelSize: QtObject {
88+
property int smaller: 12
89+
property int small: 15
90+
property int normal: 16
91+
property int larger: 19
92+
property int huge: 22
93+
}
94+
}
95+
96+
animationCurves: QtObject {
97+
readonly property list<real> expressiveDefaultSpatial: [0.38, 1.21, 0.22, 1.00, 1, 1]
98+
readonly property list<real> expressiveEffects: [0.34, 0.80, 0.34, 1.00, 1, 1]
99+
readonly property list<real> emphasizedDecel: [0.05, 0.7, 0.1, 1, 1, 1]
100+
readonly property real expressiveDefaultSpatialDuration: 500
101+
readonly property real expressiveEffectsDuration: 200
102+
}
103+
104+
animation: QtObject {
105+
property QtObject elementMove: QtObject {
106+
property int duration: animationCurves.expressiveDefaultSpatialDuration
107+
property int type: Easing.BezierSpline
108+
property list<real> bezierCurve: animationCurves.expressiveDefaultSpatial
109+
property Component numberAnimation: Component {
110+
NumberAnimation {
111+
duration: root.animation.elementMove.duration
112+
easing.type: root.animation.elementMove.type
113+
easing.bezierCurve: root.animation.elementMove.bezierCurve
114+
}
115+
}
116+
}
117+
118+
property QtObject elementMoveEnter: QtObject {
119+
property int duration: 400
120+
property int type: Easing.BezierSpline
121+
property list<real> bezierCurve: animationCurves.emphasizedDecel
122+
property Component numberAnimation: Component {
123+
NumberAnimation {
124+
duration: root.animation.elementMoveEnter.duration
125+
easing.type: root.animation.elementMoveEnter.type
126+
easing.bezierCurve: root.animation.elementMoveEnter.bezierCurve
127+
}
128+
}
129+
}
130+
131+
property QtObject elementMoveFast: QtObject {
132+
property int duration: animationCurves.expressiveEffectsDuration
133+
property int type: Easing.BezierSpline
134+
property list<real> bezierCurve: animationCurves.expressiveEffects
135+
property Component numberAnimation: Component {
136+
NumberAnimation {
137+
duration: root.animation.elementMoveFast.duration
138+
easing.type: root.animation.elementMoveFast.type
139+
easing.bezierCurve: root.animation.elementMoveFast.bezierCurve
140+
}
141+
}
142+
}
143+
}
144+
145+
sizes: QtObject {
146+
property real elevationMargin: 10
147+
}
148+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
pragma Singleton
2+
pragma ComponentBehavior: Bound
3+
4+
import QtQuick
5+
import Quickshell
6+
7+
Singleton {
8+
id: root
9+
10+
property QtObject options: QtObject {
11+
property QtObject overview: QtObject {
12+
property int rows: 2
13+
property int columns: 5
14+
property real scale: 0.16
15+
property bool enable: true
16+
}
17+
18+
property QtObject hacks: QtObject {
19+
property int arbitraryRaceConditionDelay: 150
20+
}
21+
}
22+
}

0 commit comments

Comments
 (0)