diff --git a/.github/ISSUE_TEMPLATE/1-issue.yml b/.github/ISSUE_TEMPLATE/1-issue.yml
index 55a1d0f73..481611013 100644
--- a/.github/ISSUE_TEMPLATE/1-issue.yml
+++ b/.github/ISSUE_TEMPLATE/1-issue.yml
@@ -18,7 +18,7 @@ body:
required: false # Not required cuz user may have failed to do so
- label: I've ticked the checkboxes without reading their contents
required: false # Obviously
-
+ # TODO: Use GitHub Action to auto add folding tag if the log contains more than 15 lines, instead of tell user to "paste here" cuz many users actually does not know its meaning (It's also not convenient anyway).
- type: textarea
attributes:
label: "Step 2. Quick diagnose info"
diff --git a/.gitignore b/.gitignore
index cef4d7aab..b59d26bf8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,5 @@ __pycache__/
dots/.config/quickshell/ii/.qmlls.ini
.update-lock
/os-release
+#emacs backup
+*~
diff --git a/diagnose b/diagnose
index a686cab5e..db4a239e0 100755
--- a/diagnose
+++ b/diagnose
@@ -36,7 +36,7 @@ _exec() {
"$@"
err=$?;if [ ! $err -eq 0 ];then echo "[---EXIT $err---]";else echo "[---SUCCESS---]";fi
}
-ii_check_distro_id() {
+_check_distro_id() {
OS_RELEASE_FILE=/etc/os-release
if [[ -f "$OS_RELEASE_FILE" ]]; then
OS_DISTRO_ID=$(awk -F'=' '/^ID=/ { gsub("\"","",$2); print tolower($2) }' ${OS_RELEASE_FILE} 2> /dev/null)
@@ -47,29 +47,30 @@ ii_check_distro_id() {
echo "$OS_RELEASE_FILE does not exist."
fi
}
-ii_check_distro() {
+_check_distro() {
lsb_release -a || cat /etc/os-release || cat /etc/lsb-release
}
-ii_check_venv() {
+_check_venv() {
source $(eval echo $ILLOGICAL_IMPULSE_VIRTUAL_ENV)/bin/activate
which python
deactivate
}
-ii_check_quickshell_version() {
+_check_quickshell_version() {
pacman -Q | grep -E 'quickshell|qt6-base'
}
-ii_check_PKGBUILD_version() {
+_check_PKGBUILD_version() {
pacman -Q | grep '^illogical-impulse-'
}
e "Checking git repo info"
x git remote get-url origin
x git rev-parse HEAD
+x git status
x git submodule status --recursive
e "Checking distro"
-x ii_check_distro_id
-#x ii_check_distro
+x _check_distro_id
+#x _check_distro
e "Checking variables"
x declare -p XDG_CACHE_HOME # ~/.cache
@@ -90,8 +91,8 @@ x ls -l ~/.local/state/quickshell/.venv
e "Checking versions"
x Hyprland --version
-x ii_check_quickshell_version
-x ii_check_PKGBUILD_version
+x _check_quickshell_version
+x _check_PKGBUILD_version
e "Finished. Output saved as \"$output_file\"."
if ! command -v curl 2>&1 >>/dev/null ;then echo "\"curl\" not found, pastebin upload unavailable.";exit;fi
diff --git a/dots-extra/vianix/README.md b/dots-extra/via-nix/README.md
similarity index 100%
rename from dots-extra/vianix/README.md
rename to dots-extra/via-nix/README.md
diff --git a/dots-extra/vianix/hypridle.conf b/dots-extra/via-nix/hypridle.conf
similarity index 100%
rename from dots-extra/vianix/hypridle.conf
rename to dots-extra/via-nix/hypridle.conf
diff --git a/dots/.config/hypr/hyprland/execs.conf b/dots/.config/hypr/hyprland/execs.conf
index e4f33f6aa..4bb9c86e5 100644
--- a/dots/.config/hypr/hyprland/execs.conf
+++ b/dots/.config/hypr/hyprland/execs.conf
@@ -1,6 +1,7 @@
# Bar, wallpaper
exec-once = ~/.config/hypr/hyprland/scripts/start_geoclue_agent.sh
exec-once = qs -c $qsConfig &
+exec-once = ~/.config/hypr/custom/scripts/__restore_video_wallpaper.sh
# Input method
# exec-once = fcitx5
@@ -24,4 +25,5 @@ exec-once = wl-paste --type image --watch bash -c 'cliphist store && qs -c $qsCo
exec-once = hyprctl setcursor Bibata-Modern-Classic 24
# Fix dock pinned apps not launching properly (https://github.com/end-4/dots-hyprland/issues/2200)
-exec-once = sleep 3.5 && hyprctl reload && sleep 0.5 && touch ~/.config/quickshell/ii/shell.qml
+# This causes https://github.com/end-4/dots-hyprland/issues/2427
+# exec-once = sleep 3.5 && hyprctl reload && sleep 0.5 && touch ~/.config/quickshell/ii/shell.qml
diff --git a/dots/.config/hypr/hyprland/general.conf b/dots/.config/hypr/hyprland/general.conf
index 2c79a857f..14074b345 100644
--- a/dots/.config/hypr/hyprland/general.conf
+++ b/dots/.config/hypr/hyprland/general.conf
@@ -6,8 +6,8 @@ monitor=,preferred,auto,1
# monitor=HDMI-A-1,1920x1080@60,1920x0,1,mirror,eDP-1
gesture = 3, swipe, move,
+gesture = 3, pinch, float
gesture = 4, horizontal, workspace
-gesture = 4, pinch, float
gesture = 4, up, dispatcher, global, quickshell:overviewToggle
gesture = 4, down, dispatcher, global, quickshell:overviewClose
gestures {
@@ -62,7 +62,7 @@ decoration {
brightness = 1
noise = 0.04
contrast = 1
- popups = true
+ popups = false
popups_ignorealpha = 0.6
input_methods = true
input_methods_ignorealpha = 0.8
diff --git a/dots/.config/hypr/hyprland/keybinds.conf b/dots/.config/hypr/hyprland/keybinds.conf
index 294854d67..fdda9a714 100644
--- a/dots/.config/hypr/hyprland/keybinds.conf
+++ b/dots/.config/hypr/hyprland/keybinds.conf
@@ -53,6 +53,7 @@ bindd = Ctrl+Super, T, Toggle wallpaper selector, global, quickshell:wallpaperSe
bindd = Ctrl+Super+Alt, T, Select random wallpaper, global, quickshell:wallpaperSelectorRandom # Random wallpaper
bindd = Ctrl+Super, T, Change wallpaper, exec, qs -c $qsConfig ipc call TEST_ALIVE || ~/.config/quickshell/$qsConfig/scripts/colors/switchwall.sh # [hidden] Change wallpaper (fallback)
bind = Ctrl+Super, R, exec, killall ags agsv1 gjs ydotool qs quickshell; qs -c $qsConfig & # Restart widgets
+bind = Super+Alt, W, global, quickshell:panelFamilyCycle # Cycle panel family
##! Utilities
# Screenshot, Record, OCR, Color picker, Clipboard history
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/README.md b/dots/.config/quickshell/ii/assets/icons/fluent/README.md
new file mode 100644
index 000000000..5f4d3eaa2
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/README.md
@@ -0,0 +1,5 @@
+The "search" and "task view" icons are from here, with modifications
+
+https://www.figma.com/community/file/1123040825921884189/windows-11
+
+License: CC BY 4.0
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/battery-0.svg b/dots/.config/quickshell/ii/assets/icons/fluent/battery-0.svg
new file mode 100644
index 000000000..7fe9d7a3d
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/battery-0.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/battery-1.svg b/dots/.config/quickshell/ii/assets/icons/fluent/battery-1.svg
new file mode 100644
index 000000000..caa369c58
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/battery-1.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/battery-2.svg b/dots/.config/quickshell/ii/assets/icons/fluent/battery-2.svg
new file mode 100644
index 000000000..b939043ea
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/battery-2.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/battery-3.svg b/dots/.config/quickshell/ii/assets/icons/fluent/battery-3.svg
new file mode 100644
index 000000000..a504a1ed5
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/battery-3.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/battery-4.svg b/dots/.config/quickshell/ii/assets/icons/fluent/battery-4.svg
new file mode 100644
index 000000000..6567ddf10
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/battery-4.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/battery-5.svg b/dots/.config/quickshell/ii/assets/icons/fluent/battery-5.svg
new file mode 100644
index 000000000..1bf4d914f
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/battery-5.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/battery-6.svg b/dots/.config/quickshell/ii/assets/icons/fluent/battery-6.svg
new file mode 100644
index 000000000..145d9a7de
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/battery-6.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/battery-7.svg b/dots/.config/quickshell/ii/assets/icons/fluent/battery-7.svg
new file mode 100644
index 000000000..a5197ce94
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/battery-7.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/battery-8.svg b/dots/.config/quickshell/ii/assets/icons/fluent/battery-8.svg
new file mode 100644
index 000000000..c83bc5fb6
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/battery-8.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/battery-9.svg b/dots/.config/quickshell/ii/assets/icons/fluent/battery-9.svg
new file mode 100644
index 000000000..7f4937b99
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/battery-9.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/battery-charge.svg b/dots/.config/quickshell/ii/assets/icons/fluent/battery-charge.svg
new file mode 100644
index 000000000..512a78b1b
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/battery-charge.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/battery-full.svg b/dots/.config/quickshell/ii/assets/icons/fluent/battery-full.svg
new file mode 100644
index 000000000..4749fc178
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/battery-full.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/battery-saver.svg b/dots/.config/quickshell/ii/assets/icons/fluent/battery-saver.svg
new file mode 100644
index 000000000..397061caf
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/battery-saver.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/battery-warning.svg b/dots/.config/quickshell/ii/assets/icons/fluent/battery-warning.svg
new file mode 100644
index 000000000..7ccade277
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/battery-warning.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/bluetooth-connected.svg b/dots/.config/quickshell/ii/assets/icons/fluent/bluetooth-connected.svg
new file mode 100644
index 000000000..b491276df
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/bluetooth-connected.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/bluetooth-searching.svg b/dots/.config/quickshell/ii/assets/icons/fluent/bluetooth-searching.svg
new file mode 100644
index 000000000..e0d9eab70
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/bluetooth-searching.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/dismiss.svg b/dots/.config/quickshell/ii/assets/icons/fluent/dismiss.svg
new file mode 100644
index 000000000..3cb3656dc
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/dismiss.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/ethernet.svg b/dots/.config/quickshell/ii/assets/icons/fluent/ethernet.svg
new file mode 100644
index 000000000..904d9720e
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/ethernet.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/mic-on.svg b/dots/.config/quickshell/ii/assets/icons/fluent/mic-on.svg
new file mode 100644
index 000000000..3f680d2e3
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/mic-on.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/speaker-0.svg b/dots/.config/quickshell/ii/assets/icons/fluent/speaker-0.svg
new file mode 100644
index 000000000..0ff116afd
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/speaker-0.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/speaker-1.svg b/dots/.config/quickshell/ii/assets/icons/fluent/speaker-1.svg
new file mode 100644
index 000000000..eff9b6d0c
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/speaker-1.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/speaker-none.svg b/dots/.config/quickshell/ii/assets/icons/fluent/speaker-none.svg
new file mode 100644
index 000000000..364af84cb
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/speaker-none.svg
@@ -0,0 +1,5 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/speaker-off.svg b/dots/.config/quickshell/ii/assets/icons/fluent/speaker-off.svg
new file mode 100644
index 000000000..5fa19e406
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/speaker-off.svg
@@ -0,0 +1,7 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/speaker.svg b/dots/.config/quickshell/ii/assets/icons/fluent/speaker.svg
new file mode 100644
index 000000000..477b04792
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/speaker.svg
@@ -0,0 +1,6 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/system-search-dark.svg b/dots/.config/quickshell/ii/assets/icons/fluent/system-search-dark.svg
new file mode 100644
index 000000000..2d972a7b4
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/system-search-dark.svg
@@ -0,0 +1,82 @@
+
+
+
+
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/system-search-light.svg b/dots/.config/quickshell/ii/assets/icons/fluent/system-search-light.svg
new file mode 100644
index 000000000..b22f9c0ca
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/system-search-light.svg
@@ -0,0 +1,82 @@
+
+
+
+
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/task-view-dark.svg b/dots/.config/quickshell/ii/assets/icons/fluent/task-view-dark.svg
new file mode 100644
index 000000000..d38c927c8
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/task-view-dark.svg
@@ -0,0 +1,128 @@
+
+
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/task-view-light.svg b/dots/.config/quickshell/ii/assets/icons/fluent/task-view-light.svg
new file mode 100644
index 000000000..1f37c4aa4
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/task-view-light.svg
@@ -0,0 +1,104 @@
+
+
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/widgets.svg b/dots/.config/quickshell/ii/assets/icons/fluent/widgets.svg
new file mode 100644
index 000000000..0989033a7
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/widgets.svg
@@ -0,0 +1,92 @@
+
+
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/wifi-1.svg b/dots/.config/quickshell/ii/assets/icons/fluent/wifi-1.svg
new file mode 100644
index 000000000..47662e101
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/wifi-1.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/wifi-2.svg b/dots/.config/quickshell/ii/assets/icons/fluent/wifi-2.svg
new file mode 100644
index 000000000..9897c5d70
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/wifi-2.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/wifi-3.svg b/dots/.config/quickshell/ii/assets/icons/fluent/wifi-3.svg
new file mode 100644
index 000000000..8a4674bd4
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/wifi-3.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/wifi-4.svg b/dots/.config/quickshell/ii/assets/icons/fluent/wifi-4.svg
new file mode 100644
index 000000000..f14828bd8
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/wifi-4.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/wifi-off.svg b/dots/.config/quickshell/ii/assets/icons/fluent/wifi-off.svg
new file mode 100644
index 000000000..3c247ab12
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/wifi-off.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/wifi-warning.svg b/dots/.config/quickshell/ii/assets/icons/fluent/wifi-warning.svg
new file mode 100644
index 000000000..d573ddde0
--- /dev/null
+++ b/dots/.config/quickshell/ii/assets/icons/fluent/wifi-warning.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/dots/.config/quickshell/ii/modules/common/Config.qml b/dots/.config/quickshell/ii/modules/common/Config.qml
index 0ceb7dd1b..a724c043d 100644
--- a/dots/.config/quickshell/ii/modules/common/Config.qml
+++ b/dots/.config/quickshell/ii/modules/common/Config.qml
@@ -76,6 +76,12 @@ Singleton {
JsonAdapter {
id: configOptionsJsonAdapter
+
+ property list enabledPanels: [
+ "iiBar", "iiBackground", "iiCheatsheet", "iiDock", "iiLock", "iiMediaControls", "iiNotificationPopup", "iiOnScreenDisplay", "iiOnScreenKeyboard", "iiOverlay", "iiOverview", "iiPolkit", "iiRegionSelector", "iiReloadPopup", "iiScreenCorners", "iiSessionScreen", "iiSidebarLeft", "iiSidebarRight", "iiVerticalBar", "iiWallpaperSelector"
+ ]
+ property string panelFamily: "ii" // "ii", "w"
+
property JsonObject policies: JsonObject {
property int ai: 1 // 0: No | 1: Yes | 2: Local
property int weeb: 1 // 0: No | 1: Open | 2: Closet
@@ -148,6 +154,7 @@ Singleton {
property JsonObject widgets: JsonObject {
property JsonObject clock: JsonObject {
property bool enable: true
+ property bool showOnlyWhenLocked: false
property string placementStrategy: "leastBusy" // "free", "leastBusy", "mostBusy"
property real x: 100
property real y: 100
@@ -274,7 +281,7 @@ Singleton {
// 10: | 11: | 12: | 13: | 14:
property string superKey: ""
property bool useMacSymbol: false
- property bool splitButtons: true
+ property bool splitButtons: false
property bool useMouseSymbol: false
property bool useFnSymbol: false
property JsonObject fontSize: JsonObject {
@@ -380,7 +387,11 @@ Singleton {
property JsonObject overlay: JsonObject {
property bool openingZoomAnimation: true
property bool darkenScreen: true
- property real clickthroughOpacity: 0.7
+ property real clickthroughOpacity: 0.8
+ property JsonObject floatingImage: JsonObject {
+ property string imageSource: "https://media.tenor.com/H5U5bJzj3oAAAAAi/kukuru.gif"
+ property real scale: 0.5
+ }
}
property JsonObject overview: JsonObject {
@@ -511,6 +522,7 @@ Singleton {
// https://doc.qt.io/qt-6/qtime.html#toString
property string format: "hh:mm"
property string shortDateFormat: "dd/MM"
+ property string dateWithYearFormat: "dd/MM/yyyy"
property string dateFormat: "ddd, dd/MM"
property JsonObject pomodoro: JsonObject {
property int breakTime: 300
@@ -545,6 +557,13 @@ Singleton {
property list linkKeywords: ["hentai", "porn", "sukebei", "hitomi.la", "rule34", "gelbooru", "fanbox", "dlsite"]
}
}
+
+ property JsonObject waffles: JsonObject {
+ property JsonObject bar: JsonObject {
+ property bool bottom: true
+ property bool leftAlignApps: false
+ }
+ }
}
}
}
diff --git a/dots/.config/quickshell/ii/modules/common/Directories.qml b/dots/.config/quickshell/ii/modules/common/Directories.qml
index fa25fedba..04b205baf 100644
--- a/dots/.config/quickshell/ii/modules/common/Directories.qml
+++ b/dots/.config/quickshell/ii/modules/common/Directories.qml
@@ -24,6 +24,7 @@ Singleton {
property string scriptPath: Quickshell.shellPath("scripts")
property string favicons: FileUtils.trimFileProtocol(`${Directories.cache}/media/favicons`)
property string coverArt: FileUtils.trimFileProtocol(`${Directories.cache}/media/coverart`)
+ property string tempImages: "/tmp/quickshell/media/images"
property string booruPreviews: FileUtils.trimFileProtocol(`${Directories.cache}/media/boorus`)
property string booruDownloads: FileUtils.trimFileProtocol(Directories.pictures + "/homework")
property string booruDownloadsNsfw: FileUtils.trimFileProtocol(Directories.pictures + "/homework/🌶️")
@@ -54,5 +55,6 @@ Singleton {
Quickshell.execDetached(["bash", "-c", `rm -rf '${latexOutput}'; mkdir -p '${latexOutput}'`])
Quickshell.execDetached(["bash", "-c", `rm -rf '${cliphistDecode}'; mkdir -p '${cliphistDecode}'`])
Quickshell.execDetached(["mkdir", "-p", `${aiChats}`])
+ Quickshell.execDetached(["rm", "-rf", `${tempImages}`])
}
}
diff --git a/dots/.config/quickshell/ii/modules/common/Persistent.qml b/dots/.config/quickshell/ii/modules/common/Persistent.qml
index afa554d26..5774912a2 100644
--- a/dots/.config/quickshell/ii/modules/common/Persistent.qml
+++ b/dots/.config/quickshell/ii/modules/common/Persistent.qml
@@ -89,6 +89,22 @@ Singleton {
property real width: 250
property real height: 100
}
+ property JsonObject floatingImage: JsonObject {
+ property bool pinned: false
+ property bool clickthrough: false
+ property real x: 1650
+ property real y: 390
+ property real width: 0
+ property real height: 0
+ }
+ property JsonObject fpsLimiter: JsonObject {
+ property bool pinned: false
+ property bool clickthrough: false
+ property real x: 1570
+ property real y: 615
+ property real width: 280
+ property real height: 80
+ }
property JsonObject recorder: JsonObject {
property bool pinned: false
property bool clickthrough: false
@@ -115,14 +131,6 @@ Singleton {
property real height: 600
property int tabIndex: 0
}
- property JsonObject fpsLimiter: JsonObject {
- property bool pinned: false
- property bool clickthrough: false
- property real x: 1576
- property real y: 630
- property real width: 280
- property real height: 80
- }
property JsonObject stickypad: JsonObject {
property bool pinned: true
property bool clickthrough: false
diff --git a/dots/.config/quickshell/ii/modules/common/utils/ImageDownloaderProcess.qml b/dots/.config/quickshell/ii/modules/common/utils/ImageDownloaderProcess.qml
new file mode 100644
index 000000000..11ff92a6d
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/common/utils/ImageDownloaderProcess.qml
@@ -0,0 +1,31 @@
+import QtQuick
+import Quickshell
+import Quickshell.Io
+import qs.modules.common
+import qs.modules.common.functions
+
+Process {
+ id: root
+
+ signal done(string path, int width, int height);
+ required property string filePath;
+ required property string sourceUrl;
+ property string downloadUserAgent: Config.options?.networking.userAgent ?? ""
+
+ function processFilePath() {
+ return StringUtils.shellSingleQuoteEscape(FileUtils.trimFileProtocol(filePath));
+ }
+
+ running: true
+ command: ["bash", "-c",
+ `mkdir -p $(dirname '${processFilePath(filePath)}'); [ -f '${processFilePath(filePath)}' ] || curl -sSL '${sourceUrl}' -o '${processFilePath(filePath)}' && magick identify -format '%w %h' '${processFilePath(filePath)}'[0]`
+ ]
+ stdout: StdioCollector {
+ id: imageSizeOutputCollector
+ onStreamFinished: {
+ const output = imageSizeOutputCollector.text.trim();
+ const [width, height] = output.split(" ").map(Number);
+ root.done(root.filePath, width, height);
+ }
+ }
+}
diff --git a/dots/.config/quickshell/ii/modules/common/widgets/ConfigSwitch.qml b/dots/.config/quickshell/ii/modules/common/widgets/ConfigSwitch.qml
index 02e0eabad..53e6a27c0 100644
--- a/dots/.config/quickshell/ii/modules/common/widgets/ConfigSwitch.qml
+++ b/dots/.config/quickshell/ii/modules/common/widgets/ConfigSwitch.qml
@@ -34,7 +34,6 @@ RippleButton {
StyledSwitch {
id: switchWidget
down: root.down
- scale: 0.6
Layout.fillWidth: false
checked: root.checked
onClicked: root.clicked()
diff --git a/dots/.config/quickshell/ii/modules/common/widgets/PopupToolTip.qml b/dots/.config/quickshell/ii/modules/common/widgets/PopupToolTip.qml
index 741b4556c..bc72ee416 100644
--- a/dots/.config/quickshell/ii/modules/common/widgets/PopupToolTip.qml
+++ b/dots/.config/quickshell/ii/modules/common/widgets/PopupToolTip.qml
@@ -1,3 +1,4 @@
+pragma ComponentBehavior: Bound
import qs.modules.common
import qs.modules.common.widgets
import QtQuick
@@ -13,15 +14,24 @@ Item {
property real horizontalPadding: 10
property real verticalPadding: 5
+ readonly property bool internalVisibleCondition: (extraVisibleCondition && (parent.hovered === undefined || parent?.hovered)) || alternativeVisibleCondition
property var anchorEdges: Edges.Top
property var anchorGravity: anchorEdges
- readonly property bool internalVisibleCondition: (extraVisibleCondition && (parent.hovered === undefined || parent?.hovered)) || alternativeVisibleCondition
+ property Item contentItem: StyledToolTipContent {
+ id: contentItem
+ anchors.centerIn: parent
+ text: root.text
+ shown: false
+ Component.onCompleted: shown = true
+ horizontalPadding: root.horizontalPadding
+ verticalPadding: root.verticalPadding
+ }
Loader {
id: tooltipLoader
anchors.fill: parent
- active: internalVisibleCondition
+ active: root.internalVisibleCondition
sourceComponent: PopupWindow {
visible: true
anchor {
@@ -35,18 +45,10 @@ Item {
}
color: "transparent"
- implicitWidth: contentItem.implicitWidth + root.horizontalPadding * 2
- implicitHeight: contentItem.implicitHeight + root.verticalPadding * 2
+ implicitWidth: root.contentItem.implicitWidth + root.horizontalPadding * 2
+ implicitHeight: root.contentItem.implicitHeight + root.verticalPadding * 2
- StyledToolTipContent {
- id: contentItem
- anchors.centerIn: parent
- text: root.text
- shown: false
- Component.onCompleted: shown = true
- horizontalPadding: root.horizontalPadding
- verticalPadding: root.verticalPadding
- }
+ data: [root.contentItem]
}
}
}
diff --git a/dots/.config/quickshell/ii/modules/common/widgets/StyledSwitch.qml b/dots/.config/quickshell/ii/modules/common/widgets/StyledSwitch.qml
index 56c1425d9..c701ff7cf 100644
--- a/dots/.config/quickshell/ii/modules/common/widgets/StyledSwitch.qml
+++ b/dots/.config/quickshell/ii/modules/common/widgets/StyledSwitch.qml
@@ -9,7 +9,7 @@ import Qt5Compat.GraphicalEffects
*/
Switch {
id: root
- property real scale: 0.6 // Default in m3 spec is huge af
+ property real scale: 0.75 // Default in m3 spec is huge af
implicitHeight: 32 * root.scale
implicitWidth: 52 * root.scale
property color activeColor: Appearance?.colors.colPrimary ?? "#685496"
diff --git a/dots/.config/quickshell/ii/modules/background/Background.qml b/dots/.config/quickshell/ii/modules/ii/background/Background.qml
similarity index 99%
rename from dots/.config/quickshell/ii/modules/background/Background.qml
rename to dots/.config/quickshell/ii/modules/ii/background/Background.qml
index bb0e1a42f..68d8b1698 100644
--- a/dots/.config/quickshell/ii/modules/background/Background.qml
+++ b/dots/.config/quickshell/ii/modules/ii/background/Background.qml
@@ -14,9 +14,9 @@ import Quickshell.Io
import Quickshell.Wayland
import Quickshell.Hyprland
-import qs.modules.background.widgets
-import qs.modules.background.widgets.clock
-import qs.modules.background.widgets.weather
+import qs.modules.ii.background.widgets
+import qs.modules.ii.background.widgets.clock
+import qs.modules.ii.background.widgets.weather
Variants {
id: root
diff --git a/dots/.config/quickshell/ii/modules/background/widgets/AbstractBackgroundWidget.qml b/dots/.config/quickshell/ii/modules/ii/background/widgets/AbstractBackgroundWidget.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/background/widgets/AbstractBackgroundWidget.qml
rename to dots/.config/quickshell/ii/modules/ii/background/widgets/AbstractBackgroundWidget.qml
diff --git a/dots/.config/quickshell/ii/modules/background/widgets/clock/ClockWidget.qml b/dots/.config/quickshell/ii/modules/ii/background/widgets/clock/ClockWidget.qml
similarity index 62%
rename from dots/.config/quickshell/ii/modules/background/widgets/clock/ClockWidget.qml
rename to dots/.config/quickshell/ii/modules/ii/background/widgets/clock/ClockWidget.qml
index 84cc7e01b..6d636be89 100644
--- a/dots/.config/quickshell/ii/modules/background/widgets/clock/ClockWidget.qml
+++ b/dots/.config/quickshell/ii/modules/ii/background/widgets/clock/ClockWidget.qml
@@ -6,7 +6,7 @@ import qs.modules.common
import qs.modules.common.functions
import qs.modules.common.widgets
import qs.modules.common.widgets.widgetCanvas
-import qs.modules.background.widgets
+import qs.modules.ii.background.widgets
AbstractBackgroundWidget {
id: root
@@ -16,8 +16,9 @@ AbstractBackgroundWidget {
implicitHeight: contentColumn.implicitHeight
implicitWidth: contentColumn.implicitWidth
- property string clockStyle: Config.options.background.widgets.clock.style
- property bool forceCenter: (GlobalStates.screenLocked && Config.options.lock.centerClock)
+ readonly property string clockStyle: Config.options.background.widgets.clock.style
+ readonly property bool forceCenter: (GlobalStates.screenLocked && Config.options.lock.centerClock)
+ readonly property bool shouldShow: (!Config.options.background.widgets.clock.showOnlyWhenLocked || GlobalStates.screenLocked)
property bool wallpaperSafetyTriggered: false
needsColText: clockStyle === "digital"
x: forceCenter ? ((root.screenWidth - root.width) / 2) : targetX
@@ -37,13 +38,14 @@ AbstractBackgroundWidget {
Column {
id: contentColumn
anchors.centerIn: parent
- spacing: 6
+ spacing: 10
FadeLoader {
id: cookieClockLoader
anchors.horizontalCenter: parent.horizontalCenter
- shown: root.clockStyle === "cookie"
+ shown: root.clockStyle === "cookie" && (root.shouldShow)
sourceComponent: Column {
+ spacing: 10
CookieClock {
anchors.horizontalCenter: parent.horizontalCenter
}
@@ -58,7 +60,7 @@ AbstractBackgroundWidget {
FadeLoader {
id: digitalClockLoader
anchors.horizontalCenter: parent.horizontalCenter
- shown: root.clockStyle === "digital"
+ shown: root.clockStyle === "digital" && (root.shouldShow)
sourceComponent: ColumnLayout {
id: clockColumn
spacing: 6
@@ -69,7 +71,7 @@ AbstractBackgroundWidget {
}
ClockText {
Layout.topMargin: -5
- text: DateTime.date
+ text: DateTime.longDate
}
StyledText {
// Somehow gets fucked up if made a ClockText???
@@ -87,61 +89,64 @@ AbstractBackgroundWidget {
}
}
}
- Item {
- id: statusText
+ StatusRow {
anchors.horizontalCenter: parent.horizontalCenter
- implicitHeight: statusTextBg.implicitHeight
- implicitWidth: statusTextBg.implicitWidth
- StyledRectangularShadow {
- target: statusTextBg
- visible: statusTextBg.visible && root.clockStyle === "cookie"
- opacity: statusTextBg.opacity
+ }
+ }
+
+ component StatusRow: Item {
+ id: statusText
+ implicitHeight: statusTextBg.implicitHeight
+ implicitWidth: statusTextBg.implicitWidth
+ StyledRectangularShadow {
+ target: statusTextBg
+ visible: statusTextBg.visible && root.clockStyle === "cookie"
+ opacity: statusTextBg.opacity
+ }
+ Rectangle {
+ id: statusTextBg
+ anchors.centerIn: parent
+ clip: true
+ opacity: (safetyStatusText.shown || lockStatusText.shown) ? 1 : 0
+ visible: opacity > 0
+ implicitHeight: statusTextRow.implicitHeight + 5 * 2
+ implicitWidth: statusTextRow.implicitWidth + 5 * 2
+ radius: Appearance.rounding.small
+ color: ColorUtils.transparentize(Appearance.colors.colSecondaryContainer, root.clockStyle === "cookie" ? 0 : 1)
+
+ Behavior on implicitWidth {
+ animation: Appearance.animation.elementResize.numberAnimation.createObject(this)
}
- Rectangle {
- id: statusTextBg
+ Behavior on implicitHeight {
+ animation: Appearance.animation.elementResize.numberAnimation.createObject(this)
+ }
+ Behavior on opacity {
+ animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
+ }
+
+ RowLayout {
+ id: statusTextRow
anchors.centerIn: parent
- clip: true
- opacity: (safetyStatusText.shown || lockStatusText.shown) ? 1 : 0
- visible: opacity > 0
- implicitHeight: statusTextRow.implicitHeight + 5 * 2
- implicitWidth: statusTextRow.implicitWidth + 5 * 2
- radius: Appearance.rounding.small
- color: ColorUtils.transparentize(Appearance.colors.colSecondaryContainer, root.clockStyle === "cookie" ? 0 : 1)
-
- Behavior on implicitWidth {
- animation: Appearance.animation.elementResize.numberAnimation.createObject(this)
+ spacing: 14
+ Item {
+ Layout.fillWidth: root.textHorizontalAlignment !== Text.AlignLeft
+ implicitWidth: 1
}
- Behavior on implicitHeight {
- animation: Appearance.animation.elementResize.numberAnimation.createObject(this)
+ ClockStatusText {
+ id: safetyStatusText
+ shown: root.wallpaperSafetyTriggered
+ statusIcon: "hide_image"
+ statusText: Translation.tr("Wallpaper safety enforced")
}
- Behavior on opacity {
- animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
+ ClockStatusText {
+ id: lockStatusText
+ shown: GlobalStates.screenLocked && Config.options.lock.showLockedText
+ statusIcon: "lock"
+ statusText: Translation.tr("Locked")
}
-
- RowLayout {
- id: statusTextRow
- anchors.centerIn: parent
- spacing: 14
- Item {
- Layout.fillWidth: root.textHorizontalAlignment !== Text.AlignLeft
- implicitWidth: 1
- }
- ClockStatusText {
- id: safetyStatusText
- shown: root.wallpaperSafetyTriggered
- statusIcon: "hide_image"
- statusText: Translation.tr("Wallpaper safety enforced")
- }
- ClockStatusText {
- id: lockStatusText
- shown: GlobalStates.screenLocked && Config.options.lock.showLockedText
- statusIcon: "lock"
- statusText: Translation.tr("Locked")
- }
- Item {
- Layout.fillWidth: root.textHorizontalAlignment !== Text.AlignRight
- implicitWidth: 1
- }
+ Item {
+ Layout.fillWidth: root.textHorizontalAlignment !== Text.AlignRight
+ implicitWidth: 1
}
}
}
diff --git a/dots/.config/quickshell/ii/modules/background/widgets/clock/CookieClock.qml b/dots/.config/quickshell/ii/modules/ii/background/widgets/clock/CookieClock.qml
similarity index 98%
rename from dots/.config/quickshell/ii/modules/background/widgets/clock/CookieClock.qml
rename to dots/.config/quickshell/ii/modules/ii/background/widgets/clock/CookieClock.qml
index 1284e4299..7eaa04b98 100644
--- a/dots/.config/quickshell/ii/modules/background/widgets/clock/CookieClock.qml
+++ b/dots/.config/quickshell/ii/modules/ii/background/widgets/clock/CookieClock.qml
@@ -9,8 +9,8 @@ import QtQuick.Layouts
import Qt5Compat.GraphicalEffects
import Quickshell.Io
-import qs.modules.background.widgets.clock.dateIndicator
-import qs.modules.background.widgets.clock.minuteMarks
+import qs.modules.ii.background.widgets.clock.dateIndicator
+import qs.modules.ii.background.widgets.clock.minuteMarks
Item {
id: root
diff --git a/dots/.config/quickshell/ii/modules/background/widgets/clock/CookieQuote.qml b/dots/.config/quickshell/ii/modules/ii/background/widgets/clock/CookieQuote.qml
similarity index 87%
rename from dots/.config/quickshell/ii/modules/background/widgets/clock/CookieQuote.qml
rename to dots/.config/quickshell/ii/modules/ii/background/widgets/clock/CookieQuote.qml
index 19567aeb4..895926465 100644
--- a/dots/.config/quickshell/ii/modules/background/widgets/clock/CookieQuote.qml
+++ b/dots/.config/quickshell/ii/modules/ii/background/widgets/clock/CookieQuote.qml
@@ -12,9 +12,6 @@ Item {
implicitWidth: quoteBox.implicitWidth
implicitHeight: quoteBox.implicitHeight
- anchors.bottom: parent.bottom
- anchors.bottomMargin: -24
-
DropShadow {
source: quoteBox
anchors.fill: quoteBox
@@ -29,14 +26,16 @@ Item {
Rectangle {
id: quoteBox
- implicitWidth: quoteStyledText.width + quoteIcon.width + 16 // for spacing on both sides
- implicitHeight: quoteStyledText.height + 8
+ implicitWidth: quoteRow.implicitWidth + 8 * 2
+ implicitHeight: quoteRow.implicitHeight + 4 * 2
radius: Appearance.rounding.small
color: Appearance.colors.colSecondaryContainer
Row {
+ id: quoteRow
anchors.centerIn: parent
spacing: 4
+
MaterialSymbol {
id: quoteIcon
anchors.top: parent.top
@@ -57,4 +56,4 @@ Item {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/dots/.config/quickshell/ii/modules/background/widgets/clock/HourHand.qml b/dots/.config/quickshell/ii/modules/ii/background/widgets/clock/HourHand.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/background/widgets/clock/HourHand.qml
rename to dots/.config/quickshell/ii/modules/ii/background/widgets/clock/HourHand.qml
diff --git a/dots/.config/quickshell/ii/modules/background/widgets/clock/HourMarks.qml b/dots/.config/quickshell/ii/modules/ii/background/widgets/clock/HourMarks.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/background/widgets/clock/HourMarks.qml
rename to dots/.config/quickshell/ii/modules/ii/background/widgets/clock/HourMarks.qml
diff --git a/dots/.config/quickshell/ii/modules/background/widgets/clock/MinuteHand.qml b/dots/.config/quickshell/ii/modules/ii/background/widgets/clock/MinuteHand.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/background/widgets/clock/MinuteHand.qml
rename to dots/.config/quickshell/ii/modules/ii/background/widgets/clock/MinuteHand.qml
diff --git a/dots/.config/quickshell/ii/modules/background/widgets/clock/SecondHand.qml b/dots/.config/quickshell/ii/modules/ii/background/widgets/clock/SecondHand.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/background/widgets/clock/SecondHand.qml
rename to dots/.config/quickshell/ii/modules/ii/background/widgets/clock/SecondHand.qml
diff --git a/dots/.config/quickshell/ii/modules/background/widgets/clock/TimeColumn.qml b/dots/.config/quickshell/ii/modules/ii/background/widgets/clock/TimeColumn.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/background/widgets/clock/TimeColumn.qml
rename to dots/.config/quickshell/ii/modules/ii/background/widgets/clock/TimeColumn.qml
diff --git a/dots/.config/quickshell/ii/modules/background/widgets/clock/dateIndicator/BubbleDate.qml b/dots/.config/quickshell/ii/modules/ii/background/widgets/clock/dateIndicator/BubbleDate.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/background/widgets/clock/dateIndicator/BubbleDate.qml
rename to dots/.config/quickshell/ii/modules/ii/background/widgets/clock/dateIndicator/BubbleDate.qml
diff --git a/dots/.config/quickshell/ii/modules/background/widgets/clock/dateIndicator/DateIndicator.qml b/dots/.config/quickshell/ii/modules/ii/background/widgets/clock/dateIndicator/DateIndicator.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/background/widgets/clock/dateIndicator/DateIndicator.qml
rename to dots/.config/quickshell/ii/modules/ii/background/widgets/clock/dateIndicator/DateIndicator.qml
diff --git a/dots/.config/quickshell/ii/modules/background/widgets/clock/dateIndicator/RectangleDate.qml b/dots/.config/quickshell/ii/modules/ii/background/widgets/clock/dateIndicator/RectangleDate.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/background/widgets/clock/dateIndicator/RectangleDate.qml
rename to dots/.config/quickshell/ii/modules/ii/background/widgets/clock/dateIndicator/RectangleDate.qml
diff --git a/dots/.config/quickshell/ii/modules/background/widgets/clock/dateIndicator/RotatingDate.qml b/dots/.config/quickshell/ii/modules/ii/background/widgets/clock/dateIndicator/RotatingDate.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/background/widgets/clock/dateIndicator/RotatingDate.qml
rename to dots/.config/quickshell/ii/modules/ii/background/widgets/clock/dateIndicator/RotatingDate.qml
diff --git a/dots/.config/quickshell/ii/modules/background/widgets/clock/minuteMarks/BigHourNumbers.qml b/dots/.config/quickshell/ii/modules/ii/background/widgets/clock/minuteMarks/BigHourNumbers.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/background/widgets/clock/minuteMarks/BigHourNumbers.qml
rename to dots/.config/quickshell/ii/modules/ii/background/widgets/clock/minuteMarks/BigHourNumbers.qml
diff --git a/dots/.config/quickshell/ii/modules/background/widgets/clock/minuteMarks/Dots.qml b/dots/.config/quickshell/ii/modules/ii/background/widgets/clock/minuteMarks/Dots.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/background/widgets/clock/minuteMarks/Dots.qml
rename to dots/.config/quickshell/ii/modules/ii/background/widgets/clock/minuteMarks/Dots.qml
diff --git a/dots/.config/quickshell/ii/modules/background/widgets/clock/minuteMarks/Lines.qml b/dots/.config/quickshell/ii/modules/ii/background/widgets/clock/minuteMarks/Lines.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/background/widgets/clock/minuteMarks/Lines.qml
rename to dots/.config/quickshell/ii/modules/ii/background/widgets/clock/minuteMarks/Lines.qml
diff --git a/dots/.config/quickshell/ii/modules/background/widgets/clock/minuteMarks/MinuteMarks.qml b/dots/.config/quickshell/ii/modules/ii/background/widgets/clock/minuteMarks/MinuteMarks.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/background/widgets/clock/minuteMarks/MinuteMarks.qml
rename to dots/.config/quickshell/ii/modules/ii/background/widgets/clock/minuteMarks/MinuteMarks.qml
diff --git a/dots/.config/quickshell/ii/modules/background/widgets/weather/WeatherWidget.qml b/dots/.config/quickshell/ii/modules/ii/background/widgets/weather/WeatherWidget.qml
similarity index 97%
rename from dots/.config/quickshell/ii/modules/background/widgets/weather/WeatherWidget.qml
rename to dots/.config/quickshell/ii/modules/ii/background/widgets/weather/WeatherWidget.qml
index 322772cbe..ef626700e 100644
--- a/dots/.config/quickshell/ii/modules/background/widgets/weather/WeatherWidget.qml
+++ b/dots/.config/quickshell/ii/modules/ii/background/widgets/weather/WeatherWidget.qml
@@ -5,7 +5,7 @@ import qs.modules.common
import qs.modules.common.functions
import qs.modules.common.widgets
import qs.modules.common.widgets.widgetCanvas
-import qs.modules.background.widgets
+import qs.modules.ii.background.widgets
AbstractBackgroundWidget {
id: root
diff --git a/dots/.config/quickshell/ii/modules/bar/ActiveWindow.qml b/dots/.config/quickshell/ii/modules/ii/bar/ActiveWindow.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/ActiveWindow.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/ActiveWindow.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/Bar.qml b/dots/.config/quickshell/ii/modules/ii/bar/Bar.qml
similarity index 94%
rename from dots/.config/quickshell/ii/modules/bar/Bar.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/Bar.qml
index 74f8b5f1b..0bf1ad917 100644
--- a/dots/.config/quickshell/ii/modules/bar/Bar.qml
+++ b/dots/.config/quickshell/ii/modules/ii/bar/Bar.qml
@@ -29,10 +29,6 @@ Scope {
id: barRoot
screen: barLoader.modelData
- property var brightnessMonitor: Brightness.getMonitorForScreen(barLoader.modelData)
- property real useShortenedForm: (Appearance.sizes.barHellaShortenScreenWidthThreshold >= screen.width) ? 2 : (Appearance.sizes.barShortenScreenWidthThreshold >= screen.width) ? 1 : 0
- readonly property int centerSideModuleWidth: (useShortenedForm == 2) ? Appearance.sizes.barCenterSideModuleWidthHellaShortened : (useShortenedForm == 1) ? Appearance.sizes.barCenterSideModuleWidthShortened : Appearance.sizes.barCenterSideModuleWidth
-
Timer {
id: showBarTimer
interval: (Config?.options.bar.autoHide.showWhenPressingSuper.delay ?? 100)
diff --git a/dots/.config/quickshell/ii/modules/bar/BarContent.qml b/dots/.config/quickshell/ii/modules/ii/bar/BarContent.qml
similarity index 99%
rename from dots/.config/quickshell/ii/modules/bar/BarContent.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/BarContent.qml
index 03e01aa99..997e0209b 100644
--- a/dots/.config/quickshell/ii/modules/bar/BarContent.qml
+++ b/dots/.config/quickshell/ii/modules/ii/bar/BarContent.qml
@@ -1,4 +1,4 @@
-import qs.modules.bar.weather
+import qs.modules.ii.bar.weather
import QtQuick
import QtQuick.Layouts
import Quickshell
@@ -178,7 +178,7 @@ Item { // Bar content region
}
BatteryIndicator {
- visible: (root.useShortenedForm < 2 && UPower.displayDevice.isLaptopBattery)
+ visible: (root.useShortenedForm < 2 && Battery.available)
Layout.alignment: Qt.AlignVCenter
}
}
diff --git a/dots/.config/quickshell/ii/modules/bar/BarGroup.qml b/dots/.config/quickshell/ii/modules/ii/bar/BarGroup.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/BarGroup.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/BarGroup.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/BatteryIndicator.qml b/dots/.config/quickshell/ii/modules/ii/bar/BatteryIndicator.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/BatteryIndicator.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/BatteryIndicator.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/BatteryPopup.qml b/dots/.config/quickshell/ii/modules/ii/bar/BatteryPopup.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/BatteryPopup.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/BatteryPopup.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/CircleUtilButton.qml b/dots/.config/quickshell/ii/modules/ii/bar/CircleUtilButton.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/CircleUtilButton.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/CircleUtilButton.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/ClockWidget.qml b/dots/.config/quickshell/ii/modules/ii/bar/ClockWidget.qml
similarity index 97%
rename from dots/.config/quickshell/ii/modules/bar/ClockWidget.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/ClockWidget.qml
index 895ad9be0..958695a86 100644
--- a/dots/.config/quickshell/ii/modules/bar/ClockWidget.qml
+++ b/dots/.config/quickshell/ii/modules/ii/bar/ClockWidget.qml
@@ -33,7 +33,7 @@ Item {
visible: root.showDate
font.pixelSize: Appearance.font.pixelSize.small
color: Appearance.colors.colOnLayer1
- text: DateTime.date
+ text: DateTime.longDate
}
}
diff --git a/dots/.config/quickshell/ii/modules/bar/ClockWidgetPopup.qml b/dots/.config/quickshell/ii/modules/ii/bar/ClockWidgetPopup.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/ClockWidgetPopup.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/ClockWidgetPopup.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/HyprlandXkbIndicator.qml b/dots/.config/quickshell/ii/modules/ii/bar/HyprlandXkbIndicator.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/HyprlandXkbIndicator.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/HyprlandXkbIndicator.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/LeftSidebarButton.qml b/dots/.config/quickshell/ii/modules/ii/bar/LeftSidebarButton.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/LeftSidebarButton.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/LeftSidebarButton.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/Media.qml b/dots/.config/quickshell/ii/modules/ii/bar/Media.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/Media.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/Media.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/NotificationUnreadCount.qml b/dots/.config/quickshell/ii/modules/ii/bar/NotificationUnreadCount.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/NotificationUnreadCount.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/NotificationUnreadCount.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/Resource.qml b/dots/.config/quickshell/ii/modules/ii/bar/Resource.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/Resource.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/Resource.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/Resources.qml b/dots/.config/quickshell/ii/modules/ii/bar/Resources.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/Resources.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/Resources.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/ResourcesPopup.qml b/dots/.config/quickshell/ii/modules/ii/bar/ResourcesPopup.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/ResourcesPopup.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/ResourcesPopup.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/ScrollHint.qml b/dots/.config/quickshell/ii/modules/ii/bar/ScrollHint.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/ScrollHint.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/ScrollHint.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/StyledPopup.qml b/dots/.config/quickshell/ii/modules/ii/bar/StyledPopup.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/StyledPopup.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/StyledPopup.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/StyledPopupHeaderRow.qml b/dots/.config/quickshell/ii/modules/ii/bar/StyledPopupHeaderRow.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/StyledPopupHeaderRow.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/StyledPopupHeaderRow.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/StyledPopupValueRow.qml b/dots/.config/quickshell/ii/modules/ii/bar/StyledPopupValueRow.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/StyledPopupValueRow.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/StyledPopupValueRow.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/SysTray.qml b/dots/.config/quickshell/ii/modules/ii/bar/SysTray.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/SysTray.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/SysTray.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/SysTrayItem.qml b/dots/.config/quickshell/ii/modules/ii/bar/SysTrayItem.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/SysTrayItem.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/SysTrayItem.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/SysTrayMenu.qml b/dots/.config/quickshell/ii/modules/ii/bar/SysTrayMenu.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/SysTrayMenu.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/SysTrayMenu.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/SysTrayMenuEntry.qml b/dots/.config/quickshell/ii/modules/ii/bar/SysTrayMenuEntry.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/SysTrayMenuEntry.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/SysTrayMenuEntry.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/UtilButtons.qml b/dots/.config/quickshell/ii/modules/ii/bar/UtilButtons.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/UtilButtons.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/UtilButtons.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/Workspaces.qml b/dots/.config/quickshell/ii/modules/ii/bar/Workspaces.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/Workspaces.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/Workspaces.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/weather/WeatherBar.qml b/dots/.config/quickshell/ii/modules/ii/bar/weather/WeatherBar.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/weather/WeatherBar.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/weather/WeatherBar.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/weather/WeatherCard.qml b/dots/.config/quickshell/ii/modules/ii/bar/weather/WeatherCard.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/bar/weather/WeatherCard.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/weather/WeatherCard.qml
diff --git a/dots/.config/quickshell/ii/modules/bar/weather/WeatherPopup.qml b/dots/.config/quickshell/ii/modules/ii/bar/weather/WeatherPopup.qml
similarity index 99%
rename from dots/.config/quickshell/ii/modules/bar/weather/WeatherPopup.qml
rename to dots/.config/quickshell/ii/modules/ii/bar/weather/WeatherPopup.qml
index 0c06932f7..85d9c1bac 100644
--- a/dots/.config/quickshell/ii/modules/bar/weather/WeatherPopup.qml
+++ b/dots/.config/quickshell/ii/modules/ii/bar/weather/WeatherPopup.qml
@@ -4,7 +4,7 @@ import qs.modules.common.widgets
import QtQuick
import QtQuick.Layouts
-import qs.modules.bar
+import qs.modules.ii.bar
StyledPopup {
id: root
diff --git a/dots/.config/quickshell/ii/modules/cheatsheet/Cheatsheet.qml b/dots/.config/quickshell/ii/modules/ii/cheatsheet/Cheatsheet.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/cheatsheet/Cheatsheet.qml
rename to dots/.config/quickshell/ii/modules/ii/cheatsheet/Cheatsheet.qml
diff --git a/dots/.config/quickshell/ii/modules/cheatsheet/CheatsheetKeybinds.qml b/dots/.config/quickshell/ii/modules/ii/cheatsheet/CheatsheetKeybinds.qml
similarity index 93%
rename from dots/.config/quickshell/ii/modules/cheatsheet/CheatsheetKeybinds.qml
rename to dots/.config/quickshell/ii/modules/ii/cheatsheet/CheatsheetKeybinds.qml
index 1d7e3c4fe..e15a5b2ad 100644
--- a/dots/.config/quickshell/ii/modules/cheatsheet/CheatsheetKeybinds.qml
+++ b/dots/.config/quickshell/ii/modules/ii/cheatsheet/CheatsheetKeybinds.qml
@@ -127,13 +127,12 @@ Item {
const keybind = keybindSection.modelData.keybinds[i];
if (!Config.options.cheatsheet.splitButtons) {
-
- for (var j = 0; j < keybind.mods.length; j++) {
- keybind.mods[j] = keySubstitutions[keybind.mods[j]] || keybind.mods[j];
- }
- keybind.mods = [keybind.mods.join(' ') ]
- keybind.mods[0] += !keyBlacklist.includes(keybind.key) && keybind.mods[0].length ? ' ' : ''
- keybind.mods[0] += !keyBlacklist.includes(keybind.key) ? (keySubstitutions[keybind.key] || keybind.key) : ''
+ for (var j = 0; j < keybind.mods.length; j++) {
+ keybind.mods[j] = keySubstitutions[keybind.mods[j]] || keybind.mods[j];
+ }
+ keybind.mods = [keybind.mods.join(' ') ]
+ keybind.mods[0] += !keyBlacklist.includes(keybind.key) && keybind.mods[0].length ? ' ' : ''
+ keybind.mods[0] += !keyBlacklist.includes(keybind.key) ? (keySubstitutions[keybind.key] || keybind.key) : ''
}
result.push({
diff --git a/dots/.config/quickshell/ii/modules/cheatsheet/CheatsheetPeriodicTable.qml b/dots/.config/quickshell/ii/modules/ii/cheatsheet/CheatsheetPeriodicTable.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/cheatsheet/CheatsheetPeriodicTable.qml
rename to dots/.config/quickshell/ii/modules/ii/cheatsheet/CheatsheetPeriodicTable.qml
diff --git a/dots/.config/quickshell/ii/modules/cheatsheet/ElementTile.qml b/dots/.config/quickshell/ii/modules/ii/cheatsheet/ElementTile.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/cheatsheet/ElementTile.qml
rename to dots/.config/quickshell/ii/modules/ii/cheatsheet/ElementTile.qml
diff --git a/dots/.config/quickshell/ii/modules/cheatsheet/periodic_table.js b/dots/.config/quickshell/ii/modules/ii/cheatsheet/periodic_table.js
similarity index 100%
rename from dots/.config/quickshell/ii/modules/cheatsheet/periodic_table.js
rename to dots/.config/quickshell/ii/modules/ii/cheatsheet/periodic_table.js
diff --git a/dots/.config/quickshell/ii/modules/dock/Dock.qml b/dots/.config/quickshell/ii/modules/ii/dock/Dock.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/dock/Dock.qml
rename to dots/.config/quickshell/ii/modules/ii/dock/Dock.qml
diff --git a/dots/.config/quickshell/ii/modules/dock/DockAppButton.qml b/dots/.config/quickshell/ii/modules/ii/dock/DockAppButton.qml
similarity index 96%
rename from dots/.config/quickshell/ii/modules/dock/DockAppButton.qml
rename to dots/.config/quickshell/ii/modules/ii/dock/DockAppButton.qml
index 406eb3f57..41ed8cd07 100644
--- a/dots/.config/quickshell/ii/modules/dock/DockAppButton.qml
+++ b/dots/.config/quickshell/ii/modules/ii/dock/DockAppButton.qml
@@ -17,8 +17,8 @@ DockButton {
property real countDotHeight: 4
property bool appIsActive: appToplevel.toplevels.find(t => (t.activated == true)) !== undefined
- property bool isSeparator: appToplevel.appId === "SEPARATOR"
- property var desktopEntry: DesktopEntries.heuristicLookup(appToplevel.appId)
+ readonly property bool isSeparator: appToplevel.appId === "SEPARATOR"
+ readonly property var desktopEntry: DesktopEntries.heuristicLookup(appToplevel.appId)
enabled: !isSeparator
implicitWidth: isSeparator ? 1 : implicitHeight - topInset - bottomInset
diff --git a/dots/.config/quickshell/ii/modules/dock/DockApps.qml b/dots/.config/quickshell/ii/modules/ii/dock/DockApps.qml
similarity index 86%
rename from dots/.config/quickshell/ii/modules/dock/DockApps.qml
rename to dots/.config/quickshell/ii/modules/ii/dock/DockApps.qml
index 2bba6553a..d575b7dd4 100644
--- a/dots/.config/quickshell/ii/modules/dock/DockApps.qml
+++ b/dots/.config/quickshell/ii/modules/ii/dock/DockApps.qml
@@ -1,6 +1,3 @@
-import qs.modules.common
-import qs.modules.common.widgets
-import qs.modules.common.functions
import Qt5Compat.GraphicalEffects
import QtQuick
import QtQuick.Controls
@@ -8,6 +5,10 @@ import QtQuick.Layouts
import Quickshell
import Quickshell.Widgets
import Quickshell.Wayland
+import qs.services
+import qs.modules.common
+import qs.modules.common.widgets
+import qs.modules.common.functions
Item {
id: root
@@ -40,44 +41,7 @@ Item {
model: ScriptModel {
objectProp: "appId"
- values: {
- var map = new Map();
-
- // Pinned apps
- const pinnedApps = Config.options?.dock.pinnedApps ?? [];
- for (const appId of pinnedApps) {
- if (!map.has(appId.toLowerCase())) map.set(appId.toLowerCase(), ({
- pinned: true,
- toplevels: []
- }));
- }
-
- // Separator
- if (pinnedApps.length > 0) {
- map.set("SEPARATOR", { pinned: false, toplevels: [] });
- }
-
- // Ignored apps
- const ignoredRegexStrings = Config.options?.dock.ignoredAppRegexes ?? [];
- const ignoredRegexes = ignoredRegexStrings.map(pattern => new RegExp(pattern, "i"));
- // Open windows
- for (const toplevel of ToplevelManager.toplevels.values) {
- if (ignoredRegexes.some(re => re.test(toplevel.appId))) continue;
- if (!map.has(toplevel.appId.toLowerCase())) map.set(toplevel.appId.toLowerCase(), ({
- pinned: false,
- toplevels: []
- }));
- map.get(toplevel.appId.toLowerCase()).toplevels.push(toplevel);
- }
-
- var values = [];
-
- for (const [key, value] of map) {
- values.push({ appId: key, toplevels: value.toplevels, pinned: value.pinned });
- }
-
- return values;
- }
+ values: TaskbarApps.apps
}
delegate: DockAppButton {
required property var modelData
diff --git a/dots/.config/quickshell/ii/modules/dock/DockButton.qml b/dots/.config/quickshell/ii/modules/ii/dock/DockButton.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/dock/DockButton.qml
rename to dots/.config/quickshell/ii/modules/ii/dock/DockButton.qml
diff --git a/dots/.config/quickshell/ii/modules/dock/DockSeparator.qml b/dots/.config/quickshell/ii/modules/ii/dock/DockSeparator.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/dock/DockSeparator.qml
rename to dots/.config/quickshell/ii/modules/ii/dock/DockSeparator.qml
diff --git a/dots/.config/quickshell/ii/modules/lock/Lock.qml b/dots/.config/quickshell/ii/modules/ii/lock/Lock.qml
similarity index 99%
rename from dots/.config/quickshell/ii/modules/lock/Lock.qml
rename to dots/.config/quickshell/ii/modules/ii/lock/Lock.qml
index 4266d03f7..e942f4fda 100644
--- a/dots/.config/quickshell/ii/modules/lock/Lock.qml
+++ b/dots/.config/quickshell/ii/modules/ii/lock/Lock.qml
@@ -3,7 +3,6 @@ import qs
import qs.services
import qs.modules.common
import qs.modules.common.functions
-import qs.modules.lock
import QtQuick
import Quickshell
import Quickshell.Io
diff --git a/dots/.config/quickshell/ii/modules/lock/LockContext.qml b/dots/.config/quickshell/ii/modules/ii/lock/LockContext.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/lock/LockContext.qml
rename to dots/.config/quickshell/ii/modules/ii/lock/LockContext.qml
diff --git a/dots/.config/quickshell/ii/modules/lock/LockSurface.qml b/dots/.config/quickshell/ii/modules/ii/lock/LockSurface.qml
similarity index 99%
rename from dots/.config/quickshell/ii/modules/lock/LockSurface.qml
rename to dots/.config/quickshell/ii/modules/ii/lock/LockSurface.qml
index 526a7d3b4..da3e17627 100644
--- a/dots/.config/quickshell/ii/modules/lock/LockSurface.qml
+++ b/dots/.config/quickshell/ii/modules/ii/lock/LockSurface.qml
@@ -7,7 +7,7 @@ import qs.services
import qs.modules.common
import qs.modules.common.widgets
import qs.modules.common.functions
-import qs.modules.bar as Bar
+import qs.modules.ii.bar as Bar
import Quickshell
import Quickshell.Services.SystemTray
@@ -288,7 +288,7 @@ MouseArea {
opacity: root.toolbarOpacity
IconAndTextPair {
- visible: UPower.displayDevice.isLaptopBattery
+ visible: Battery.available
icon: Battery.isCharging ? "bolt" : "battery_android_full"
text: Math.round(Battery.percentage * 100)
color: (Battery.isLow && !Battery.isCharging) ? Appearance.colors.colError : Appearance.colors.colOnSurfaceVariant
diff --git a/dots/.config/quickshell/ii/modules/lock/PasswordChars.qml b/dots/.config/quickshell/ii/modules/ii/lock/PasswordChars.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/lock/PasswordChars.qml
rename to dots/.config/quickshell/ii/modules/ii/lock/PasswordChars.qml
diff --git a/dots/.config/quickshell/ii/modules/lock/pam/fprintd.conf b/dots/.config/quickshell/ii/modules/ii/lock/pam/fprintd.conf
similarity index 100%
rename from dots/.config/quickshell/ii/modules/lock/pam/fprintd.conf
rename to dots/.config/quickshell/ii/modules/ii/lock/pam/fprintd.conf
diff --git a/dots/.config/quickshell/ii/modules/mediaControls/MediaControls.qml b/dots/.config/quickshell/ii/modules/ii/mediaControls/MediaControls.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/mediaControls/MediaControls.qml
rename to dots/.config/quickshell/ii/modules/ii/mediaControls/MediaControls.qml
index 75dca5926..fa60e0474 100644
--- a/dots/.config/quickshell/ii/modules/mediaControls/MediaControls.qml
+++ b/dots/.config/quickshell/ii/modules/ii/mediaControls/MediaControls.qml
@@ -1,8 +1,8 @@
pragma ComponentBehavior: Bound
+import qs
+import qs.services
import qs.modules.common
import qs.modules.common.widgets
-import qs.services
-import qs
import qs.modules.common.functions
import QtQuick
import QtQuick.Layouts
diff --git a/dots/.config/quickshell/ii/modules/mediaControls/PlayerControl.qml b/dots/.config/quickshell/ii/modules/ii/mediaControls/PlayerControl.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/mediaControls/PlayerControl.qml
rename to dots/.config/quickshell/ii/modules/ii/mediaControls/PlayerControl.qml
diff --git a/dots/.config/quickshell/ii/modules/notificationPopup/NotificationPopup.qml b/dots/.config/quickshell/ii/modules/ii/notificationPopup/NotificationPopup.qml
similarity index 98%
rename from dots/.config/quickshell/ii/modules/notificationPopup/NotificationPopup.qml
rename to dots/.config/quickshell/ii/modules/ii/notificationPopup/NotificationPopup.qml
index d954cbfb1..6ce998146 100644
--- a/dots/.config/quickshell/ii/modules/notificationPopup/NotificationPopup.qml
+++ b/dots/.config/quickshell/ii/modules/ii/notificationPopup/NotificationPopup.qml
@@ -4,7 +4,6 @@ import qs.modules.common.widgets
import qs.services
import QtQuick
import QtQuick.Controls
-import QtQuick.Layouts
import Quickshell
import Quickshell.Wayland
import Quickshell.Hyprland
diff --git a/dots/.config/quickshell/ii/modules/onScreenDisplay/OnScreenDisplay.qml b/dots/.config/quickshell/ii/modules/ii/onScreenDisplay/OnScreenDisplay.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/onScreenDisplay/OnScreenDisplay.qml
rename to dots/.config/quickshell/ii/modules/ii/onScreenDisplay/OnScreenDisplay.qml
diff --git a/dots/.config/quickshell/ii/modules/onScreenDisplay/OsdValueIndicator.qml b/dots/.config/quickshell/ii/modules/ii/onScreenDisplay/OsdValueIndicator.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/onScreenDisplay/OsdValueIndicator.qml
rename to dots/.config/quickshell/ii/modules/ii/onScreenDisplay/OsdValueIndicator.qml
diff --git a/dots/.config/quickshell/ii/modules/onScreenDisplay/indicators/BrightnessIndicator.qml b/dots/.config/quickshell/ii/modules/ii/onScreenDisplay/indicators/BrightnessIndicator.qml
similarity index 92%
rename from dots/.config/quickshell/ii/modules/onScreenDisplay/indicators/BrightnessIndicator.qml
rename to dots/.config/quickshell/ii/modules/ii/onScreenDisplay/indicators/BrightnessIndicator.qml
index 6041f8cfa..fbdbd7152 100644
--- a/dots/.config/quickshell/ii/modules/onScreenDisplay/indicators/BrightnessIndicator.qml
+++ b/dots/.config/quickshell/ii/modules/ii/onScreenDisplay/indicators/BrightnessIndicator.qml
@@ -2,7 +2,7 @@ import qs.services
import QtQuick
import Quickshell
import Quickshell.Hyprland
-import qs.modules.onScreenDisplay
+import qs.modules.ii.onScreenDisplay
OsdValueIndicator {
id: root
diff --git a/dots/.config/quickshell/ii/modules/onScreenDisplay/indicators/VolumeIndicator.qml b/dots/.config/quickshell/ii/modules/ii/onScreenDisplay/indicators/VolumeIndicator.qml
similarity index 85%
rename from dots/.config/quickshell/ii/modules/onScreenDisplay/indicators/VolumeIndicator.qml
rename to dots/.config/quickshell/ii/modules/ii/onScreenDisplay/indicators/VolumeIndicator.qml
index 487befdac..da8a690b4 100644
--- a/dots/.config/quickshell/ii/modules/onScreenDisplay/indicators/VolumeIndicator.qml
+++ b/dots/.config/quickshell/ii/modules/ii/onScreenDisplay/indicators/VolumeIndicator.qml
@@ -1,6 +1,6 @@
import qs.services
import QtQuick
-import qs.modules.onScreenDisplay
+import qs.modules.ii.onScreenDisplay
OsdValueIndicator {
id: osdValues
diff --git a/dots/.config/quickshell/ii/modules/onScreenKeyboard/OnScreenKeyboard.qml b/dots/.config/quickshell/ii/modules/ii/onScreenKeyboard/OnScreenKeyboard.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/onScreenKeyboard/OnScreenKeyboard.qml
rename to dots/.config/quickshell/ii/modules/ii/onScreenKeyboard/OnScreenKeyboard.qml
diff --git a/dots/.config/quickshell/ii/modules/onScreenKeyboard/OskContent.qml b/dots/.config/quickshell/ii/modules/ii/onScreenKeyboard/OskContent.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/onScreenKeyboard/OskContent.qml
rename to dots/.config/quickshell/ii/modules/ii/onScreenKeyboard/OskContent.qml
diff --git a/dots/.config/quickshell/ii/modules/onScreenKeyboard/OskKey.qml b/dots/.config/quickshell/ii/modules/ii/onScreenKeyboard/OskKey.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/onScreenKeyboard/OskKey.qml
rename to dots/.config/quickshell/ii/modules/ii/onScreenKeyboard/OskKey.qml
diff --git a/dots/.config/quickshell/ii/modules/onScreenKeyboard/layouts.js b/dots/.config/quickshell/ii/modules/ii/onScreenKeyboard/layouts.js
similarity index 100%
rename from dots/.config/quickshell/ii/modules/onScreenKeyboard/layouts.js
rename to dots/.config/quickshell/ii/modules/ii/onScreenKeyboard/layouts.js
diff --git a/dots/.config/quickshell/ii/modules/overlay/Overlay.qml b/dots/.config/quickshell/ii/modules/ii/overlay/Overlay.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/overlay/Overlay.qml
rename to dots/.config/quickshell/ii/modules/ii/overlay/Overlay.qml
diff --git a/dots/.config/quickshell/ii/modules/ii/overlay/OverlayBackground.qml b/dots/.config/quickshell/ii/modules/ii/overlay/OverlayBackground.qml
new file mode 100644
index 000000000..d91e4cbba
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/ii/overlay/OverlayBackground.qml
@@ -0,0 +1,8 @@
+import QtQuick
+import qs.modules.common
+
+Rectangle {
+ id: contentItem
+ anchors.fill: parent
+ color: Appearance.colors.colSurfaceContainer
+}
diff --git a/dots/.config/quickshell/ii/modules/overlay/OverlayContent.qml b/dots/.config/quickshell/ii/modules/ii/overlay/OverlayContent.qml
similarity index 98%
rename from dots/.config/quickshell/ii/modules/overlay/OverlayContent.qml
rename to dots/.config/quickshell/ii/modules/ii/overlay/OverlayContent.qml
index 546962185..9c8340c9c 100644
--- a/dots/.config/quickshell/ii/modules/overlay/OverlayContent.qml
+++ b/dots/.config/quickshell/ii/modules/ii/overlay/OverlayContent.qml
@@ -8,8 +8,6 @@ import qs.modules.common
import qs.modules.common.widgets
import qs.modules.common.widgets.widgetCanvas
-import qs.modules.overlay.crosshair
-
Item {
id: root
focus: true
diff --git a/dots/.config/quickshell/ii/modules/overlay/OverlayContext.qml b/dots/.config/quickshell/ii/modules/ii/overlay/OverlayContext.qml
similarity index 95%
rename from dots/.config/quickshell/ii/modules/overlay/OverlayContext.qml
rename to dots/.config/quickshell/ii/modules/ii/overlay/OverlayContext.qml
index 7570d7312..7cdc938bf 100644
--- a/dots/.config/quickshell/ii/modules/overlay/OverlayContext.qml
+++ b/dots/.config/quickshell/ii/modules/ii/overlay/OverlayContext.qml
@@ -6,12 +6,13 @@ Singleton {
id: root
readonly property list availableWidgets: [
- { identifier: "recorder", materialSymbol: "screen_record" },
- { identifier: "volumeMixer", materialSymbol: "volume_up" },
{ identifier: "crosshair", materialSymbol: "point_scan" },
{ identifier: "fpsLimiter", materialSymbol: "animation" },
+ { identifier: "floatingImage", materialSymbol: "imagesmode" },
+ { identifier: "recorder", materialSymbol: "screen_record" },
{ identifier: "resources", materialSymbol: "browse_activity" },
- { identifier: "stickypad", materialSymbol: "note_stack" }
+ { identifier: "stickypad", materialSymbol: "note_stack" },
+ { identifier: "volumeMixer", materialSymbol: "volume_up" },
]
readonly property bool hasPinnedWidgets: root.pinnedWidgetIdentifiers.length > 0
diff --git a/dots/.config/quickshell/ii/modules/overlay/OverlayTaskbar.qml b/dots/.config/quickshell/ii/modules/ii/overlay/OverlayTaskbar.qml
similarity index 72%
rename from dots/.config/quickshell/ii/modules/overlay/OverlayTaskbar.qml
rename to dots/.config/quickshell/ii/modules/ii/overlay/OverlayTaskbar.qml
index 65bb2a27e..232903474 100644
--- a/dots/.config/quickshell/ii/modules/overlay/OverlayTaskbar.qml
+++ b/dots/.config/quickshell/ii/modules/ii/overlay/OverlayTaskbar.qml
@@ -49,8 +49,13 @@ Rectangle {
}
Separator {}
-
TimeWidget {}
+ Separator {
+ visible: Battery.available
+ }
+ BatteryWidget {
+ visible: Battery.available
+ }
}
component Separator: Rectangle {
@@ -67,12 +72,44 @@ Rectangle {
Layout.rightMargin: 6
text: DateTime.time
+ color: Appearance.colors.colOnSurface
font {
family: Appearance.font.family.numbers
variableAxes: Appearance.font.variableAxes.numbers
pixelSize: 22
}
}
+
+ component BatteryWidget: Row {
+ id: batteryWidget
+ Layout.alignment: Qt.AlignVCenter
+ Layout.leftMargin: 6
+ Layout.rightMargin: 6
+ spacing: 2
+ property color colText: Battery.isLowAndNotCharging ? Appearance.colors.colError : Appearance.colors.colOnSurface
+
+ MaterialSymbol {
+ id: boltIcon
+ anchors.verticalCenter: parent.verticalCenter
+ fill: 1
+ text: Battery.isCharging ? "bolt" : "battery_android_full"
+ color: batteryWidget.colText
+ iconSize: 24
+ animateChange: true
+ }
+
+ StyledText {
+ id: batteryText
+ anchors.verticalCenter: parent.verticalCenter
+ text: Math.round(Battery.percentage * 100) + "%"
+ color: batteryWidget.colText
+ font {
+ family: Appearance.font.family.numbers
+ variableAxes: Appearance.font.variableAxes.numbers
+ pixelSize: 18
+ }
+ }
+ }
component WidgetButton: RippleButton {
id: widgetButton
diff --git a/dots/.config/quickshell/ii/modules/overlay/OverlayWidgetDelegateChooser.qml b/dots/.config/quickshell/ii/modules/ii/overlay/OverlayWidgetDelegateChooser.qml
similarity index 63%
rename from dots/.config/quickshell/ii/modules/overlay/OverlayWidgetDelegateChooser.qml
rename to dots/.config/quickshell/ii/modules/ii/overlay/OverlayWidgetDelegateChooser.qml
index 42a2d7e4b..97fc3b9ab 100644
--- a/dots/.config/quickshell/ii/modules/overlay/OverlayWidgetDelegateChooser.qml
+++ b/dots/.config/quickshell/ii/modules/ii/overlay/OverlayWidgetDelegateChooser.qml
@@ -6,21 +6,23 @@ import QtQuick
import QtQuick.Layouts
import Quickshell
import Quickshell.Bluetooth
-import qs.modules.overlay.crosshair
-import qs.modules.overlay.volumeMixer
-import qs.modules.overlay.fpsLimiter
-import qs.modules.overlay.recorder
-import qs.modules.overlay.resources
-import qs.modules.overlay.stickypad
+import qs.modules.ii.overlay.crosshair
+import qs.modules.ii.overlay.volumeMixer
+import qs.modules.ii.overlay.floatingImage
+import qs.modules.ii.overlay.fpsLimiter
+import qs.modules.ii.overlay.recorder
+import qs.modules.ii.overlay.resources
+import qs.modules.ii.overlay.stickypad
DelegateChooser {
id: root
role: "identifier"
DelegateChoice { roleValue: "crosshair"; Crosshair {} }
- DelegateChoice { roleValue: "volumeMixer"; VolumeMixer {} }
+ DelegateChoice { roleValue: "floatingImage"; FloatingImage {} }
DelegateChoice { roleValue: "fpsLimiter"; FpsLimiter {} }
DelegateChoice { roleValue: "recorder"; Recorder {} }
DelegateChoice { roleValue: "resources"; Resources {} }
DelegateChoice { roleValue: "stickypad"; Stickypad {} }
+ DelegateChoice { roleValue: "volumeMixer"; VolumeMixer {} }
}
diff --git a/dots/.config/quickshell/ii/modules/overlay/StyledOverlayWidget.qml b/dots/.config/quickshell/ii/modules/ii/overlay/StyledOverlayWidget.qml
similarity index 99%
rename from dots/.config/quickshell/ii/modules/overlay/StyledOverlayWidget.qml
rename to dots/.config/quickshell/ii/modules/ii/overlay/StyledOverlayWidget.qml
index 9e13ca934..949cd2380 100644
--- a/dots/.config/quickshell/ii/modules/overlay/StyledOverlayWidget.qml
+++ b/dots/.config/quickshell/ii/modules/ii/overlay/StyledOverlayWidget.qml
@@ -33,8 +33,8 @@ AbstractOverlayWidget {
property string title: identifier.replace(/([A-Z])/g, " $1").replace(/^./, function(str){ return str.toUpperCase(); })
property var persistentStateEntry: Persistent.states.overlay[identifier]
property real radius: Appearance.rounding.windowRounding
- property real minimumWidth: 250
- property real minimumHeight: 100
+ property real minimumWidth: contentItem.implicitWidth
+ property real minimumHeight: contentItem.implicitHeight
property real resizeMargin: 8
property real padding: 6
property real contentRadius: radius - padding
@@ -238,8 +238,8 @@ AbstractOverlayWidget {
}
StyledText {
- text: root.title
Layout.fillWidth: true
+ text: root.title
elide: Text.ElideRight
}
diff --git a/dots/.config/quickshell/ii/modules/overlay/crosshair/Crosshair.qml b/dots/.config/quickshell/ii/modules/ii/overlay/crosshair/Crosshair.qml
similarity index 93%
rename from dots/.config/quickshell/ii/modules/overlay/crosshair/Crosshair.qml
rename to dots/.config/quickshell/ii/modules/ii/overlay/crosshair/Crosshair.qml
index ea2f5a1ad..b68884421 100644
--- a/dots/.config/quickshell/ii/modules/overlay/crosshair/Crosshair.qml
+++ b/dots/.config/quickshell/ii/modules/ii/overlay/crosshair/Crosshair.qml
@@ -2,7 +2,7 @@ import QtQuick
import QtQuick.Layouts
import Quickshell
import qs.modules.common
-import qs.modules.overlay
+import qs.modules.ii.overlay
StyledOverlayWidget {
id: root
diff --git a/dots/.config/quickshell/ii/modules/overlay/crosshair/CrosshairContent.qml b/dots/.config/quickshell/ii/modules/ii/overlay/crosshair/CrosshairContent.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/overlay/crosshair/CrosshairContent.qml
rename to dots/.config/quickshell/ii/modules/ii/overlay/crosshair/CrosshairContent.qml
diff --git a/dots/.config/quickshell/ii/modules/ii/overlay/floatingImage/FloatingImage.qml b/dots/.config/quickshell/ii/modules/ii/overlay/floatingImage/FloatingImage.qml
new file mode 100644
index 000000000..081f9eaad
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/ii/overlay/floatingImage/FloatingImage.qml
@@ -0,0 +1,95 @@
+pragma ComponentBehavior: Bound
+import QtQuick
+import Qt5Compat.GraphicalEffects
+import qs.modules.common
+import qs.modules.common.functions
+import qs.modules.common.utils
+import qs.modules.ii.overlay
+
+StyledOverlayWidget {
+ id: root
+ showClickabilityButton: false
+ resizable: false
+ clickthrough: true
+
+ property string imageSource: Config.options.overlay.floatingImage.imageSource
+ property real scaleFactor: Config.options.overlay.floatingImage.scale
+ property int imageWidth: 0
+ property int imageHeight: 0
+
+ // Override to always save 0 size
+ function savePosition(xPos = root.x, yPos = root.y, width = 0, height = 0) {
+ root.persistentStateEntry.x = Math.round(xPos);
+ root.persistentStateEntry.y = Math.round(yPos);
+ root.persistentStateEntry.width = 0
+ root.persistentStateEntry.height = 0
+ }
+
+ onImageSourceChanged: {
+ imageDownloader.running = false;
+ imageDownloader.sourceUrl = root.imageSource;
+ imageDownloader.filePath = Qt.resolvedUrl(Directories.tempImages + "/" + Qt.md5(root.imageSource))
+ imageDownloader.running = true;
+ }
+ onScaleFactorChanged: {
+ setSize();
+ }
+
+ function setSize() {
+ bg.implicitWidth = root.imageWidth * root.scaleFactor;
+ bg.implicitHeight = root.imageHeight * root.scaleFactor;
+ }
+
+ contentItem: OverlayBackground {
+ id: bg
+ color: ColorUtils.transparentize(Appearance.m3colors.m3surfaceContainer, root.actuallyPinned ? 1 : 0)
+ radius: root.contentRadius
+
+ WheelHandler {
+ onWheel: (event) => {
+ if (event.angleDelta.y < 0) {
+ Config.options.overlay.floatingImage.scale = Math.max(0.1, Config.options.overlay.floatingImage.scale - 0.1);
+ }
+ else if (event.angleDelta.y > 0) {
+ Config.options.overlay.floatingImage.scale = Math.min(5.0, Config.options.overlay.floatingImage.scale + 0.1);
+ }
+ }
+ acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad
+ }
+
+ layer.enabled: true
+ layer.effect: OpacityMask {
+ maskSource: Rectangle {
+ width: bg.width
+ height: bg.height
+ radius: bg.radius
+ }
+ }
+
+ AnimatedImage {
+ id: animatedImage
+ anchors.centerIn: parent
+ width: root.imageWidth * root.scaleFactor
+ height: root.imageHeight * root.scaleFactor
+ sourceSize.width: width
+ sourceSize.height: height
+
+ playing: visible
+ asynchronous: true
+ source: ""
+
+ ImageDownloaderProcess {
+ id: imageDownloader
+ filePath: Qt.resolvedUrl(Directories.tempImages + "/" + Qt.md5(root.imageSource))
+ sourceUrl: root.imageSource
+
+ onDone: (path, width, height) => {
+ root.imageWidth = width;
+ root.imageHeight = height;
+ root.setSize();
+ animatedImage.source = path;
+ }
+ }
+ }
+ }
+}
diff --git a/dots/.config/quickshell/ii/modules/overlay/fpsLimiter/FpsLimiter.qml b/dots/.config/quickshell/ii/modules/ii/overlay/fpsLimiter/FpsLimiter.qml
similarity index 89%
rename from dots/.config/quickshell/ii/modules/overlay/fpsLimiter/FpsLimiter.qml
rename to dots/.config/quickshell/ii/modules/ii/overlay/fpsLimiter/FpsLimiter.qml
index 65711c6d2..857a423df 100644
--- a/dots/.config/quickshell/ii/modules/overlay/fpsLimiter/FpsLimiter.qml
+++ b/dots/.config/quickshell/ii/modules/ii/overlay/fpsLimiter/FpsLimiter.qml
@@ -1,7 +1,7 @@
import QtQuick
import Quickshell
import qs.modules.common
-import qs.modules.overlay
+import qs.modules.ii.overlay
StyledOverlayWidget {
id: root
diff --git a/dots/.config/quickshell/ii/modules/overlay/fpsLimiter/FpsLimiterContent.qml b/dots/.config/quickshell/ii/modules/ii/overlay/fpsLimiter/FpsLimiterContent.qml
similarity index 96%
rename from dots/.config/quickshell/ii/modules/overlay/fpsLimiter/FpsLimiterContent.qml
rename to dots/.config/quickshell/ii/modules/ii/overlay/fpsLimiter/FpsLimiterContent.qml
index a67bf40c1..def4a6c60 100644
--- a/dots/.config/quickshell/ii/modules/overlay/fpsLimiter/FpsLimiterContent.qml
+++ b/dots/.config/quickshell/ii/modules/ii/overlay/fpsLimiter/FpsLimiterContent.qml
@@ -6,16 +6,15 @@ import Quickshell
import Quickshell.Io
import qs.modules.common
import qs.modules.common.widgets
+import qs.modules.ii.overlay
-Rectangle {
+OverlayBackground {
id: root
enum State { Normal, Success, Error }
- anchors.fill: parent
property real padding: 16
property var currentState: FpsLimiterContent.State.Normal
- color: Appearance.m3colors.m3surfaceContainer
implicitWidth: content.implicitWidth + (padding * 2)
implicitHeight: content.implicitHeight + (padding * 2)
diff --git a/dots/.config/quickshell/ii/modules/overlay/recorder/Recorder.qml b/dots/.config/quickshell/ii/modules/ii/overlay/recorder/Recorder.qml
similarity index 96%
rename from dots/.config/quickshell/ii/modules/overlay/recorder/Recorder.qml
rename to dots/.config/quickshell/ii/modules/ii/overlay/recorder/Recorder.qml
index 05c0fa680..2c70b312e 100644
--- a/dots/.config/quickshell/ii/modules/overlay/recorder/Recorder.qml
+++ b/dots/.config/quickshell/ii/modules/ii/overlay/recorder/Recorder.qml
@@ -5,18 +5,16 @@ import Quickshell
import qs
import qs.modules.common
import qs.modules.common.widgets
-import qs.modules.overlay
+import qs.modules.ii.overlay
StyledOverlayWidget {
id: root
minimumWidth: 310
minimumHeight: 130
- contentItem: Rectangle {
+ contentItem: OverlayBackground {
id: contentItem
- anchors.fill: parent
radius: root.contentRadius
- color: Appearance.m3colors.m3surfaceContainer
property real padding: 8
ColumnLayout {
id: contentColumn
diff --git a/dots/.config/quickshell/ii/modules/overlay/resources/Resources.qml b/dots/.config/quickshell/ii/modules/ii/overlay/resources/Resources.qml
similarity index 96%
rename from dots/.config/quickshell/ii/modules/overlay/resources/Resources.qml
rename to dots/.config/quickshell/ii/modules/ii/overlay/resources/Resources.qml
index 0dcd6d0f6..8bec779bd 100644
--- a/dots/.config/quickshell/ii/modules/overlay/resources/Resources.qml
+++ b/dots/.config/quickshell/ii/modules/ii/overlay/resources/Resources.qml
@@ -10,7 +10,7 @@ import qs
import qs.services
import qs.modules.common
import qs.modules.common.widgets
-import qs.modules.overlay
+import qs.modules.ii.overlay
StyledOverlayWidget {
id: root
@@ -37,10 +37,8 @@ StyledOverlayWidget {
},
]
- contentItem: Rectangle {
+ contentItem: OverlayBackground {
id: contentItem
- anchors.fill: parent
- color: Appearance.m3colors.m3surfaceContainer
radius: root.contentRadius
property real padding: 4
ColumnLayout {
diff --git a/dots/.config/quickshell/ii/modules/overlay/stickypad/Stickypad.qml b/dots/.config/quickshell/ii/modules/ii/overlay/stickypad/Stickypad.qml
similarity index 90%
rename from dots/.config/quickshell/ii/modules/overlay/stickypad/Stickypad.qml
rename to dots/.config/quickshell/ii/modules/ii/overlay/stickypad/Stickypad.qml
index 1db5f6693..b702f9b94 100644
--- a/dots/.config/quickshell/ii/modules/overlay/stickypad/Stickypad.qml
+++ b/dots/.config/quickshell/ii/modules/ii/overlay/stickypad/Stickypad.qml
@@ -2,7 +2,7 @@ import QtQuick
import QtQuick.Layouts
import Quickshell
import qs.modules.common
-import qs.modules.overlay
+import qs.modules.ii.overlay
StyledOverlayWidget {
id: root
diff --git a/dots/.config/quickshell/ii/modules/overlay/stickypad/StickypadContent.qml b/dots/.config/quickshell/ii/modules/ii/overlay/stickypad/StickypadContent.qml
similarity index 98%
rename from dots/.config/quickshell/ii/modules/overlay/stickypad/StickypadContent.qml
rename to dots/.config/quickshell/ii/modules/ii/overlay/stickypad/StickypadContent.qml
index d8473ea33..adc7724d0 100644
--- a/dots/.config/quickshell/ii/modules/overlay/stickypad/StickypadContent.qml
+++ b/dots/.config/quickshell/ii/modules/ii/overlay/stickypad/StickypadContent.qml
@@ -7,8 +7,9 @@ import qs
import qs.services
import qs.modules.common
import qs.modules.common.widgets
+import qs.modules.ii.overlay
-Rectangle {
+OverlayBackground {
id: root
readonly property real panelPadding: 20
@@ -19,9 +20,6 @@ Rectangle {
property var parsedCopylistLines: []
property bool isClickthrough: false
- color: Appearance.colors.colLayer0
- radius: Appearance.rounding.windowRounding - 6
-
Component.onCompleted: {
stickypadFile.reload()
updateCopylistEntries()
@@ -279,7 +277,7 @@ Rectangle {
rightMargin: 8
}
text: saveDebounce.running ? "Saving..." : "Saved"
- color: saveDebounce.running ? Appearance.colors.colAccent : Appearance.colors.colSubtext
+ color: Appearance.colors.colSubtext
font.pixelSize: Appearance.font.pixelSize.small
font.weight: Font.Medium
}
diff --git a/dots/.config/quickshell/ii/modules/overlay/volumeMixer/VolumeMixer.qml b/dots/.config/quickshell/ii/modules/ii/overlay/volumeMixer/VolumeMixer.qml
similarity index 92%
rename from dots/.config/quickshell/ii/modules/overlay/volumeMixer/VolumeMixer.qml
rename to dots/.config/quickshell/ii/modules/ii/overlay/volumeMixer/VolumeMixer.qml
index 228ea575d..9a93e80b5 100644
--- a/dots/.config/quickshell/ii/modules/overlay/volumeMixer/VolumeMixer.qml
+++ b/dots/.config/quickshell/ii/modules/ii/overlay/volumeMixer/VolumeMixer.qml
@@ -5,17 +5,15 @@ import Quickshell
import qs.services
import qs.modules.common
import qs.modules.common.widgets
-import qs.modules.overlay
-import qs.modules.sidebarRight.volumeMixer
+import qs.modules.ii.overlay
+import qs.modules.ii.sidebarRight.volumeMixer
StyledOverlayWidget {
id: root
minimumWidth: 300
minimumHeight: 380
- contentItem: Rectangle {
- anchors.fill: parent
- color: Appearance.m3colors.m3surfaceContainer
+ contentItem: OverlayBackground {
radius: root.contentRadius
property real padding: 6
diff --git a/dots/.config/quickshell/ii/modules/overview/Overview.qml b/dots/.config/quickshell/ii/modules/ii/overview/Overview.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/overview/Overview.qml
rename to dots/.config/quickshell/ii/modules/ii/overview/Overview.qml
diff --git a/dots/.config/quickshell/ii/modules/overview/OverviewWidget.qml b/dots/.config/quickshell/ii/modules/ii/overview/OverviewWidget.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/overview/OverviewWidget.qml
rename to dots/.config/quickshell/ii/modules/ii/overview/OverviewWidget.qml
diff --git a/dots/.config/quickshell/ii/modules/overview/OverviewWindow.qml b/dots/.config/quickshell/ii/modules/ii/overview/OverviewWindow.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/overview/OverviewWindow.qml
rename to dots/.config/quickshell/ii/modules/ii/overview/OverviewWindow.qml
diff --git a/dots/.config/quickshell/ii/modules/overview/SearchBar.qml b/dots/.config/quickshell/ii/modules/ii/overview/SearchBar.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/overview/SearchBar.qml
rename to dots/.config/quickshell/ii/modules/ii/overview/SearchBar.qml
diff --git a/dots/.config/quickshell/ii/modules/overview/SearchItem.qml b/dots/.config/quickshell/ii/modules/ii/overview/SearchItem.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/overview/SearchItem.qml
rename to dots/.config/quickshell/ii/modules/ii/overview/SearchItem.qml
diff --git a/dots/.config/quickshell/ii/modules/overview/SearchWidget.qml b/dots/.config/quickshell/ii/modules/ii/overview/SearchWidget.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/overview/SearchWidget.qml
rename to dots/.config/quickshell/ii/modules/ii/overview/SearchWidget.qml
diff --git a/dots/.config/quickshell/ii/modules/polkit/Polkit.qml b/dots/.config/quickshell/ii/modules/ii/polkit/Polkit.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/polkit/Polkit.qml
rename to dots/.config/quickshell/ii/modules/ii/polkit/Polkit.qml
diff --git a/dots/.config/quickshell/ii/modules/polkit/PolkitContent.qml b/dots/.config/quickshell/ii/modules/ii/polkit/PolkitContent.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/polkit/PolkitContent.qml
rename to dots/.config/quickshell/ii/modules/ii/polkit/PolkitContent.qml
diff --git a/dots/.config/quickshell/ii/modules/regionSelector/CircleSelectionDetails.qml b/dots/.config/quickshell/ii/modules/ii/regionSelector/CircleSelectionDetails.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/regionSelector/CircleSelectionDetails.qml
rename to dots/.config/quickshell/ii/modules/ii/regionSelector/CircleSelectionDetails.qml
diff --git a/dots/.config/quickshell/ii/modules/regionSelector/OptionsToolbar.qml b/dots/.config/quickshell/ii/modules/ii/regionSelector/OptionsToolbar.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/regionSelector/OptionsToolbar.qml
rename to dots/.config/quickshell/ii/modules/ii/regionSelector/OptionsToolbar.qml
diff --git a/dots/.config/quickshell/ii/modules/regionSelector/RectCornersSelectionDetails.qml b/dots/.config/quickshell/ii/modules/ii/regionSelector/RectCornersSelectionDetails.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/regionSelector/RectCornersSelectionDetails.qml
rename to dots/.config/quickshell/ii/modules/ii/regionSelector/RectCornersSelectionDetails.qml
diff --git a/dots/.config/quickshell/ii/modules/regionSelector/RegionFunctions.qml b/dots/.config/quickshell/ii/modules/ii/regionSelector/RegionFunctions.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/regionSelector/RegionFunctions.qml
rename to dots/.config/quickshell/ii/modules/ii/regionSelector/RegionFunctions.qml
diff --git a/dots/.config/quickshell/ii/modules/regionSelector/RegionSelection.qml b/dots/.config/quickshell/ii/modules/ii/regionSelector/RegionSelection.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/regionSelector/RegionSelection.qml
rename to dots/.config/quickshell/ii/modules/ii/regionSelector/RegionSelection.qml
diff --git a/dots/.config/quickshell/ii/modules/regionSelector/RegionSelector.qml b/dots/.config/quickshell/ii/modules/ii/regionSelector/RegionSelector.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/regionSelector/RegionSelector.qml
rename to dots/.config/quickshell/ii/modules/ii/regionSelector/RegionSelector.qml
diff --git a/dots/.config/quickshell/ii/modules/regionSelector/TargetRegion.qml b/dots/.config/quickshell/ii/modules/ii/regionSelector/TargetRegion.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/regionSelector/TargetRegion.qml
rename to dots/.config/quickshell/ii/modules/ii/regionSelector/TargetRegion.qml
diff --git a/dots/.config/quickshell/ii/modules/screenCorners/ScreenCorners.qml b/dots/.config/quickshell/ii/modules/ii/screenCorners/ScreenCorners.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/screenCorners/ScreenCorners.qml
rename to dots/.config/quickshell/ii/modules/ii/screenCorners/ScreenCorners.qml
diff --git a/dots/.config/quickshell/ii/modules/sessionScreen/SessionActionButton.qml b/dots/.config/quickshell/ii/modules/ii/sessionScreen/SessionActionButton.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sessionScreen/SessionActionButton.qml
rename to dots/.config/quickshell/ii/modules/ii/sessionScreen/SessionActionButton.qml
diff --git a/dots/.config/quickshell/ii/modules/sessionScreen/SessionScreen.qml b/dots/.config/quickshell/ii/modules/ii/sessionScreen/SessionScreen.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sessionScreen/SessionScreen.qml
rename to dots/.config/quickshell/ii/modules/ii/sessionScreen/SessionScreen.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarLeft/AiChat.qml b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/AiChat.qml
similarity index 99%
rename from dots/.config/quickshell/ii/modules/sidebarLeft/AiChat.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarLeft/AiChat.qml
index e4ded1eeb..820626b51 100644
--- a/dots/.config/quickshell/ii/modules/sidebarLeft/AiChat.qml
+++ b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/AiChat.qml
@@ -3,7 +3,7 @@ import qs.services
import qs.modules.common
import qs.modules.common.widgets
import qs.modules.common.functions
-import qs.modules.sidebarLeft.aiChat
+import qs.modules.ii.sidebarLeft.aiChat
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -395,7 +395,7 @@ Inline w/ backslash and round brackets \\(e^{i\\pi} + 1 = 0\\)
shown: Ai.messageIDs.length === 0
icon: "neurology"
title: Translation.tr("Large language models")
- description: Translation.tr("Type /key to get started with online models\nCtrl+O to expand the sidebar\nCtrl+P to detach sidebar into a window")
+ description: Translation.tr("Type /key to get started with online models\nCtrl+O to expand sidebar\nCtrl+P to pin sidebar\nCtrl+D to detach sidebar")
shape: MaterialShape.Shape.PixelCircle
}
diff --git a/dots/.config/quickshell/ii/modules/sidebarLeft/Anime.qml b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/Anime.qml
similarity index 99%
rename from dots/.config/quickshell/ii/modules/sidebarLeft/Anime.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarLeft/Anime.qml
index ff4b22d42..a30b1ef15 100644
--- a/dots/.config/quickshell/ii/modules/sidebarLeft/Anime.qml
+++ b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/Anime.qml
@@ -3,7 +3,7 @@ import qs.services
import qs.modules.common
import qs.modules.common.widgets
import qs.modules.common.functions
-import qs.modules.sidebarLeft.anime
+import qs.modules.ii.sidebarLeft.anime
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
diff --git a/dots/.config/quickshell/ii/modules/sidebarLeft/ApiCommandButton.qml b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/ApiCommandButton.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarLeft/ApiCommandButton.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarLeft/ApiCommandButton.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarLeft/ApiInputBoxIndicator.qml b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/ApiInputBoxIndicator.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarLeft/ApiInputBoxIndicator.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarLeft/ApiInputBoxIndicator.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarLeft/DescriptionBox.qml b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/DescriptionBox.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarLeft/DescriptionBox.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarLeft/DescriptionBox.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarLeft/ScrollToBottomButton.qml b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/ScrollToBottomButton.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarLeft/ScrollToBottomButton.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarLeft/ScrollToBottomButton.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarLeft/SidebarLeft.qml b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/SidebarLeft.qml
similarity index 76%
rename from dots/.config/quickshell/ii/modules/sidebarLeft/SidebarLeft.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarLeft/SidebarLeft.qml
index 9a26b07be..fc275976c 100644
--- a/dots/.config/quickshell/ii/modules/sidebarLeft/SidebarLeft.qml
+++ b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/SidebarLeft.qml
@@ -11,9 +11,53 @@ import Quickshell.Hyprland
Scope { // Scope
id: root
property bool detach: false
+ property bool pin: false
property Component contentComponent: SidebarLeftContent {}
property Item sidebarContent
+ function toggleDetach() {
+ root.detach = !root.detach;
+ }
+
+ Process { // Dodge cursor away, pin, move cursor back
+ id: pinWithFunnyHyprlandWorkaroundProc
+ property var hook: null
+ property int cursorX;
+ property int cursorY;
+ function doIt() {
+ command = ["hyprctl", "cursorpos"]
+ hook = (output) => {
+ cursorX = parseInt(output.split(",")[0]);
+ cursorY = parseInt(output.split(",")[1]);
+ doIt2();
+ }
+ running = true;
+ }
+ function doIt2(output) {
+ command = ["bash", "-c", "hyprctl dispatch movecursor 9999 9999"];
+ hook = () => {
+ doIt3();
+ }
+ running = true;
+ }
+ function doIt3(output) {
+ root.pin = !root.pin;
+ command = ["bash", "-c", `sleep 0.01; hyprctl dispatch movecursor ${cursorX} ${cursorY}`];
+ hook = null
+ running = true;
+ }
+ stdout: StdioCollector {
+ onStreamFinished: {
+ pinWithFunnyHyprlandWorkaroundProc.hook(text);
+ }
+ }
+ }
+
+ function togglePin() {
+ if (!root.pin) pinWithFunnyHyprlandWorkaroundProc.doIt()
+ else root.pin = !root.pin;
+ }
+
Component.onCompleted: {
root.sidebarContent = contentComponent.createObject(null, {
"scopeRoot": root,
@@ -51,11 +95,12 @@ Scope { // Scope
GlobalStates.sidebarLeftOpen = false
}
- exclusiveZone: 0
+ exclusionMode: ExclusionMode.Normal
+ exclusiveZone: root.pin ? sidebarWidth : 0
implicitWidth: Appearance.sizes.sidebarWidthExtended + Appearance.sizes.elevationMargin
WlrLayershell.namespace: "quickshell:sidebarLeft"
// Hyprland 0.49: OnDemand is Exclusive, Exclusive just breaks click-outside-to-close
- // WlrLayershell.keyboardFocus: WlrKeyboardFocus.OnDemand
+ WlrLayershell.keyboardFocus: WlrKeyboardFocus.OnDemand
color: "transparent"
anchors {
@@ -71,7 +116,7 @@ Scope { // Scope
HyprlandFocusGrab { // Click outside to close
id: grab
windows: [ sidebarRoot ]
- active: sidebarRoot.visible
+ active: sidebarRoot.visible && !root.pin
onActiveChanged: { // Focus the selected tab
if (active) sidebarLeftBackground.children[0].focusActiveItem()
}
@@ -109,9 +154,10 @@ Scope { // Scope
if (event.modifiers === Qt.ControlModifier) {
if (event.key === Qt.Key_O) {
sidebarRoot.extend = !sidebarRoot.extend;
- }
- else if (event.key === Qt.Key_P) {
- root.detach = !root.detach;
+ } else if (event.key === Qt.Key_D) {
+ root.toggleDetach();
+ } else if (event.key === Qt.Key_P) {
+ root.togglePin();
}
event.accepted = true;
}
@@ -141,8 +187,8 @@ Scope { // Scope
Keys.onPressed: (event) => {
if (event.modifiers === Qt.ControlModifier) {
- if (event.key === Qt.Key_P) {
- root.detach = !root.detach;
+ if (event.key === Qt.Key_D) {
+ root.toggleDetach();
}
event.accepted = true;
}
diff --git a/dots/.config/quickshell/ii/modules/sidebarLeft/SidebarLeftContent.qml b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/SidebarLeftContent.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarLeft/SidebarLeftContent.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarLeft/SidebarLeftContent.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarLeft/Translator.qml b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/Translator.qml
similarity index 99%
rename from dots/.config/quickshell/ii/modules/sidebarLeft/Translator.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarLeft/Translator.qml
index bde48f532..4cd25449c 100644
--- a/dots/.config/quickshell/ii/modules/sidebarLeft/Translator.qml
+++ b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/Translator.qml
@@ -2,7 +2,7 @@ import qs.services
import qs.modules.common
import qs.modules.common.widgets
import qs.modules.common.functions
-import qs.modules.sidebarLeft.translator
+import qs.modules.ii.sidebarLeft.translator
import QtQuick
import QtQuick.Layouts
import Quickshell
diff --git a/dots/.config/quickshell/ii/modules/sidebarLeft/aiChat/AiMessage.qml b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/aiChat/AiMessage.qml
similarity index 93%
rename from dots/.config/quickshell/ii/modules/sidebarLeft/aiChat/AiMessage.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarLeft/aiChat/AiMessage.qml
index 74d5c5f6a..487665851 100644
--- a/dots/.config/quickshell/ii/modules/sidebarLeft/aiChat/AiMessage.qml
+++ b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/aiChat/AiMessage.qml
@@ -285,48 +285,36 @@ Rectangle {
}
}
}
-
Repeater {
model: ScriptModel {
- values: Array.from({ length: root.messageBlocks.length }, (msg, i) => {
- return ({
- type: root.messageBlocks[i].type
- })
- });
+ values: root.messageBlocks
}
-
delegate: DelegateChooser {
id: messageDelegate
role: "type"
DelegateChoice { roleValue: "code"; MessageCodeBlock {
- required property int index
- property var thisBlock: root.messageBlocks[index]
editing: root.editing
renderMarkdown: root.renderMarkdown
enableMouseSelection: root.enableMouseSelection
- segmentContent: thisBlock.content
- segmentLang: thisBlock.lang
+ segmentContent: modelData.content
+ segmentLang: modelData.lang
messageData: root.messageData
} }
DelegateChoice { roleValue: "think"; MessageThinkBlock {
- required property int index
- property var thisBlock: root.messageBlocks[index]
editing: root.editing
renderMarkdown: root.renderMarkdown
enableMouseSelection: root.enableMouseSelection
- segmentContent: thisBlock.content
+ segmentContent: modelData.content
messageData: root.messageData
done: root.messageData?.done ?? false
- completed: thisBlock.completed ?? false
+ completed: modelData.completed ?? false
} }
DelegateChoice { roleValue: "text"; MessageTextBlock {
- required property int index
- property var thisBlock: root.messageBlocks[index]
editing: root.editing
renderMarkdown: root.renderMarkdown
enableMouseSelection: root.enableMouseSelection
- segmentContent: thisBlock.content
+ segmentContent: modelData.content
messageData: root.messageData
done: root.messageData?.done ?? false
forceDisableChunkSplitting: root.messageData?.content.includes("```") ?? true
diff --git a/dots/.config/quickshell/ii/modules/sidebarLeft/aiChat/AiMessageControlButton.qml b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/aiChat/AiMessageControlButton.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarLeft/aiChat/AiMessageControlButton.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarLeft/aiChat/AiMessageControlButton.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarLeft/aiChat/AnnotationSourceButton.qml b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/aiChat/AnnotationSourceButton.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarLeft/aiChat/AnnotationSourceButton.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarLeft/aiChat/AnnotationSourceButton.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarLeft/aiChat/AttachedFileIndicator.qml b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/aiChat/AttachedFileIndicator.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarLeft/aiChat/AttachedFileIndicator.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarLeft/aiChat/AttachedFileIndicator.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarLeft/aiChat/MessageCodeBlock.qml b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/aiChat/MessageCodeBlock.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarLeft/aiChat/MessageCodeBlock.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarLeft/aiChat/MessageCodeBlock.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarLeft/aiChat/MessageTextBlock.qml b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/aiChat/MessageTextBlock.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarLeft/aiChat/MessageTextBlock.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarLeft/aiChat/MessageTextBlock.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarLeft/aiChat/MessageThinkBlock.qml b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/aiChat/MessageThinkBlock.qml
similarity index 98%
rename from dots/.config/quickshell/ii/modules/sidebarLeft/aiChat/MessageThinkBlock.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarLeft/aiChat/MessageThinkBlock.qml
index 1463c6e60..ee00ffdff 100644
--- a/dots/.config/quickshell/ii/modules/sidebarLeft/aiChat/MessageThinkBlock.qml
+++ b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/aiChat/MessageThinkBlock.qml
@@ -156,7 +156,6 @@ Item {
property bool editing: root.editing
property bool renderMarkdown: root.renderMarkdown
property bool enableMouseSelection: root.enableMouseSelection
- property string segmentContent: root.segmentContent
property var messageData: root.messageData
property bool done: root.done
@@ -165,8 +164,9 @@ Item {
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
+ segmentContent: root.segmentContent
}
}
}
}
-}
\ No newline at end of file
+}
diff --git a/dots/.config/quickshell/ii/modules/sidebarLeft/aiChat/SearchQueryButton.qml b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/aiChat/SearchQueryButton.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarLeft/aiChat/SearchQueryButton.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarLeft/aiChat/SearchQueryButton.qml
index 4ad60ac9c..1c1d03608 100644
--- a/dots/.config/quickshell/ii/modules/sidebarLeft/aiChat/SearchQueryButton.qml
+++ b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/aiChat/SearchQueryButton.qml
@@ -1,7 +1,7 @@
import qs
+import qs.services
import qs.modules.common
import qs.modules.common.widgets
-import qs.services
import qs.modules.common.functions
import QtQuick
import QtQuick.Layouts
diff --git a/dots/.config/quickshell/ii/modules/sidebarLeft/anime/BooruImage.qml b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/anime/BooruImage.qml
similarity index 92%
rename from dots/.config/quickshell/ii/modules/sidebarLeft/anime/BooruImage.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarLeft/anime/BooruImage.qml
index 99f6f1ab3..e403417ba 100644
--- a/dots/.config/quickshell/ii/modules/sidebarLeft/anime/BooruImage.qml
+++ b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/anime/BooruImage.qml
@@ -1,7 +1,8 @@
import qs.services
import qs.modules.common
-import qs.modules.common.widgets
import qs.modules.common.functions
+import qs.modules.common.utils
+import qs.modules.common.widgets
import QtQml
import QtQuick
import QtQuick.Controls
@@ -25,18 +26,19 @@ Button {
property real imageRadius: Appearance.rounding.small
property bool showActions: false
- Process {
- id: downloadProcess
- running: false
- command: ["bash", "-c", `mkdir -p '${root.previewDownloadPath}' && [ -f ${root.filePath} ] || curl -sSL '${root.imageData.preview_url ?? root.imageData.sample_url}' -o '${root.filePath}'`]
- onExited: (exitCode, exitStatus) => {
- imageObject.source = `${previewDownloadPath}/${root.fileName}`
- }
- }
-
- Component.onCompleted: {
- if (root.manualDownload) {
- downloadProcess.running = true
+ ImageDownloaderProcess {
+ id: imageDownloader
+ running: root.manualDownload
+ filePath: root.filePath
+ sourceUrl: root.imageData.preview_url ?? root.imageData.sample_url
+ onDone: (path, width, height) => {
+ imageObject.source = ""
+ imageObject.source = path
+ if (!modelData.width || !modelData.height) {
+ modelData.width = width
+ modelData.height = height
+ modelData.aspect_ratio = width / height
+ }
}
}
diff --git a/dots/.config/quickshell/ii/modules/sidebarLeft/anime/BooruResponse.qml b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/anime/BooruResponse.qml
similarity index 99%
rename from dots/.config/quickshell/ii/modules/sidebarLeft/anime/BooruResponse.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarLeft/anime/BooruResponse.qml
index 6b1711a40..f67db79b5 100644
--- a/dots/.config/quickshell/ii/modules/sidebarLeft/anime/BooruResponse.qml
+++ b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/anime/BooruResponse.qml
@@ -3,7 +3,7 @@ import qs.services
import qs.modules.common
import qs.modules.common.widgets
import qs.modules.common.functions
-import qs.modules.sidebarLeft
+import qs.modules.ii.sidebarLeft
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
diff --git a/dots/.config/quickshell/ii/modules/sidebarLeft/translator/LanguageSelectorButton.qml b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/translator/LanguageSelectorButton.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarLeft/translator/LanguageSelectorButton.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarLeft/translator/LanguageSelectorButton.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarLeft/translator/TextCanvas.qml b/dots/.config/quickshell/ii/modules/ii/sidebarLeft/translator/TextCanvas.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarLeft/translator/TextCanvas.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarLeft/translator/TextCanvas.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/BottomWidgetGroup.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/BottomWidgetGroup.qml
similarity index 98%
rename from dots/.config/quickshell/ii/modules/sidebarRight/BottomWidgetGroup.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/BottomWidgetGroup.qml
index 244464069..f81e9db13 100644
--- a/dots/.config/quickshell/ii/modules/sidebarRight/BottomWidgetGroup.qml
+++ b/dots/.config/quickshell/ii/modules/ii/sidebarRight/BottomWidgetGroup.qml
@@ -1,9 +1,9 @@
import qs.modules.common
import qs.modules.common.widgets
import qs.services
-import qs.modules.sidebarRight.calendar
-import qs.modules.sidebarRight.todo
-import qs.modules.sidebarRight.pomodoro
+import qs.modules.ii.sidebarRight.calendar
+import qs.modules.ii.sidebarRight.todo
+import qs.modules.ii.sidebarRight.pomodoro
import QtQuick
import QtQuick.Layouts
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/CenterWidgetGroup.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/CenterWidgetGroup.qml
similarity index 80%
rename from dots/.config/quickshell/ii/modules/sidebarRight/CenterWidgetGroup.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/CenterWidgetGroup.qml
index 007006ca9..4e7747eb6 100644
--- a/dots/.config/quickshell/ii/modules/sidebarRight/CenterWidgetGroup.qml
+++ b/dots/.config/quickshell/ii/modules/ii/sidebarRight/CenterWidgetGroup.qml
@@ -1,8 +1,7 @@
import qs.modules.common
import qs.modules.common.widgets
import qs.services
-import qs.modules.sidebarRight.notifications
-import qs.modules.sidebarRight.volumeMixer
+import qs.modules.ii.sidebarRight.notifications
import Qt5Compat.GraphicalEffects
import QtQuick
import QtQuick.Controls
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/QuickSliders.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/QuickSliders.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/QuickSliders.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/QuickSliders.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/SidebarRight.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/SidebarRight.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/SidebarRight.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/SidebarRight.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/SidebarRightContent.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/SidebarRightContent.qml
similarity index 97%
rename from dots/.config/quickshell/ii/modules/sidebarRight/SidebarRightContent.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/SidebarRightContent.qml
index f2aee10fe..0f733ed82 100644
--- a/dots/.config/quickshell/ii/modules/sidebarRight/SidebarRightContent.qml
+++ b/dots/.config/quickshell/ii/modules/ii/sidebarRight/SidebarRightContent.qml
@@ -9,13 +9,13 @@ import Quickshell
import Quickshell.Bluetooth
import Quickshell.Hyprland
-import qs.modules.sidebarRight.quickToggles
-import qs.modules.sidebarRight.quickToggles.classicStyle
+import qs.modules.ii.sidebarRight.quickToggles
+import qs.modules.ii.sidebarRight.quickToggles.classicStyle
-import qs.modules.sidebarRight.bluetoothDevices
-import qs.modules.sidebarRight.nightLight
-import qs.modules.sidebarRight.volumeMixer
-import qs.modules.sidebarRight.wifiNetworks
+import qs.modules.ii.sidebarRight.bluetoothDevices
+import qs.modules.ii.sidebarRight.nightLight
+import qs.modules.ii.sidebarRight.volumeMixer
+import qs.modules.ii.sidebarRight.wifiNetworks
Item {
id: root
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/bluetoothDevices/BluetoothDeviceItem.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/bluetoothDevices/BluetoothDeviceItem.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/bluetoothDevices/BluetoothDeviceItem.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/bluetoothDevices/BluetoothDeviceItem.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/bluetoothDevices/BluetoothDialog.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/bluetoothDevices/BluetoothDialog.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/bluetoothDevices/BluetoothDialog.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/bluetoothDevices/BluetoothDialog.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/calendar/CalendarDayButton.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/calendar/CalendarDayButton.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/calendar/CalendarDayButton.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/calendar/CalendarDayButton.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/calendar/CalendarHeaderButton.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/calendar/CalendarHeaderButton.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/calendar/CalendarHeaderButton.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/calendar/CalendarHeaderButton.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/calendar/CalendarWidget.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/calendar/CalendarWidget.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/calendar/CalendarWidget.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/calendar/CalendarWidget.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/calendar/calendar_layout.js b/dots/.config/quickshell/ii/modules/ii/sidebarRight/calendar/calendar_layout.js
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/calendar/calendar_layout.js
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/calendar/calendar_layout.js
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/nightLight/NightLightDialog.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/nightLight/NightLightDialog.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/nightLight/NightLightDialog.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/nightLight/NightLightDialog.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/notifications/NotificationList.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/notifications/NotificationList.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/notifications/NotificationList.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/notifications/NotificationList.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/notifications/NotificationStatusButton.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/notifications/NotificationStatusButton.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/notifications/NotificationStatusButton.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/notifications/NotificationStatusButton.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/pomodoro/PomodoroTimer.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/pomodoro/PomodoroTimer.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/pomodoro/PomodoroTimer.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/pomodoro/PomodoroTimer.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/pomodoro/PomodoroWidget.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/pomodoro/PomodoroWidget.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/pomodoro/PomodoroWidget.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/pomodoro/PomodoroWidget.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/pomodoro/Stopwatch.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/pomodoro/Stopwatch.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/pomodoro/Stopwatch.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/pomodoro/Stopwatch.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/AbstractQuickPanel.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/AbstractQuickPanel.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/AbstractQuickPanel.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/AbstractQuickPanel.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/AndroidQuickPanel.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/AndroidQuickPanel.qml
similarity index 99%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/AndroidQuickPanel.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/AndroidQuickPanel.qml
index f8c93bfff..8457b3cd3 100644
--- a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/AndroidQuickPanel.qml
+++ b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/AndroidQuickPanel.qml
@@ -6,7 +6,7 @@ import QtQuick.Layouts
import Quickshell
import Quickshell.Bluetooth
-import qs.modules.sidebarRight.quickToggles.androidStyle
+import qs.modules.ii.sidebarRight.quickToggles.androidStyle
AbstractQuickPanel {
id: root
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/ClassicQuickPanel.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/ClassicQuickPanel.qml
similarity index 93%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/ClassicQuickPanel.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/ClassicQuickPanel.qml
index cf52886a0..3aff842df 100644
--- a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/ClassicQuickPanel.qml
+++ b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/ClassicQuickPanel.qml
@@ -5,7 +5,7 @@ import QtQuick
import QtQuick.Layouts
import Quickshell.Bluetooth
-import qs.modules.sidebarRight.quickToggles.classicStyle
+import qs.modules.ii.sidebarRight.quickToggles.classicStyle
AbstractQuickPanel {
id: root
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidAntiFlashbangToggle.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidAntiFlashbangToggle.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidAntiFlashbangToggle.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidAntiFlashbangToggle.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidAudioToggle.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidAudioToggle.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidAudioToggle.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidAudioToggle.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidBluetoothToggle.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidBluetoothToggle.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidBluetoothToggle.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidBluetoothToggle.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidCloudflareWarpToggle.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidCloudflareWarpToggle.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidCloudflareWarpToggle.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidCloudflareWarpToggle.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidColorPickerToggle.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidColorPickerToggle.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidColorPickerToggle.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidColorPickerToggle.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidDarkModeToggle.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidDarkModeToggle.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidDarkModeToggle.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidDarkModeToggle.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidEasyEffectsToggle.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidEasyEffectsToggle.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidEasyEffectsToggle.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidEasyEffectsToggle.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidGameModeToggle.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidGameModeToggle.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidGameModeToggle.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidGameModeToggle.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidIdleInhibitorToggle.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidIdleInhibitorToggle.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidIdleInhibitorToggle.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidIdleInhibitorToggle.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMicToggle.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidMicToggle.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMicToggle.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidMicToggle.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidMusicRecognition.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidNetworkToggle.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidNetworkToggle.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidNetworkToggle.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidNetworkToggle.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidNightLightToggle.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidNightLightToggle.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidNightLightToggle.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidNightLightToggle.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidNotificationToggle.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidNotificationToggle.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidNotificationToggle.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidNotificationToggle.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidOnScreenKeyboardToggle.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidOnScreenKeyboardToggle.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidOnScreenKeyboardToggle.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidOnScreenKeyboardToggle.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidPowerProfileToggle.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidPowerProfileToggle.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidPowerProfileToggle.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidPowerProfileToggle.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidQuickToggleButton.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidQuickToggleButton.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidQuickToggleButton.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidQuickToggleButton.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidScreenSnipToggle.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidScreenSnipToggle.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidScreenSnipToggle.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidScreenSnipToggle.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidToggleDelegateChooser.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidToggleDelegateChooser.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/androidStyle/AndroidToggleDelegateChooser.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/androidStyle/AndroidToggleDelegateChooser.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/classicStyle/BluetoothToggle.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/classicStyle/BluetoothToggle.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/classicStyle/BluetoothToggle.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/classicStyle/BluetoothToggle.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/classicStyle/CloudflareWarp.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/classicStyle/CloudflareWarp.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/classicStyle/CloudflareWarp.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/classicStyle/CloudflareWarp.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/classicStyle/EasyEffectsToggle.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/classicStyle/EasyEffectsToggle.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/classicStyle/EasyEffectsToggle.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/classicStyle/EasyEffectsToggle.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/classicStyle/GameMode.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/classicStyle/GameMode.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/classicStyle/GameMode.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/classicStyle/GameMode.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/classicStyle/IdleInhibitor.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/classicStyle/IdleInhibitor.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/classicStyle/IdleInhibitor.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/classicStyle/IdleInhibitor.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/classicStyle/NetworkToggle.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/classicStyle/NetworkToggle.qml
similarity index 93%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/classicStyle/NetworkToggle.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/classicStyle/NetworkToggle.qml
index cc3ac3fca..63fdb85bc 100644
--- a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/classicStyle/NetworkToggle.qml
+++ b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/classicStyle/NetworkToggle.qml
@@ -2,7 +2,7 @@ import qs.services
import qs.modules.common
import qs.modules.common.widgets
import qs.modules.common.functions
-import qs.modules.sidebarRight.quickToggles
+import qs.modules.ii.sidebarRight.quickToggles
import qs
import QtQuick
import Quickshell
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/classicStyle/NightLight.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/classicStyle/NightLight.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/classicStyle/NightLight.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/classicStyle/NightLight.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/classicStyle/QuickToggleButton.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/classicStyle/QuickToggleButton.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/quickToggles/classicStyle/QuickToggleButton.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/quickToggles/classicStyle/QuickToggleButton.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/todo/TaskList.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/todo/TaskList.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/todo/TaskList.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/todo/TaskList.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/todo/TodoItemActionButton.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/todo/TodoItemActionButton.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/todo/TodoItemActionButton.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/todo/TodoItemActionButton.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/todo/TodoWidget.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/todo/TodoWidget.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/todo/TodoWidget.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/todo/TodoWidget.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/volumeMixer/AudioDeviceSelectorButton.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/volumeMixer/AudioDeviceSelectorButton.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/volumeMixer/AudioDeviceSelectorButton.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/volumeMixer/AudioDeviceSelectorButton.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/volumeMixer/VolumeDialog.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/volumeMixer/VolumeDialog.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/volumeMixer/VolumeDialog.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/volumeMixer/VolumeDialog.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/volumeMixer/VolumeDialogContent.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/volumeMixer/VolumeDialogContent.qml
similarity index 95%
rename from dots/.config/quickshell/ii/modules/sidebarRight/volumeMixer/VolumeDialogContent.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/volumeMixer/VolumeDialogContent.qml
index 46d83f7de..5eb409ecb 100644
--- a/dots/.config/quickshell/ii/modules/sidebarRight/volumeMixer/VolumeDialogContent.qml
+++ b/dots/.config/quickshell/ii/modules/ii/sidebarRight/volumeMixer/VolumeDialogContent.qml
@@ -44,7 +44,7 @@ ColumnLayout {
Layout.fillHeight: false
Layout.fillWidth: true
Layout.bottomMargin: 6
- model: root.devices.map(node => node.description)
+ model: root.devices.map(node => (node.nickname || node.description || Translation.tr("Unknown")))
currentIndex: root.devices.findIndex(item => {
if (root.isSink) {
return item.id === Pipewire.preferredDefaultAudioSink?.id
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/volumeMixer/VolumeMixerEntry.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/volumeMixer/VolumeMixerEntry.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/volumeMixer/VolumeMixerEntry.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/volumeMixer/VolumeMixerEntry.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/wifiNetworks/WifiDialog.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/wifiNetworks/WifiDialog.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/wifiNetworks/WifiDialog.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/wifiNetworks/WifiDialog.qml
diff --git a/dots/.config/quickshell/ii/modules/sidebarRight/wifiNetworks/WifiNetworkItem.qml b/dots/.config/quickshell/ii/modules/ii/sidebarRight/wifiNetworks/WifiNetworkItem.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/sidebarRight/wifiNetworks/WifiNetworkItem.qml
rename to dots/.config/quickshell/ii/modules/ii/sidebarRight/wifiNetworks/WifiNetworkItem.qml
diff --git a/dots/.config/quickshell/ii/modules/verticalBar/BatteryIndicator.qml b/dots/.config/quickshell/ii/modules/ii/verticalBar/BatteryIndicator.qml
similarity index 98%
rename from dots/.config/quickshell/ii/modules/verticalBar/BatteryIndicator.qml
rename to dots/.config/quickshell/ii/modules/ii/verticalBar/BatteryIndicator.qml
index b134b12fe..d2b729244 100644
--- a/dots/.config/quickshell/ii/modules/verticalBar/BatteryIndicator.qml
+++ b/dots/.config/quickshell/ii/modules/ii/verticalBar/BatteryIndicator.qml
@@ -3,7 +3,7 @@ import qs.modules.common.widgets
import qs.services
import QtQuick
import QtQuick.Layouts
-import qs.modules.bar as Bar
+import qs.modules.ii.bar as Bar
MouseArea {
id: root
diff --git a/dots/.config/quickshell/ii/modules/verticalBar/Resource.qml b/dots/.config/quickshell/ii/modules/ii/verticalBar/Resource.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/verticalBar/Resource.qml
rename to dots/.config/quickshell/ii/modules/ii/verticalBar/Resource.qml
diff --git a/dots/.config/quickshell/ii/modules/verticalBar/Resources.qml b/dots/.config/quickshell/ii/modules/ii/verticalBar/Resources.qml
similarity index 97%
rename from dots/.config/quickshell/ii/modules/verticalBar/Resources.qml
rename to dots/.config/quickshell/ii/modules/ii/verticalBar/Resources.qml
index ddbb1c399..353874723 100644
--- a/dots/.config/quickshell/ii/modules/verticalBar/Resources.qml
+++ b/dots/.config/quickshell/ii/modules/ii/verticalBar/Resources.qml
@@ -2,7 +2,7 @@ import qs.services
import qs.modules.common
import QtQuick
import QtQuick.Layouts
-import qs.modules.bar as Bar
+import qs.modules.ii.bar as Bar
MouseArea {
id: root
diff --git a/dots/.config/quickshell/ii/modules/verticalBar/VerticalBar.qml b/dots/.config/quickshell/ii/modules/ii/verticalBar/VerticalBar.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/verticalBar/VerticalBar.qml
rename to dots/.config/quickshell/ii/modules/ii/verticalBar/VerticalBar.qml
diff --git a/dots/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml b/dots/.config/quickshell/ii/modules/ii/verticalBar/VerticalBarContent.qml
similarity index 98%
rename from dots/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml
rename to dots/.config/quickshell/ii/modules/ii/verticalBar/VerticalBarContent.qml
index ac6be80cd..d3326188e 100644
--- a/dots/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml
+++ b/dots/.config/quickshell/ii/modules/ii/verticalBar/VerticalBarContent.qml
@@ -8,7 +8,7 @@ import qs.services
import qs.modules.common
import qs.modules.common.widgets
import qs.modules.common.functions
-import qs.modules.bar as Bar
+import qs.modules.ii.bar as Bar
Item { // Bar content region
id: root
@@ -148,11 +148,11 @@ Item { // Bar content region
}
HorizontalBarSeparator {
- visible: UPower.displayDevice.isLaptopBattery
+ visible: Battery.available
}
BatteryIndicator {
- visible: UPower.displayDevice.isLaptopBattery
+ visible: Battery.available
Layout.fillWidth: true
Layout.fillHeight: false
}
diff --git a/dots/.config/quickshell/ii/modules/verticalBar/VerticalClockWidget.qml b/dots/.config/quickshell/ii/modules/ii/verticalBar/VerticalClockWidget.qml
similarity index 97%
rename from dots/.config/quickshell/ii/modules/verticalBar/VerticalClockWidget.qml
rename to dots/.config/quickshell/ii/modules/ii/verticalBar/VerticalClockWidget.qml
index 921f63603..15a49c5a5 100644
--- a/dots/.config/quickshell/ii/modules/verticalBar/VerticalClockWidget.qml
+++ b/dots/.config/quickshell/ii/modules/ii/verticalBar/VerticalClockWidget.qml
@@ -3,7 +3,7 @@ import qs.modules.common.widgets
import qs.services
import QtQuick
import QtQuick.Layouts
-import qs.modules.bar as Bar
+import qs.modules.ii.bar as Bar
Item {
id: root
diff --git a/dots/.config/quickshell/ii/modules/verticalBar/VerticalDateWidget.qml b/dots/.config/quickshell/ii/modules/ii/verticalBar/VerticalDateWidget.qml
similarity index 98%
rename from dots/.config/quickshell/ii/modules/verticalBar/VerticalDateWidget.qml
rename to dots/.config/quickshell/ii/modules/ii/verticalBar/VerticalDateWidget.qml
index aaf17ca4f..bf76ebe67 100644
--- a/dots/.config/quickshell/ii/modules/verticalBar/VerticalDateWidget.qml
+++ b/dots/.config/quickshell/ii/modules/ii/verticalBar/VerticalDateWidget.qml
@@ -4,7 +4,7 @@ import qs.services
import QtQuick
import QtQuick.Shapes
import QtQuick.Layouts
-import qs.modules.bar as Bar
+import qs.modules.ii.bar as Bar
Item { // Full hitbox
id: root
diff --git a/dots/.config/quickshell/ii/modules/verticalBar/VerticalMedia.qml b/dots/.config/quickshell/ii/modules/ii/verticalBar/VerticalMedia.qml
similarity index 98%
rename from dots/.config/quickshell/ii/modules/verticalBar/VerticalMedia.qml
rename to dots/.config/quickshell/ii/modules/ii/verticalBar/VerticalMedia.qml
index 677941d64..8d38caa76 100644
--- a/dots/.config/quickshell/ii/modules/verticalBar/VerticalMedia.qml
+++ b/dots/.config/quickshell/ii/modules/ii/verticalBar/VerticalMedia.qml
@@ -8,7 +8,7 @@ import QtQuick
import QtQuick.Layouts
import Quickshell.Services.Mpris
-import qs.modules.bar as Bar
+import qs.modules.ii.bar as Bar
MouseArea {
id: root
diff --git a/dots/.config/quickshell/ii/modules/wallpaperSelector/WallpaperDirectoryItem.qml b/dots/.config/quickshell/ii/modules/ii/wallpaperSelector/WallpaperDirectoryItem.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/wallpaperSelector/WallpaperDirectoryItem.qml
rename to dots/.config/quickshell/ii/modules/ii/wallpaperSelector/WallpaperDirectoryItem.qml
diff --git a/dots/.config/quickshell/ii/modules/wallpaperSelector/WallpaperSelector.qml b/dots/.config/quickshell/ii/modules/ii/wallpaperSelector/WallpaperSelector.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/wallpaperSelector/WallpaperSelector.qml
rename to dots/.config/quickshell/ii/modules/ii/wallpaperSelector/WallpaperSelector.qml
diff --git a/dots/.config/quickshell/ii/modules/wallpaperSelector/WallpaperSelectorContent.qml b/dots/.config/quickshell/ii/modules/ii/wallpaperSelector/WallpaperSelectorContent.qml
similarity index 100%
rename from dots/.config/quickshell/ii/modules/wallpaperSelector/WallpaperSelectorContent.qml
rename to dots/.config/quickshell/ii/modules/ii/wallpaperSelector/WallpaperSelectorContent.qml
diff --git a/dots/.config/quickshell/ii/modules/settings/BackgroundConfig.qml b/dots/.config/quickshell/ii/modules/settings/BackgroundConfig.qml
index 3b388583f..ec9dc320d 100644
--- a/dots/.config/quickshell/ii/modules/settings/BackgroundConfig.qml
+++ b/dots/.config/quickshell/ii/modules/settings/BackgroundConfig.qml
@@ -97,6 +97,15 @@ ContentPage {
}
}
+ ConfigSwitch {
+ buttonIcon: "lock_clock"
+ text: Translation.tr("Show only when locked")
+ checked: Config.options.background.widgets.clock.showOnlyWhenLocked
+ onCheckedChanged: {
+ Config.options.background.widgets.clock.showOnlyWhenLocked = checked;
+ }
+ }
+
ContentSubsection {
title: Translation.tr("Clock style")
ConfigSelectionArray {
diff --git a/dots/.config/quickshell/ii/modules/settings/InterfaceConfig.qml b/dots/.config/quickshell/ii/modules/settings/InterfaceConfig.qml
index c57406a7f..1614ec47f 100644
--- a/dots/.config/quickshell/ii/modules/settings/InterfaceConfig.qml
+++ b/dots/.config/quickshell/ii/modules/settings/InterfaceConfig.qml
@@ -22,7 +22,7 @@ ContentPage {
// Use a nerdfont to see the icons
options: ([
"", "", "", "", "", "", "", "", "",
- "", "", "", "", "", "⌘", "", "", ""
+ "", "", "", "", "", "", "⌘", "", "", ""
]).map(icon => { return {
displayName: icon,
value: icon
@@ -328,6 +328,21 @@ ContentPage {
}
}
+ ContentSection {
+ icon: "point_scan"
+ title: Translation.tr("Overlay: Floating Image")
+
+ MaterialTextArea {
+ Layout.fillWidth: true
+ placeholderText: Translation.tr("Image source")
+ text: Config.options.overlay.floatingImage.imageSource
+ wrapMode: TextEdit.Wrap
+ onTextChanged: {
+ Config.options.overlay.floatingImage.imageSource = text;
+ }
+ }
+ }
+
ContentSection {
icon: "screenshot_frame_2"
title: Translation.tr("Region selector (screen snipping/Google Lens)")
diff --git a/dots/.config/quickshell/ii/modules/waffle/background/WaffleBackground.qml b/dots/.config/quickshell/ii/modules/waffle/background/WaffleBackground.qml
new file mode 100644
index 000000000..caaff1707
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/background/WaffleBackground.qml
@@ -0,0 +1,46 @@
+pragma ComponentBehavior: Bound
+
+import qs
+import qs.services
+import qs.modules.common
+import qs.modules.common.widgets
+import qs.modules.common.widgets.widgetCanvas
+import QtQuick
+import QtQuick.Layouts
+import Qt5Compat.GraphicalEffects
+import Quickshell
+import Quickshell.Io
+import Quickshell.Wayland
+import Quickshell.Hyprland
+
+import qs.modules.ii.background.widgets
+import qs.modules.ii.background.widgets.clock
+import qs.modules.ii.background.widgets.weather
+
+Variants {
+ id: root
+ model: Quickshell.screens
+
+ PanelWindow {
+ id: panelRoot
+ required property var modelData
+
+ screen: modelData
+ exclusionMode: ExclusionMode.Ignore
+ WlrLayershell.layer: WlrLayer.Bottom
+ WlrLayershell.namespace: "quickshell:background"
+ anchors {
+ top: true
+ bottom: true
+ left: true
+ right: true
+ }
+ color: "transparent"
+
+ StyledImage {
+ anchors.fill: parent
+ source: Config.options.background.wallpaperPath
+ fillMode: Image.PreserveAspectCrop
+ }
+ }
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/bar/AppButton.qml b/dots/.config/quickshell/ii/modules/waffle/bar/AppButton.qml
new file mode 100644
index 000000000..a35e12a2e
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/bar/AppButton.qml
@@ -0,0 +1,86 @@
+import QtQuick
+import QtQuick.Layouts
+import Qt5Compat.GraphicalEffects
+import org.kde.kirigami as Kirigami
+import qs.services
+import qs.modules.common
+import qs.modules.waffle.looks
+
+BarButton {
+ id: root
+
+ required property string iconName
+ property bool multiple: false
+ property bool separateLightDark: false
+ property alias tryCustomIcon: iconWidget.tryCustomIcon
+ leftInset: 2
+ rightInset: 2
+ implicitWidth: height - topInset - bottomInset + leftInset + rightInset
+
+ onDownChanged: {
+ scaleAnim.duration = root.down ? 150 : 200
+ scaleAnim.easing.bezierCurve = root.down ? Looks.transition.easing.bezierCurve.easeIn : Looks.transition.easing.bezierCurve.easeOut
+ contentItem.scale = root.down ? 5/6 : 1 // If/When we do dragging, the scale is 1.25
+ }
+
+ background: Item {
+ BackgroundAcrylicRectangle {
+ id: mainBgRect
+ anchors.fill: parent
+ layer.enabled: root.multiple
+ layer.effect: OpacityMask {
+ invert: true
+ maskSource: Item {
+ width: mainBgRect.width
+ height: mainBgRect.height
+ Rectangle {
+ anchors.fill: parent
+ anchors.rightMargin: 3
+ radius: mainBgRect.radius
+ }
+ }
+ }
+ }
+ Loader {
+ anchors.fill: parent
+ anchors.rightMargin: 5
+ active: root.multiple
+ sourceComponent: BackgroundAcrylicRectangle {
+
+ }
+ }
+ }
+
+ contentItem: Item {
+ id: contentItem
+ anchors.centerIn: parent
+
+ implicitHeight: iconWidget.implicitHeight
+ implicitWidth: iconWidget.implicitWidth
+
+ Behavior on scale {
+ NumberAnimation {
+ id: scaleAnim
+ easing.type: Easing.BezierSpline
+ }
+ }
+
+ AppIcon {
+ id: iconWidget
+ anchors.centerIn: parent
+ iconName: root.iconName
+ separateLightDark: root.separateLightDark
+ }
+ }
+
+ component BackgroundAcrylicRectangle: AcrylicRectangle {
+ shiny: ((root.hovered && !root.down) || root.checked)
+ color: root.colBackground
+ border.width: 1
+ border.color: root.colBackgroundBorder
+
+ Behavior on border.color {
+ animation: Looks.transition.color.createObject(this)
+ }
+ }
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/bar/AppIcon.qml b/dots/.config/quickshell/ii/modules/waffle/bar/AppIcon.qml
new file mode 100644
index 000000000..f70a80603
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/bar/AppIcon.qml
@@ -0,0 +1,19 @@
+import QtQuick
+import org.kde.kirigami as Kirigami
+import qs.services
+import qs.modules.common
+import qs.modules.waffle.looks
+
+Kirigami.Icon {
+ id: root
+ required property string iconName
+ property bool separateLightDark: false
+ property bool tryCustomIcon: true
+
+ property real implicitSize: 26
+ implicitWidth: implicitSize
+ implicitHeight: implicitSize
+ roundToIconSize: false
+ fallback: root.iconName
+ source: tryCustomIcon ? `${Looks.iconsPath}/${root.iconName}${!root.separateLightDark ? "" : Looks.dark ? "-dark" : "-light"}.svg` : fallback
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/bar/BarButton.qml b/dots/.config/quickshell/ii/modules/waffle/bar/BarButton.qml
new file mode 100644
index 000000000..ce1a4cdc7
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/bar/BarButton.qml
@@ -0,0 +1,77 @@
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import qs.modules.common
+import qs.modules.common.functions
+import qs.modules.waffle.looks
+
+Button {
+ id: root
+
+ signal altAction()
+ signal middleClickAction()
+
+ property color colBackground
+ property color colBackgroundBorder
+ Layout.fillHeight: true
+ topInset: 4
+ bottomInset: 4
+
+ signal hoverTimedOut()
+ property bool shouldShowTooltip: false
+ property Timer hoverTimer: Timer {
+ id: hoverTimer
+ running: root.hovered
+ interval: 400
+ onTriggered: {
+ root.hoverTimedOut()
+ }
+ }
+ onHoverTimedOut: {
+ root.shouldShowTooltip = true
+ }
+ onHoveredChanged: {
+ if (!root.hovered) {
+ root.shouldShowTooltip = false
+ root.hoverTimer.stop()
+ }
+ }
+
+ colBackground: {
+ if (root.down) {
+ return Looks.colors.bg1Active
+ } else if ((root.hovered && !root.down) || root.checked) {
+ return Looks.colors.bg1Hover
+ } else {
+ return ColorUtils.transparentize(Looks.colors.bg1)
+ }
+ }
+ colBackgroundBorder: ColorUtils.transparentize(Looks.colors.bg1Border, root.checked ? Looks.contentTransparency : 1)
+
+ MouseArea {
+ anchors.fill: parent
+ acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
+ onPressed: (event) => {
+ root.down = true;
+ }
+ onReleased: (event) => {
+ root.down = false;
+ }
+ onClicked: (event) => {
+ if (event.button === Qt.LeftButton) root.clicked();
+ if (event.button === Qt.RightButton) root.altAction();
+ if (event.button === Qt.MiddleButton) root.middleClickAction();
+ }
+ }
+
+ background: AcrylicRectangle {
+ shiny: ((root.hovered && !root.down) || root.checked)
+ color: root.colBackground
+ border.width: 1
+ border.color: root.colBackgroundBorder
+
+ Behavior on border.color {
+ animation: Looks.transition.color.createObject(this)
+ }
+ }
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/bar/BarToolTip.qml b/dots/.config/quickshell/ii/modules/waffle/bar/BarToolTip.qml
new file mode 100644
index 000000000..d38566fdd
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/bar/BarToolTip.qml
@@ -0,0 +1,8 @@
+import QtQuick
+import Quickshell
+import qs.modules.common
+import qs.modules.waffle.looks
+
+WPopupToolTip {
+ anchorEdges: Config.options.waffles.bar.bottom ? Edges.Top : Edges.Bottom
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/bar/SearchButton.qml b/dots/.config/quickshell/ii/modules/waffle/bar/SearchButton.qml
new file mode 100644
index 000000000..a86faaece
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/bar/SearchButton.qml
@@ -0,0 +1,24 @@
+import QtQuick
+import QtQuick.Layouts
+import org.kde.kirigami as Kirigami
+import qs
+import qs.services
+import qs.modules.common
+import qs.modules.waffle.looks
+
+AppButton {
+ id: root
+
+ iconName: "system-search"
+ separateLightDark: true
+
+ onClicked: {
+ GlobalStates.overviewOpen = !GlobalStates.overviewOpen; // For now...
+ }
+
+ BarToolTip {
+ id: tooltip
+ text: Translation.tr("Search")
+ extraVisibleCondition: root.shouldShowTooltip
+ }
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/bar/StartButton.qml b/dots/.config/quickshell/ii/modules/waffle/bar/StartButton.qml
new file mode 100644
index 000000000..4595802ee
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/bar/StartButton.qml
@@ -0,0 +1,24 @@
+import QtQuick
+import QtQuick.Layouts
+import org.kde.kirigami as Kirigami
+import qs
+import qs.services
+import qs.modules.common
+import qs.modules.waffle.looks
+
+AppButton {
+ id: root
+
+ leftInset: Config.options.waffles.bar.leftAlignApps ? 12 : 0
+ iconName: "start-here"
+
+ onClicked: {
+ GlobalStates.overviewOpen = !GlobalStates.overviewOpen; // For now...
+ }
+
+ BarToolTip {
+ id: tooltip
+ text: Translation.tr("Start")
+ extraVisibleCondition: root.shouldShowTooltip
+ }
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/bar/SystemButton.qml b/dots/.config/quickshell/ii/modules/waffle/bar/SystemButton.qml
new file mode 100644
index 000000000..1de9654d5
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/bar/SystemButton.qml
@@ -0,0 +1,95 @@
+import QtQuick
+import QtQuick.Layouts
+import qs
+import qs.services
+import qs.modules.common
+import qs.modules.waffle.looks
+
+BarButton {
+ id: root
+
+ checked: GlobalStates.sidebarRightOpen
+ onClicked: {
+ GlobalStates.sidebarRightOpen = !GlobalStates.sidebarRightOpen; // For now...
+ }
+
+ contentItem: Item {
+ anchors.fill: parent
+ implicitHeight: column.implicitHeight
+ implicitWidth: column.implicitWidth
+ Row {
+ id: column
+ anchors {
+ top: parent.top
+ bottom: parent.bottom
+ horizontalCenter: parent.horizontalCenter
+ }
+ spacing: 4
+
+ IconHoverArea {
+ id: internetHoverArea
+ iconItem: FluentIcon {
+ anchors.verticalCenter: parent.verticalCenter
+ icon: WIcons.internetIcon
+ }
+ }
+
+ IconHoverArea {
+ id: volumeHoverArea
+ iconItem: FluentIcon {
+ anchors.verticalCenter: parent.verticalCenter
+ icon: {
+ const muted = Audio.sink?.audio.muted ?? false;
+ const volume = Audio.sink?.audio.volume ?? 0;
+ if (muted)
+ return volume > 0 ? "speaker-off" : "speaker-none";
+ if (volume == 0)
+ return "speaker-none";
+ if (volume < 0.5)
+ return "speaker-1";
+ return "speaker";
+ }
+ }
+ }
+
+ IconHoverArea {
+ id: batteryHoverArea
+ iconItem: FluentIcon {
+ anchors.verticalCenter: parent.verticalCenter
+ icon: WIcons.batteryIcon
+ }
+ }
+ }
+ }
+
+ component IconHoverArea: MouseArea {
+ id: hoverArea
+ required property var iconItem
+ anchors {
+ top: parent.top
+ bottom: parent.bottom
+ }
+ hoverEnabled: true
+ implicitHeight: hoverArea.iconItem.implicitHeight
+ implicitWidth: hoverArea.iconItem.implicitWidth
+
+ onPressed: (event) => event.accepted = false; // Don't consume clicks
+
+ children: [iconItem]
+ }
+
+ BarToolTip {
+ extraVisibleCondition: root.shouldShowTooltip && internetHoverArea.containsMouse
+ text: Translation.tr("%1\nInternet access").arg(Network.ethernet ? Translation.tr("Network") : Network.networkName)
+ }
+ BarToolTip {
+ extraVisibleCondition: root.shouldShowTooltip && volumeHoverArea.containsMouse
+ text: Translation.tr("Speakers (%1): %2") //
+ .arg(Audio.sink?.nickname || Audio.sink?.description || Translation.tr("Unknown")) //
+ .arg(`${Math.round(Audio.sink?.audio.volume * 100) || 0}%`) //
+ }
+ BarToolTip {
+ extraVisibleCondition: root.shouldShowTooltip && batteryHoverArea.containsMouse
+ text: Translation.tr("Battery: %1").arg(`${Math.round(Battery.percentage * 100) || 0}%`)
+ }
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/bar/TaskViewButton.qml b/dots/.config/quickshell/ii/modules/waffle/bar/TaskViewButton.qml
new file mode 100644
index 000000000..cc35c8b41
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/bar/TaskViewButton.qml
@@ -0,0 +1,24 @@
+import QtQuick
+import QtQuick.Layouts
+import org.kde.kirigami as Kirigami
+import qs
+import qs.services
+import qs.modules.common
+import qs.modules.waffle.looks
+
+AppButton {
+ id: root
+
+ iconName: "task-view"
+ separateLightDark: true
+
+ checked: GlobalStates.overviewOpen
+ onClicked: {
+ GlobalStates.overviewOpen = !GlobalStates.overviewOpen;
+ }
+
+ BarToolTip {
+ extraVisibleCondition: root.shouldShowTooltip
+ text: Translation.tr("Task View") // Should be a preview of workspaces, but we'll have this for now...
+ }
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/bar/TimeButton.qml b/dots/.config/quickshell/ii/modules/waffle/bar/TimeButton.qml
new file mode 100644
index 000000000..bb813c85c
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/bar/TimeButton.qml
@@ -0,0 +1,42 @@
+import QtQuick
+import QtQuick.Layouts
+import qs
+import qs.services
+import qs.modules.common
+import qs.modules.waffle.looks
+
+BarButton {
+ id: root
+
+ rightInset: 12 // For now this is the rightmost button. Desktop peek is useless. (for now)
+ padding: 12
+
+ checked: GlobalStates.sidebarRightOpen
+ onClicked: {
+ GlobalStates.sidebarRightOpen = !GlobalStates.sidebarRightOpen;
+ }
+
+ contentItem: Item {
+ anchors.centerIn: root.background
+ implicitHeight: column.implicitHeight
+ implicitWidth: column.implicitWidth
+ Column {
+ id: column
+ anchors.centerIn: parent
+ WText {
+ anchors.right: parent.right
+ text: DateTime.time
+ }
+ WText {
+ anchors.right: parent.right
+ text: DateTime.date
+ }
+ }
+ }
+
+ BarToolTip {
+ id: tooltip
+ extraVisibleCondition: root.shouldShowTooltip
+ text: `${Qt.locale().toString(DateTime.clock.date, "dddd, MMMM d, yyyy")}\n\n${Qt.locale().toString(DateTime.clock.date, "ddd hh:mm AP")}`
+ }
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/bar/WaffleBar.qml b/dots/.config/quickshell/ii/modules/waffle/bar/WaffleBar.qml
new file mode 100644
index 000000000..aa5f51f68
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/bar/WaffleBar.qml
@@ -0,0 +1,89 @@
+import QtQuick
+import Quickshell
+import Quickshell.Io
+import Quickshell.Wayland
+import Quickshell.Hyprland
+import qs
+import qs.services
+import qs.modules.common
+import qs.modules.common.widgets
+
+Scope {
+ id: bar
+ property bool showBarBackground: Config.options.bar.showBackground
+
+ LazyLoader {
+ id: barLoader
+ active: GlobalStates.barOpen && !GlobalStates.screenLocked
+ component: Variants {
+ model: Quickshell.screens
+ delegate: PanelWindow { // Bar window
+ id: barRoot
+ required property var modelData
+ screen: modelData
+ exclusionMode: ExclusionMode.Ignore
+ exclusiveZone: implicitHeight
+ WlrLayershell.namespace: "quickshell:bar"
+
+ anchors {
+ left: true
+ right: true
+ bottom: Config.options.waffles.bar.bottom
+ top: !Config.options.waffles.bar.bottom
+ }
+
+ color: "transparent"
+ implicitHeight: content.implicitHeight
+ implicitWidth: content.implicitWidth
+
+ WaffleBarContent {
+ id: content
+ anchors.fill: parent
+ }
+ }
+ }
+ }
+
+ IpcHandler {
+ target: "bar"
+
+ function toggle(): void {
+ GlobalStates.barOpen = !GlobalStates.barOpen
+ }
+
+ function close(): void {
+ GlobalStates.barOpen = false
+ }
+
+ function open(): void {
+ GlobalStates.barOpen = true
+ }
+ }
+
+ GlobalShortcut {
+ name: "barToggle"
+ description: "Toggles bar on press"
+
+ onPressed: {
+ GlobalStates.barOpen = !GlobalStates.barOpen;
+ }
+ }
+
+ GlobalShortcut {
+ name: "barOpen"
+ description: "Opens bar on press"
+
+ onPressed: {
+ GlobalStates.barOpen = true;
+ }
+ }
+
+ GlobalShortcut {
+ name: "barClose"
+ description: "Closes bar on press"
+
+ onPressed: {
+ GlobalStates.barOpen = false;
+ }
+ }
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/bar/WaffleBarContent.qml b/dots/.config/quickshell/ii/modules/waffle/bar/WaffleBarContent.qml
new file mode 100644
index 000000000..aa064118a
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/bar/WaffleBarContent.qml
@@ -0,0 +1,80 @@
+import QtQuick
+import QtQuick.Layouts
+import qs.modules.common
+import qs.modules.common.widgets
+import qs.modules.waffle.looks
+import qs.modules.waffle.bar.tasks
+
+Rectangle {
+ id: root
+
+ color: Looks.colors.bg0
+ implicitHeight: 48
+
+ Rectangle {
+ id: border
+ anchors {
+ left: parent.left
+ right: parent.right
+ top: Config.options.waffles.bar.bottom ? parent.top : undefined
+ bottom: Config.options.waffles.bar.bottom ? undefined : parent.bottom
+ }
+ color: Looks.colors.bg0Border
+ implicitHeight: 1
+ }
+
+ BarGroupRow {
+ id: bloatRow
+ anchors.left: parent.left
+ opacity: Config.options.waffles.bar.leftAlignApps ? 0 : 1
+ visible: opacity > 0
+ Behavior on opacity {
+ animation: Looks.transition.opacity.createObject(this)
+ }
+
+ WidgetsButton {}
+ }
+
+ BarGroupRow {
+ id: appsRow
+ anchors.left: undefined
+ anchors.horizontalCenter: parent.horizontalCenter
+
+ states: State {
+ name: "left"
+ when: Config.options.waffles.bar.leftAlignApps
+ AnchorChanges {
+ target: appsRow
+ anchors.left: parent.left
+ anchors.horizontalCenter: undefined
+ }
+ }
+
+ transitions: Transition {
+ animations: Looks.transition.anchor.createObject(this)
+ }
+
+ StartButton {}
+ SearchButton {}
+ TaskViewButton {}
+ Tasks {}
+ }
+
+ BarGroupRow {
+ id: systemRow
+ anchors.right: parent.right
+ FadeLoader {
+ Layout.fillHeight: true
+ shown: Config.options.waffles.bar.leftAlignApps
+ sourceComponent: WidgetsButton {}
+ }
+ SystemButton {}
+ TimeButton {}
+ }
+
+ component BarGroupRow: RowLayout {
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ spacing: 0
+ }
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/bar/WidgetsButton.qml b/dots/.config/quickshell/ii/modules/waffle/bar/WidgetsButton.qml
new file mode 100644
index 000000000..1c6c11859
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/bar/WidgetsButton.qml
@@ -0,0 +1,60 @@
+import QtQuick
+import QtQuick.Layouts
+import org.kde.kirigami as Kirigami
+import qs
+import qs.services
+import qs.modules.common
+import qs.modules.waffle.looks
+
+AppButton {
+ id: root
+
+ readonly property bool expandedForm: Config.options.waffles.bar.leftAlignApps
+ leftInset: Config.options.waffles.bar.leftAlignApps ? 0 : 12
+ implicitWidth: expandedForm ? 148 : (height - topInset - bottomInset + leftInset + rightInset)
+ iconName: "widgets"
+
+ checked: GlobalStates.sidebarLeftOpen
+ onClicked: {
+ GlobalStates.sidebarLeftOpen = !GlobalStates.sidebarLeftOpen
+ }
+
+ contentItem: Item {
+ anchors {
+ verticalCenter: parent.verticalCenter
+ left: root.expandedForm ? parent.left : undefined
+ horizontalCenter: root.expandedForm ? undefined : background.horizontalCenter
+ }
+ implicitHeight: row.implicitHeight
+ implicitWidth: row.implicitWidth
+ Row {
+ id: row
+ anchors {
+ verticalCenter: parent.verticalCenter
+ left: root.expandedForm ? parent.left : undefined
+ horizontalCenter: root.expandedForm ? undefined : parent.horizontalCenter
+ margins: 8
+ }
+ spacing: 6
+
+ AppIcon {
+ id: iconWidget
+ anchors.verticalCenter: parent.verticalCenter
+ iconName: root.iconName
+ }
+
+ Column {
+ visible: root.expandedForm
+ anchors.verticalCenter: parent.verticalCenter
+ WText {
+ text: Translation.tr("Widgets")
+ }
+ }
+ }
+ }
+
+ BarToolTip {
+ extraVisibleCondition: root.shouldShowTooltip
+ text: Translation.tr("Widgets")
+ }
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/bar/tasks/TaskAppButton.qml b/dots/.config/quickshell/ii/modules/waffle/bar/tasks/TaskAppButton.qml
new file mode 100644
index 000000000..53b68b82c
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/bar/tasks/TaskAppButton.qml
@@ -0,0 +1,77 @@
+import QtQuick
+import QtQuick.Layouts
+import qs.services
+import qs.modules.common
+import qs.modules.waffle.looks
+import qs.modules.waffle.bar
+import Quickshell
+
+AppButton {
+ id: root
+
+ required property var appEntry
+ readonly property bool isSeparator: appEntry.appId === "SEPARATOR"
+ readonly property var desktopEntry: DesktopEntries.heuristicLookup(appEntry.appId)
+ property bool active: root.appEntry.toplevels.some(t => t.activated)
+ property bool hasWindows: appEntry.toplevels.length > 0
+
+ signal hoverPreviewRequested()
+
+ multiple: appEntry.toplevels.length > 1
+ checked: active
+ iconName: AppSearch.guessIcon(appEntry.appId)
+ tryCustomIcon: false
+
+ onHoverTimedOut: {
+ root.hoverPreviewRequested()
+ }
+
+ onClicked: {
+ root.hoverTimer.stop() // Prevents preview showing up when clicking to focus
+ if (root.multiple) {
+ root.hoverPreviewRequested()
+ } else if (root.appEntry.toplevels.length === 1) {
+ root.appEntry.toplevels[0].activate()
+ } else {
+ root.desktopEntry.execute()
+ }
+ }
+
+ onMiddleClickAction: {
+ if (root.desktopEntry) {
+ desktopEntry.execute()
+ }
+ }
+
+ // Active indicator
+ Rectangle {
+ id: activeIndicator
+ opacity: root.hasWindows ? 1 : 0
+ anchors {
+ horizontalCenter: root.background.horizontalCenter
+ bottom: root.background.bottom
+ bottomMargin: 1
+ }
+
+ implicitWidth: root.active ? 16 : 6
+ implicitHeight: 3
+ radius: height / 2
+
+ color: root.active ? Looks.colors.accent : Looks.colors.accentUnfocused
+
+ Behavior on implicitWidth {
+ animation: Looks.transition.enter.createObject(this)
+ }
+ Behavior on color {
+ animation: Looks.transition.color.createObject(this)
+ }
+ Behavior on opacity {
+ animation: Looks.transition.opacity.createObject(this)
+ }
+ }
+
+ BarToolTip {
+ extraVisibleCondition: root.shouldShowTooltip && !root.hasWindows
+ text: desktopEntry ? desktopEntry.name : appEntry.appId
+ }
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/bar/tasks/TaskPreview.qml b/dots/.config/quickshell/ii/modules/waffle/bar/tasks/TaskPreview.qml
new file mode 100644
index 000000000..6d8aeba1a
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/bar/tasks/TaskPreview.qml
@@ -0,0 +1,128 @@
+import QtQuick
+import QtQuick.Layouts
+import Qt5Compat.GraphicalEffects
+import qs.services
+import qs.modules.common
+import qs.modules.common.functions
+import qs.modules.waffle.looks
+import Quickshell
+
+PopupWindow {
+ id: root
+
+ ///////////////////// Properties ////////////////////
+ required property bool tasksHovered
+ property var appEntry
+ property Item anchorItem
+
+ //////////////////// Functions ////////////////////
+ function close() {
+ marginBehavior.enabled = false;
+ root.visible = false;
+ }
+
+ function open() {
+ marginBehavior.enabled = true;
+ root.visible = true;
+ }
+
+ function show(appEntry: var, button: Item) {
+ root.appEntry = appEntry;
+ root.anchorItem = button;
+ root.anchor.updateAnchor();
+ root.open();
+ }
+
+ ///////////////////// Internals /////////////////////
+ readonly property bool bottom: Config.options.waffles.bar.bottom
+ property real visualMargin: 12
+ property alias ambientShadowWidth: ambientShadow.border.width
+
+ visible: false
+ color: "transparent"
+ implicitWidth: contentItem.implicitWidth + ambientShadowWidth + (visualMargin * 2)
+ implicitHeight: contentItem.implicitHeight + ambientShadowWidth + (visualMargin * 2)
+ anchor {
+ adjustment: PopupAdjustment.Slide
+ item: root.anchorItem
+ gravity: bottom ? Edges.Top : Edges.Bottom
+ edges: bottom ? Edges.Top : Edges.Bottom
+ }
+
+ Timer {
+ interval: 250
+ running: root.visible && !hoverChecker.containsMouse && !root.tasksHovered
+ onTriggered: {
+ root.close();
+ }
+ }
+
+ // Content
+ MouseArea {
+ id: hoverChecker
+ anchors.fill: parent
+ hoverEnabled: true
+
+ // Shadow
+ Rectangle {
+ id: ambientShadow
+ anchors {
+ fill: contentItem
+ margins: -border.width
+ }
+ border.color: ColorUtils.transparentize(Looks.colors.bg0Border, Looks.shadowTransparency)
+ border.width: 1
+ color: "transparent"
+ radius: Looks.radius.large + border.width
+ }
+
+ Rectangle {
+ id: contentItem
+ property real sourceEdgeMargin: root.visible ? (root.ambientShadowWidth + root.visualMargin) : -root.implicitHeight
+ Behavior on sourceEdgeMargin {
+ id: marginBehavior
+ animation: Looks.transition.enter.createObject(this)
+ }
+ anchors {
+ left: parent.left
+ right: parent.right
+ top: root.bottom ? undefined : parent.top
+ bottom: root.bottom ? parent.bottom : undefined
+ margins: root.ambientShadowWidth + root.visualMargin
+ // Opening anim
+ bottomMargin: root.bottom ? sourceEdgeMargin : (root.ambientShadowWidth + root.visualMargin)
+ topMargin: root.bottom ? (root.ambientShadowWidth + root.visualMargin) : sourceEdgeMargin
+ }
+ color: Looks.colors.bg1
+ radius: Looks.radius.large
+
+ layer.enabled: true
+ layer.effect: OpacityMask {
+ maskSource: Rectangle {
+ width: contentItem.width
+ height: contentItem.height
+ radius: contentItem.radius
+ }
+ }
+
+ // Testing
+ implicitHeight: Math.min(158, windowsRow.implicitHeight)
+ implicitWidth: windowsRow.implicitWidth
+
+ RowLayout {
+ id: windowsRow
+ anchors.fill: parent
+
+ Repeater {
+ model: ScriptModel {
+ values: root.appEntry?.toplevels ?? []
+ }
+ delegate: WindowPreview {
+ required property var modelData
+ toplevel: modelData
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/bar/tasks/Tasks.qml b/dots/.config/quickshell/ii/modules/waffle/bar/tasks/Tasks.qml
new file mode 100644
index 000000000..895b1353f
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/bar/tasks/Tasks.qml
@@ -0,0 +1,49 @@
+import QtQuick
+import QtQuick.Layouts
+import Quickshell
+import qs.services
+import qs.modules.common
+import qs.modules.waffle.looks
+
+MouseArea {
+ id: root
+
+ Layout.fillHeight: true
+ implicitHeight: row.implicitHeight
+ implicitWidth: row.implicitWidth
+ hoverEnabled: true
+
+ function showPreviewPopup(appEntry, button) {
+ previewPopup.show(appEntry, button);
+ }
+
+ // Apps row
+ RowLayout {
+ id: row
+ anchors.fill: parent
+ spacing: 0
+
+ Repeater {
+ // TODO: Include only apps (and windows) in current workspace only | wait, does that even make sense in a Hyprland workflow?
+ model: ScriptModel {
+ objectProp: "appId"
+ values: TaskbarApps.apps.filter(app => app.appId !== "SEPARATOR")
+ }
+ delegate: TaskAppButton {
+ required property var modelData
+ appEntry: modelData
+
+ onHoverPreviewRequested: {
+ root.showPreviewPopup(appEntry, this)
+ }
+ }
+ }
+ }
+
+ // Previews popup
+ TaskPreview {
+ id: previewPopup
+ tasksHovered: root.containsMouse
+ anchor.window: root.QsWindow.window
+ }
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/bar/tasks/WindowPreview.qml b/dots/.config/quickshell/ii/modules/waffle/bar/tasks/WindowPreview.qml
new file mode 100644
index 000000000..2839a6747
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/bar/tasks/WindowPreview.qml
@@ -0,0 +1,136 @@
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import Qt5Compat.GraphicalEffects
+import qs.services
+import qs.modules.common
+import qs.modules.common.functions
+import qs.modules.waffle.looks
+import qs.modules.waffle.bar
+import Quickshell
+import Quickshell.Wayland
+
+Button {
+ id: root
+
+ required property var toplevel
+ property real previewWidthConstraint: 200
+ property real previewHeightConstraint: 110
+ padding: 5
+ Layout.fillHeight: true
+
+ onClicked: {
+ root.toplevel.activate(); // TODO: make this work with those who disable focus on activate because telegram is abusive
+ }
+
+ background: Rectangle {
+ id: background
+ radius: Looks.radius.medium
+ color: root.down ? Looks.colors.bg2Active : (root.hovered ? Looks.colors.bg2Hover : ColorUtils.transparentize(Looks.colors.bg2))
+ Behavior on color {
+ animation: Looks.transition.color.createObject(this)
+ }
+ }
+
+ contentItem: ColumnLayout {
+ id: contentItem
+ anchors.fill: parent
+ anchors.margins: root.padding
+ spacing: 5
+
+ RowLayout {
+ Layout.fillWidth: true
+ Layout.fillHeight: false
+ spacing: 8
+
+ AppIcon {
+ id: appIcon
+ Layout.leftMargin: Looks.radius.large - root.padding + 2
+ Layout.alignment: Qt.AlignVCenter
+ iconName: AppSearch.guessIcon(root.toplevel.appId)
+ implicitSize: 16
+ }
+
+ Item {
+ id: appTitleContainer
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ implicitHeight: closeButton.implicitHeight // Enforce height, because closeButton doesn't contribute when it's invisible
+ WText {
+ id: appTitleText
+ anchors.fill: parent
+ text: root.toplevel.title
+ elide: Text.ElideRight
+ font.pixelSize: Looks.font.pixelSize.large
+ font.weight: Looks.font.weight.thin
+ color: Looks.colors.fg1
+ }
+ }
+
+ CloseButton {
+ id: closeButton
+ }
+ }
+
+ Item {
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ Layout.margins: Looks.radius.large - root.padding
+ Layout.topMargin: 0
+ implicitWidth: Math.max(screencopyView.implicitWidth, 80)
+ implicitHeight: screencopyView.implicitHeight
+
+ ScreencopyView {
+ id: screencopyView
+ anchors.centerIn: parent
+ captureSource: root.toplevel
+ live: true
+ paintCursor: true
+ constraintSize: Qt.size(root.previewWidthConstraint, root.previewHeightConstraint)
+ }
+ }
+ }
+
+ component CloseButton: Button {
+ id: reusableCloseButton
+ visible: root.hovered
+ Layout.leftMargin: 4
+ implicitHeight: 30
+ implicitWidth: 30
+ onClicked: {
+ root.toplevel.close();
+ }
+
+ Rectangle {
+ z: 0
+ color: "transparent"
+ anchors.fill: closeButtonBg
+ anchors.margins: -1
+ opacity: closeButtonBg.opacity
+ border.width: 1
+ radius: closeButtonBg.radius + 1
+ border.color: Looks.colors.bg2Border
+ }
+
+ background: Rectangle {
+ id: closeButtonBg
+ z: 1
+ opacity: reusableCloseButton.hovered ? 1 : 0
+ radius: Looks.radius.large - root.padding
+ color: reusableCloseButton.pressed ? Looks.colors.dangerActive : Looks.colors.danger
+ Behavior on opacity {
+ animation: Looks.transition.opacity.createObject(this)
+ }
+ Behavior on color {
+ animation: Looks.transition.color.createObject(this)
+ }
+ }
+
+ contentItem: FluentIcon {
+ z: 2
+ anchors.centerIn: parent
+ icon: "dismiss"
+ implicitSize: 10
+ }
+ }
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/looks/AcrylicRectangle.qml b/dots/.config/quickshell/ii/modules/waffle/looks/AcrylicRectangle.qml
new file mode 100644
index 000000000..3720d6186
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/looks/AcrylicRectangle.qml
@@ -0,0 +1,63 @@
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import qs.modules.common
+import qs.modules.common.functions
+import qs.modules.waffle.looks
+
+Rectangle {
+ id: root
+
+ property bool shiny: true // Top border
+ property color borderColor: ColorUtils.transparentize(Looks.colors.bg1Border, shiny ? Looks.contentTransparency : 1)
+ color: Looks.colors.bg1Hover
+ radius: Looks.radius.medium
+ Behavior on color {
+ animation: Looks.transition.color.createObject(this)
+ }
+ Behavior on borderColor {
+ animation: Looks.transition.color.createObject(this)
+ }
+ onBorderColorChanged: {
+ borderCanvas.requestPaint();
+ }
+
+ // Top 1px border with color
+ Canvas {
+ id: borderCanvas
+ anchors.fill: parent
+ onPaint: {
+ var ctx = getContext("2d");
+ ctx.clearRect(0, 0, width, height);
+
+ var borderColor = root.borderColor;
+
+ var r = root.radius;
+ var fadeLength = Math.max(1, r);
+ var fadeLengthPercent = fadeLength / width;
+
+ // Compute normalized stops
+ var leftFadeStop = fadeLengthPercent;
+ var rightFadeStop = 1 - fadeLengthPercent;
+
+ var grad = ctx.createLinearGradient(0, 0, width, 0);
+ grad.addColorStop(0, Qt.rgba(borderColor.r, borderColor.g, borderColor.b, 0));
+ grad.addColorStop(leftFadeStop, borderColor);
+ grad.addColorStop(rightFadeStop, borderColor);
+ grad.addColorStop(1, Qt.rgba(borderColor.r, borderColor.g, borderColor.b, 0));
+
+ ctx.strokeStyle = grad;
+ ctx.lineWidth = 1;
+
+ ctx.beginPath();
+ ctx.moveTo(r, 0.5);
+ ctx.lineTo(width - r, 0.5);
+ // Top-right curve
+ ctx.arcTo(width, 0.5, width, r + 0.5, r);
+ // Top-left curve
+ ctx.moveTo(width - r, 0.5);
+ ctx.arcTo(0, 0.5, 0, r + 0.5, r);
+ ctx.stroke();
+ }
+ }
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/looks/FluentIcon.qml b/dots/.config/quickshell/ii/modules/waffle/looks/FluentIcon.qml
new file mode 100644
index 000000000..81b6ebf08
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/looks/FluentIcon.qml
@@ -0,0 +1,21 @@
+import QtQuick
+import org.kde.kirigami as Kirigami
+import qs.modules.common
+import qs.modules.waffle.looks
+
+Kirigami.Icon {
+ id: root
+ required property string icon
+ // Should be 16, but it appears the icons have some padding,
+ // Unlike the Windows-only Segoe UI icons, the open source FluentUI ones are hella small
+ property int implicitSize: 20
+ implicitWidth: implicitSize
+ implicitHeight: implicitSize
+
+ source: `${Looks.iconsPath}/${root.icon}.svg`
+ fallback: root.icon
+ roundToIconSize: false
+ color: Looks.colors.fg
+ isMask: true
+ animated: true
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/looks/Looks.qml b/dots/.config/quickshell/ii/modules/waffle/looks/Looks.qml
new file mode 100644
index 000000000..09176830f
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/looks/Looks.qml
@@ -0,0 +1,126 @@
+pragma ComponentBehavior: Bound
+pragma Singleton
+
+import QtQuick
+import Quickshell
+import qs.modules.common
+import qs.modules.common.functions
+
+Singleton {
+ id: root
+ property QtObject colors
+ property QtObject radius
+ property QtObject font
+ property QtObject transition
+ property string iconsPath: `${Directories.assetsPath}/icons/fluent`
+ property bool dark: Appearance.m3colors.darkmode
+
+ property real backgroundTransparency: 0.17
+ property real contentTransparency: 0.25
+ property real shadowTransparency: 0.6
+ colors: QtObject {
+ id: colors
+ property color bg0: root.dark ? "#1C1C1C" : "#EEEEEE"
+ property color bg0Border: root.dark ? "#404040" : "#BEBEBE"
+ property color bg1: root.dark ? "#2C2C2C" : "#F7F7F7"
+ property color bg1Hover: root.dark ? "#292929" : "#F7F7F7"
+ property color bg1Active: root.dark ? "#252525" : "#F3F3F3"
+ property color bg1Border: root.dark ? "#333333" : "#E9E9E9"
+ property color bg2: root.dark ? "#313131" : "#FBFBFB"
+ property color bg2Hover: root.dark ? "#383838" : "#FDFDFD"
+ property color bg2Active: root.dark ? "#333333" : "#FDFDFD"
+ property color bg2Border: root.dark ? "#464646" : "#EEEEEE"
+ property color fg: root.dark ? "#FFFFFF" : "#000000"
+ property color fg1: root.dark ? "#D1D1D1" : "#626262"
+ property color danger: "#C42B1C"
+ property color dangerActive: "#B62D1F"
+ // property color accent: root.dark ? "#A5C6D8" : "#5377A3"
+ property color accent: Appearance.m3colors.m3primary
+ property color accentUnfocused: root.dark ? "#989898" : "#848484"
+ }
+
+ radius: QtObject {
+ id: radius
+ property int none: 0
+ property int small: 2
+ property int medium: 4
+ property int large: 8
+ property int xLarge: 12
+ }
+
+ font: QtObject {
+ id: font
+ property QtObject family: QtObject {
+ property string ui: "Noto Sans"
+ }
+ property QtObject weight: QtObject { // Noto is not Segoe, so we might use slightly different weights
+ property int thin: Font.Normal
+ property int regular: Font.Medium
+ property int strong: Font.DemiBold
+ property int stronger: Font.Bold
+ }
+ property QtObject pixelSize: QtObject {
+ property real normal: 11
+ property real large: 15
+ }
+ }
+
+ transition: QtObject {
+ id: transition
+ property QtObject easing: QtObject {
+ property QtObject bezierCurve: QtObject {
+ readonly property list easeInOut: [0.42,0.00,0.58,1.00,1,1]
+ readonly property list easeIn: [0,1,1,1,1,1]
+ readonly property list easeOut: [1,0,1,1,1,1]
+ }
+ }
+
+ property Component color: Component {
+ ColorAnimation {
+ duration: 120
+ easing.type: Easing.BezierSpline
+ easing.bezierCurve: transition.easing.bezierCurve.easeIn
+ }
+ }
+
+ property Component opacity: Component {
+ NumberAnimation{
+ duration: 120
+ easing.type: Easing.BezierSpline
+ easing.bezierCurve: transition.easing.bezierCurve.easeIn
+ }
+ }
+
+ property Component enter: Component {
+ NumberAnimation {
+ duration: 250
+ easing.type: Easing.BezierSpline
+ easing.bezierCurve: transition.easing.bezierCurve.easeIn
+ }
+ }
+
+ property Component exit: Component {
+ NumberAnimation {
+ duration: 250
+ easing.type: Easing.BezierSpline
+ easing.bezierCurve: transition.easing.bezierCurve.easeOut
+ }
+ }
+
+ property Component move: Component {
+ NumberAnimation {
+ duration: 170
+ easing.type: Easing.BezierSpline
+ easing.bezierCurve: transition.easing.bezierCurve.easeInOut
+ }
+ }
+
+ property Component anchor: Component {
+ AnchorAnimation {
+ duration: 160
+ easing.type: Easing.BezierSpline
+ easing.bezierCurve: transition.easing.bezierCurve.easeIn
+ }
+ }
+ }
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/looks/WIcons.qml b/dots/.config/quickshell/ii/modules/waffle/looks/WIcons.qml
new file mode 100644
index 000000000..813b0a1ce
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/looks/WIcons.qml
@@ -0,0 +1,31 @@
+pragma Singleton
+import QtQuick
+import Quickshell
+import qs.services
+
+Singleton {
+ id: root
+
+ property string internetIcon: {
+ if (Network.ethernet) return "ethernet";
+ if (Network.wifiEnabled) {
+ const strength = Network.networkStrength;
+ if (strength > 75) return "wifi-1";
+ if (strength > 50) return "wifi-2";
+ if (strength > 25) return "wifi-3";
+ return "wifi-4";
+ }
+ if (Network.wifiStatus === "connecting") return "wifi-4";
+ if (Network.wifiStatus === "disconnected") return "wifi-off";
+ if (Network.wifiStatus === "disabled") return "wifi-off";
+ return "wifi-warning";
+ }
+
+ property string batteryIcon: {
+ if (Battery.isCharging) return "battery-charge";
+ if (Battery.isCriticalAndNotCharging) return "battery-warning";
+ if (Battery.percentage >= 0.9) return "battery-full";
+ return `battery-${Math.ceil(Battery.percentage * 10)}`;
+ }
+
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/looks/WPopupToolTip.qml b/dots/.config/quickshell/ii/modules/waffle/looks/WPopupToolTip.qml
new file mode 100644
index 000000000..b35258204
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/looks/WPopupToolTip.qml
@@ -0,0 +1,51 @@
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import Quickshell
+import qs.modules.common
+import qs.modules.common.functions
+import qs.modules.common.widgets
+import qs.modules.waffle.looks
+
+PopupToolTip {
+ id: root
+
+ property real padding: 2
+ verticalPadding: padding
+ horizontalPadding: padding
+
+ contentItem: Item {
+ anchors.centerIn: parent
+ implicitWidth: realContent.implicitWidth + root.verticalPadding * 2
+ implicitHeight: realContent.implicitHeight + root.horizontalPadding * 2
+
+ Rectangle {
+ id: ambientShadow
+ z: 0
+ anchors {
+ fill: realContent
+ margins: -border.width
+ }
+ border.color: ColorUtils.transparentize(Looks.colors.bg0Border, Looks.shadowTransparency)
+ border.width: 1
+ color: "transparent"
+ radius: realContent.radius + border.width
+ }
+
+ Rectangle {
+ id: realContent
+ z: 1
+ anchors.centerIn: parent
+ implicitWidth: tooltipText.implicitWidth + 10 * 2
+ implicitHeight: tooltipText.implicitHeight + 8 * 2
+ color: Looks.colors.bg1
+ radius: Looks.radius.medium
+
+ WText {
+ id: tooltipText
+ text: root.text
+ anchors.centerIn: parent
+ }
+ }
+ }
+}
diff --git a/dots/.config/quickshell/ii/modules/waffle/looks/WText.qml b/dots/.config/quickshell/ii/modules/waffle/looks/WText.qml
new file mode 100644
index 000000000..240fd63be
--- /dev/null
+++ b/dots/.config/quickshell/ii/modules/waffle/looks/WText.qml
@@ -0,0 +1,15 @@
+import QtQuick
+
+Text {
+ id: root
+
+ renderType: Text.NativeRendering
+ verticalAlignment: Text.AlignVCenter
+ color: Looks.colors.fg
+
+ font {
+ family: Looks.font.family.ui
+ pixelSize: Looks.font.pixelSize.normal
+ weight: Looks.font.weight.regular
+ }
+}
diff --git a/dots/.config/quickshell/ii/services/AppSearch.qml b/dots/.config/quickshell/ii/services/AppSearch.qml
index 196e1bed3..d67919890 100644
--- a/dots/.config/quickshell/ii/services/AppSearch.qml
+++ b/dots/.config/quickshell/ii/services/AppSearch.qml
@@ -94,7 +94,7 @@ Singleton {
if (!str || str.length == 0) return "image-missing";
// Quickshell's desktop entry lookup
- const entry = DesktopEntries.heuristicLookup(str);
+ const entry = DesktopEntries.byId(str);
if (entry) return entry.icon;
// Normal substitutions
@@ -149,8 +149,11 @@ Singleton {
if (iconExists(guess)) return guess;
}
+ // Quickshell's desktop entry lookup
+ const heuristicEntry = DesktopEntries.heuristicLookup(str);
+ if (heuristicEntry) return heuristicEntry.icon;
// Give up
- return str;
+ return "application-x-executable";
}
}
diff --git a/dots/.config/quickshell/ii/services/DateTime.qml b/dots/.config/quickshell/ii/services/DateTime.qml
index 62d296dbc..514da212b 100644
--- a/dots/.config/quickshell/ii/services/DateTime.qml
+++ b/dots/.config/quickshell/ii/services/DateTime.qml
@@ -20,7 +20,8 @@ Singleton {
}
property string time: Qt.locale().toString(clock.date, Config.options?.time.format ?? "hh:mm")
property string shortDate: Qt.locale().toString(clock.date, Config.options?.time.shortDateFormat ?? "dd/MM")
- property string date: Qt.locale().toString(clock.date, Config.options?.time.dateFormat ?? "dddd, dd/MM")
+ property string date: Qt.locale().toString(clock.date, Config.options?.time.dateWithYearFormat ?? "dd/MM/yyyy")
+ property string longDate: Qt.locale().toString(clock.date, Config.options?.time.dateFormat ?? "dddd, dd/MM")
property string collapsedCalendarFormat: Qt.locale().toString(clock.date, "dd MMMM yyyy")
property string uptime: "0h, 0m"
diff --git a/dots/.config/quickshell/ii/services/TaskbarApps.qml b/dots/.config/quickshell/ii/services/TaskbarApps.qml
new file mode 100644
index 000000000..0b5818b71
--- /dev/null
+++ b/dots/.config/quickshell/ii/services/TaskbarApps.qml
@@ -0,0 +1,60 @@
+pragma Singleton
+
+import qs.modules.common
+import QtQuick
+import Quickshell
+import Quickshell.Wayland
+
+Singleton {
+ id: root
+
+ property list apps: {
+ var map = new Map();
+
+ // Pinned apps
+ const pinnedApps = Config.options?.dock.pinnedApps ?? [];
+ for (const appId of pinnedApps) {
+ if (!map.has(appId.toLowerCase())) map.set(appId.toLowerCase(), ({
+ pinned: true,
+ toplevels: []
+ }));
+ }
+
+ // Separator
+ if (pinnedApps.length > 0) {
+ map.set("SEPARATOR", { pinned: false, toplevels: [] });
+ }
+
+ // Ignored apps
+ const ignoredRegexStrings = Config.options?.dock.ignoredAppRegexes ?? [];
+ const ignoredRegexes = ignoredRegexStrings.map(pattern => new RegExp(pattern, "i"));
+ // Open windows
+ for (const toplevel of ToplevelManager.toplevels.values) {
+ if (ignoredRegexes.some(re => re.test(toplevel.appId))) continue;
+ if (!map.has(toplevel.appId.toLowerCase())) map.set(toplevel.appId.toLowerCase(), ({
+ pinned: false,
+ toplevels: []
+ }));
+ map.get(toplevel.appId.toLowerCase()).toplevels.push(toplevel);
+ }
+
+ var values = [];
+
+ for (const [key, value] of map) {
+ values.push(appEntryComp.createObject(null, { appId: key, toplevels: value.toplevels, pinned: value.pinned }));
+ }
+
+ return values;
+ }
+
+ component TaskbarAppEntry: QtObject {
+ id: wrapper
+ required property string appId
+ required property list toplevels
+ required property bool pinned
+ }
+ Component {
+ id: appEntryComp
+ TaskbarAppEntry {}
+ }
+}
diff --git a/dots/.config/quickshell/ii/shell.qml b/dots/.config/quickshell/ii/shell.qml
index 209597fcf..ea100fdda 100644
--- a/dots/.config/quickshell/ii/shell.qml
+++ b/dots/.config/quickshell/ii/shell.qml
@@ -8,54 +8,38 @@
import qs.modules.common
-import qs.modules.background
-import qs.modules.bar
-import qs.modules.cheatsheet
-import qs.modules.dock
-import qs.modules.lock
-import qs.modules.mediaControls
-import qs.modules.notificationPopup
-import qs.modules.onScreenDisplay
-import qs.modules.onScreenKeyboard
-import qs.modules.overview
-import qs.modules.polkit
-import qs.modules.regionSelector
-import qs.modules.screenCorners
-import qs.modules.sessionScreen
-import qs.modules.sidebarLeft
-import qs.modules.sidebarRight
-import qs.modules.overlay
-import qs.modules.verticalBar
-import qs.modules.wallpaperSelector
+import qs.modules.ii.background
+import qs.modules.ii.bar
+import qs.modules.ii.cheatsheet
+import qs.modules.ii.dock
+import qs.modules.ii.lock
+import qs.modules.ii.mediaControls
+import qs.modules.ii.notificationPopup
+import qs.modules.ii.onScreenDisplay
+import qs.modules.ii.onScreenKeyboard
+import qs.modules.ii.overview
+import qs.modules.ii.polkit
+import qs.modules.ii.regionSelector
+import qs.modules.ii.screenCorners
+import qs.modules.ii.sessionScreen
+import qs.modules.ii.sidebarLeft
+import qs.modules.ii.sidebarRight
+import qs.modules.ii.overlay
+import qs.modules.ii.verticalBar
+import qs.modules.ii.wallpaperSelector
+
+import qs.modules.waffle.background
+import qs.modules.waffle.bar
import QtQuick
import QtQuick.Window
import Quickshell
+import Quickshell.Io
+import Quickshell.Hyprland
import qs.services
ShellRoot {
- // Enable/disable modules here. False = not loaded at all, so rest assured
- // no unnecessary stuff will take up memory if you decide to only use, say, the overview.
- property bool enableBar: true
- property bool enableBackground: true
- property bool enableCheatsheet: true
- property bool enableDock: true
- property bool enableLock: true
- property bool enableMediaControls: true
- property bool enableNotificationPopup: true
- property bool enablePolkit: true
- property bool enableOnScreenDisplay: true
- property bool enableOnScreenKeyboard: true
- property bool enableOverlay: true
- property bool enableOverview: true
- property bool enableRegionSelector: true
- property bool enableReloadPopup: true
- property bool enableScreenCorners: true
- property bool enableSessionScreen: true
- property bool enableSidebarLeft: true
- property bool enableSidebarRight: true
- property bool enableVerticalBar: true
- property bool enableWallpaperSelector: true
+ id: root
// Force initialization of some singletons
Component.onCompleted: {
@@ -67,25 +51,64 @@ ShellRoot {
Wallpapers.load()
}
- LazyLoader { active: enableBar && Config.ready && !Config.options.bar.vertical; component: Bar {} }
- LazyLoader { active: enableBackground; component: Background {} }
- LazyLoader { active: enableCheatsheet; component: Cheatsheet {} }
- LazyLoader { active: enableDock && Config.options.dock.enable; component: Dock {} }
- LazyLoader { active: enableLock; component: Lock {} }
- LazyLoader { active: enableMediaControls; component: MediaControls {} }
- LazyLoader { active: enableNotificationPopup; component: NotificationPopup {} }
- LazyLoader { active: enableOnScreenDisplay; component: OnScreenDisplay {} }
- LazyLoader { active: enableOnScreenKeyboard; component: OnScreenKeyboard {} }
- LazyLoader { active: enableOverlay; component: Overlay {} }
- LazyLoader { active: enableOverview; component: Overview {} }
- LazyLoader { active: enablePolkit; component: Polkit {} }
- LazyLoader { active: enableRegionSelector; component: RegionSelector {} }
- LazyLoader { active: enableReloadPopup; component: ReloadPopup {} }
- LazyLoader { active: enableScreenCorners; component: ScreenCorners {} }
- LazyLoader { active: enableSessionScreen; component: SessionScreen {} }
- LazyLoader { active: enableSidebarLeft; component: SidebarLeft {} }
- LazyLoader { active: enableSidebarRight; component: SidebarRight {} }
- LazyLoader { active: enableVerticalBar && Config.ready && Config.options.bar.vertical; component: VerticalBar {} }
- LazyLoader { active: enableWallpaperSelector; component: WallpaperSelector {} }
+ // Load enabled stuff
+ // Well, these loaders only *allow* them to be loaded, to always load or not is defined in each component
+ // The media controls for example is not loaded if it's not opened
+ PanelLoader { identifier: "iiBar"; extraCondition: !Config.options.bar.vertical; component: Bar {} }
+ PanelLoader { identifier: "iiBackground"; component: Background {} }
+ PanelLoader { identifier: "iiCheatsheet"; component: Cheatsheet {} }
+ PanelLoader { identifier: "iiDock"; extraCondition: Config.options.dock.enable; component: Dock {} }
+ PanelLoader { identifier: "iiLock"; component: Lock {} }
+ PanelLoader { identifier: "iiMediaControls"; component: MediaControls {} }
+ PanelLoader { identifier: "iiNotificationPopup"; component: NotificationPopup {} }
+ PanelLoader { identifier: "iiOnScreenDisplay"; component: OnScreenDisplay {} }
+ PanelLoader { identifier: "iiOnScreenKeyboard"; component: OnScreenKeyboard {} }
+ PanelLoader { identifier: "iiOverlay"; component: Overlay {} }
+ PanelLoader { identifier: "iiOverview"; component: Overview {} }
+ PanelLoader { identifier: "iiPolkit"; component: Polkit {} }
+ PanelLoader { identifier: "iiRegionSelector"; component: RegionSelector {} }
+ PanelLoader { identifier: "iiReloadPopup"; component: ReloadPopup {} }
+ PanelLoader { identifier: "iiScreenCorners"; component: ScreenCorners {} }
+ PanelLoader { identifier: "iiSessionScreen"; component: SessionScreen {} }
+ PanelLoader { identifier: "iiSidebarLeft"; component: SidebarLeft {} }
+ PanelLoader { identifier: "iiSidebarRight"; component: SidebarRight {} }
+ PanelLoader { identifier: "iiVerticalBar"; extraCondition: Config.options.bar.vertical; component: VerticalBar {} }
+ PanelLoader { identifier: "iiWallpaperSelector"; component: WallpaperSelector {} }
+ PanelLoader { identifier: "wBar"; component: WaffleBar {} }
+ PanelLoader { identifier: "wBackground"; component: WaffleBackground {} }
+
+ component PanelLoader: LazyLoader {
+ required property string identifier
+ property bool extraCondition: true
+ active: Config.ready && Config.options.enabledPanels.includes(identifier) && extraCondition
+ }
+
+ // Panel families
+ property list families: ["ii", "waffle"]
+ property var panelFamilies: ({
+ "ii": ["iiBar", "iiBackground", "iiCheatsheet", "iiDock", "iiLock", "iiMediaControls", "iiNotificationPopup", "iiOnScreenDisplay", "iiOnScreenKeyboard", "iiOverlay", "iiOverview", "iiPolkit", "iiRegionSelector", "iiReloadPopup", "iiScreenCorners", "iiSessionScreen", "iiSidebarLeft", "iiSidebarRight", "iiVerticalBar", "iiWallpaperSelector"],
+ "waffle": ["wBar", "wBackground", "iiCheatsheet", "iiDock", "iiLock", "iiMediaControls", "iiNotificationPopup", "iiOnScreenDisplay", "iiOnScreenKeyboard", "iiOverlay", "iiOverview", "iiPolkit", "iiRegionSelector", "iiReloadPopup", "iiSessionScreen", "iiSidebarLeft", "iiSidebarRight", "iiWallpaperSelector"],
+ })
+ function cyclePanelFamily() {
+ const currentIndex = families.indexOf(Config.options.panelFamily)
+ const nextIndex = (currentIndex + 1) % families.length
+ Config.options.panelFamily = families[nextIndex]
+ Config.options.enabledPanels = panelFamilies[Config.options.panelFamily]
+ }
+
+ IpcHandler {
+ target: "panelFamily"
+
+ function cycle(): void {
+ root.cyclePanelFamily()
+ }
+ }
+
+ GlobalShortcut {
+ name: "panelFamilyCycle"
+ description: "Cycles panel family"
+
+ onPressed: root.cyclePanelFamily()
+ }
}
diff --git a/sdata/README.md b/sdata/README.md
index 8b8226fce..bbd64edc1 100644
--- a/sdata/README.md
+++ b/sdata/README.md
@@ -1 +1,4 @@
This folder mainly contains data for the script `setup`.
+
+- TODO: output the logs to a temp file, then show the path of the file so users will be able to read it again or upload it to issue.
+- TODO: unify the message output via functions (for example `log_error`, `log_warning`).
diff --git a/sdata/deps-info.md b/sdata/deps-info.md
index 6151d6f05..475639b6e 100644
--- a/sdata/deps-info.md
+++ b/sdata/deps-info.md
@@ -1,86 +1,227 @@
-## Status: WIP
-This file was generated by AI (see [#2102](https://github.com/end-4/dots-hyprland/issues/2102)).
-It still needs manual correction.
+This file contains information about the dependencies, currently it describes about `sdata/dist-arch/`.
-## Information
-Meta-packages (from sdata/dist-arch/install-deps.sh)
-- illogical-impulse-basic
- - Purpose: Core shell tooling used by scripts (general CLI utilities, build helpers, JSON processing, etc.).
-- illogical-impulse-audio
- - Purpose: Audio stack (e.g., PipeWire/WirePlumber, mixers, control UIs) used by widgets and desktop integrations.
-- illogical-impulse-backlight
- - Purpose: Screen brightness control utilities (e.g., brightnessctl).
-- illogical-impulse-fonts-themes
- - Purpose: Fonts and themes used across the shell/widgets (Noto, emoji fonts, icon themes, GTK/Qt themes).
-- illogical-impulse-kde
- - Purpose: KDE integration bits (dialogs, theming helpers, optional browser integration).
-- illogical-impulse-portal
- - Purpose: Desktop portals (e.g., xdg-desktop-portal and Wayland compositor-specific portals).
-- illogical-impulse-python
- - Purpose: Python 3 and libs for repo Python scripts and virtualenv activation.
-- illogical-impulse-screencapture
- - Purpose: Screenshot/recording tools on Wayland (e.g., grim, slurp, wf-recorder or similar).
-- illogical-impulse-toolkit
- - Purpose: General utilities used by scripts (jq, imagemagick, bc, etc.).
-- illogical-impulse-widgets
- - Purpose: Runtime deps for Quickshell widgets and supporting tools used in the UI modules.
-- illogical-impulse-hyprland
- - Purpose: Hyprland compositor and related tools (hyprland, hyprctl, hypridle, hyprlock, hyprcursor, portals).
-- illogical-impulse-microtex-git
- - Purpose: MicroTeX-related setup used by this config (custom packaging).
-- illogical-impulse-bibata-modern-classic-bin (optional)
- - Purpose: Bibata Modern Classic mouse cursor theme (installed only if not present).
+# Meta packages
+## illogical-impulse-audio
+- `cava`
+ - Used in Quickshell config.
+- `pavucontrol-qt`
+ - Used in Hyprland and Quickshell config.
+- `wireplumber`
+ - Not explicitly used.
+- `pipewire-pulse`
+ - not explicitly used.
+- `libdbusmenu-gtk3`
+ - not explicitly used.
+- `playerctl`
+ - Used in Hyprland and Quickshell config.
-Concrete dependencies inferred from repository scripts
-- hyprland (provides hyprctl)
- - Purpose: Compositor
-- jq
- - Used by: switchwall.sh (JSON parsing), multiple scripts reading config.json, hyprctl -j output.
- - Purpose: JSON parsing and transformation.
-- matugen (AUR)
- - Used by: switchwall.sh to generate Material You colors from image or color input.
- - Purpose: Color extraction and scheme generation.
-- python (python3) + virtualenv (python-virtualenv)
- - Used by: switchwall.sh activates $ILLOGICAL_IMPULSE_VIRTUAL_ENV and runs generate_colors_material.py.
- - Purpose: Color processing
-- imagemagick (identify)
- - Used by: switchwall.sh to probe image width/height to suggest upscaling.
- - Purpose: Image metadata inspection.
-- bc
- - Used by: switchwall.sh for simple arithmetic on cursor coordinates.
- - Purpose: Shell-friendly math.
-- xdg-user-dirs (xdg-user-dir)
- - Used by: switchwall.sh to locate Pictures folder.
- - Purpose: XDG directories resolution.
-- libnotify (notify-send)
- - Used by: switchwall.sh to interactively prompt actions (install/open apps) via notifications.
- - Purpose: Desktop notifications with actions.
-- hyprpicker (AUR)
- - Used by: switchwall.sh for picking colors from screen when --color is passed without hex.
- - Purpose: On-screen color picker (Wayland).
-- mpvpaper (AUR)
- - Used by: switchwall.sh to set video wallpapers per monitor.
- - Purpose: Video wallpaper playback under Wayland.
-- ffmpeg
- - Used by: switchwall.sh to extract a frame from videos to derive colors and thumbnails.
- - Purpose: Video frame extraction and media handling.
-- kitty
- - Used by: switchwall.sh to run interactive installs or external tools in a terminal (kitty -1 ...).
- - Purpose: Terminal emulator integration.
-- kdialog (KDE)
- - Used by: switchwall.sh to open a file picker for choosing wallpapers.
- - Purpose: GUI file selection dialog.
-- glib2 (gsettings) + dconf
- - Used by: switchwall.sh to set GNOME interface color-scheme and GTK theme.
- - Purpose: System settings manipulation.
-- yay (or yay-bin from AUR)
- - Used by: sdata/dist-arch/install-deps.sh to build/install local PKGBUILDs and dependencies.
- - Purpose: AUR helper used by installer.
-- base-devel, git, makepkg (core Arch tooling)
- - Used by: sdata/dist-arch/install-deps.sh and update.sh for building AUR/PKGBUILD packages and repository management.
- - Purpose: Build toolchain and VCS for packaging.
+## illogical-impulse-backlight
+- `geoclue`
+ - Which demo agent used in Quickshell config.
+- `brightnessctl`
+ - Used in Hyprland and Quickshell config.
+- `ddcutil`
+ - Used in Quickshell config.
+
+## illogical-impulse-basic
+- `bc`
+ - Used in `quickshell/ii/scripts/colors/switchwall.sh` for example.
+- `coreutils`
+ - Too many executables involved, not sure where been used.
+- `cliphist`
+ - Used in Hyprland and Quickshell config.
+- `cmake`
+ - Used in building quickshell and MicroTeX.
+- `curl`
+ - Used in Quickshell config.
+- `wget`
+ - Used in Quickshell config.
+- `ripgrep`
+ - Not sure where been used.
+- `jq`
+ - Widely used.
+- `xdg-user-dirs`
+ - Used in Hyprland and Quickshell config.
+- `rsync`
+ - Used in install script.
+- `go-yq`
+ - Used in install script.
+
+## illogical-impulse-fonts-themes
+- `adw-gtk-theme-git`
+ - [source](https://github.com/lassekongo83/adw-gtk3)
+ - Used in Quickshell config.
+- `breeze`
+ - Used in kdeglobals config.
+- `breeze-plus`
+ - [source](https://github.com/mjkim0727/breeze-plus)
+ - Used in kde-material-you-colors config.
+- `darkly-bin`
+ - `darkly` is supposed to be set as the theme for Qt apps, just have not figured out how to properly set it yet.
+- `eza`
+ - Used in Fish config: `alias ls 'eza --icons'`
+- `fish`
+ - Widely used.
+- `fontconfig`
+ - Basic component which is nearly a must.
+- `kitty`
+ - Used in fuzzel, Hyprland, kdeglobals and Quickshell config; kitty config is also included as dots.
+- `matugen-bin`
+ - Used in Quickshell.
+- `otf-space-grotesk`
+ - [source](https://events.ccc.de/congress/2024/infos/styleguide.html)
+ - Used in Quickshell and matugen config.
+- `starship`
+ - Used in Fish config.
+- `ttf-gabarito-git`
+ - Font name: `Gabarito`
+ - Used in fuzzel and Quickshell config.
+- `ttf-jetbrains-mono-nerd`
+ - Font name: `JetBrains Mono NF`, `JetBrainsMono Nerd Font`.
+ - Used in foot, kdeglobals, kitty, qt5ct, qt6ct and Quickshell config.
+- `ttf-material-symbols-variable-git`
+ - Font name: `Material Symbols Rounded`, `Material Symbols Outlined`
+ - Used in Hyprland, matugen, Quickshell and wlogout config.
+- `ttf-readex-pro`
+ - Font name: `Readex Pro`
+ - Used in Quickshell config.
+- `ttf-roboto-flex`
+ - Font name: `Roboto Flex`
+ - Used in Hyprland, matugen and Quickshell config.
+- `ttf-rubik-vf`
+ - Font name: `Rubik`, `Rubik Light`
+ - Used in Hyprland, kdeglobals, matugen, qt5ct, qt6ct and Quickshell config.
+- `ttf-twemoji`
+ - Not explicitly used, but it may help as fallback for displaying emoji charaters.
+
+## illogical-impulse-hyprland
+- `hyprland`
+ - Surely needed.
+- `hyprsunset`
+ - Used in Quickshell config.
+- `wl-clipboard`
+ - Surely needed.
+
+## illogical-impulse-kde
+- `bluedevil`
+ - Seems not being used anywhere, maybe a part of KDE settings panel.
+- `gnome-keyring`
+ - Provide executable `gnome-keyring-daemon`, used in Hyprland and Quickshell config.
+- `networkmanager`
+ - Basic component.
+- `plasma-nm`
+ - Seems not being used anywhere, maybe a part of KDE settings panel.
+- `polkit-kde-agent`
+ - Basic component.
+- `dolphin`
+ - Used in Hyprland and Quickshell config.
+- `systemsettings`
+ - Used in Hyprland `keybinds.conf`.
-Notes
-- Some Hyprland-adjacent packages appear in a legacy removal list as -git variants (e.g., hypridle, hyprlock, xdg-desktop-portal-hyprland). This suggests the meta-packages likely standardized on stable repo versions now.
-- Exact package lists per meta-package should be verified against the PKGBUILD files in sdata/dist-arch/*; the above is aligned with how the code uses these tools.
+## illogical-impulse-portal
+- `xdg-desktop-portal`
+ - Basic component.
+- `xdg-desktop-portal-kde`
+ - Basic component.
+- `xdg-desktop-portal-gtk`
+ - Basic component.
+- `xdg-desktop-portal-hyprland`
+ - Basic component.
+
+## illogical-impulse-python
+- `clang`
+ - Some python package may need this to be built, e.g. #1235. This may varies on different distros though.
+- `uv`
+ - Used for python venv.
+- `gtk4`
+ - Not explicitly used.
+- `libadwaita`
+ - Not explicitly used.
+- `libsoup3`
+ - Not explicitly used.
+- `libportal-gtk4`
+ - Not explicitly used.
+- `gobject-introspection`
+ - Not explicitly used.
+
+## illogical-impulse-screencapture
+- `hyprshot`
+ - Used in Hyprland `keybinds.conf` as fallback.
+- `slurp`
+ - Used in Hyprland and Quickshell config.
+- `swappy`
+ - Used in Quickshell config.
+- `tesseract`
+ - Used in Quickshell and Hyprland config.
+- `tesseract-data-eng`
+ - Used as data for tesseract.
+- `wf-recorder`
+ - Used in Quickshell config.
+
+
+## illogical-impulse-toolkit
+- `upower`
+ - Used in Quickshell config.
+- `wtype`
+ - Used in Hyprland `scripts/fuzzel-emoji.sh`
+- `ydotool`
+ - Used in Quickshell config.
+
+## illogical-impulse-widgets
+- `fuzzel`
+ - Used in Hyprland and Quickshell config; its config is also included.
+- `glib2`
+ - Provides executable `gsettings`
+ - Used in install script, also in matugen and quickshell config.
+- `imagemagick`
+ - Provides executable: `magick`
+ - Used in Quickshell config.
+- `hypridle`
+ - Used for loginctl to lock session.
+- `hyprlock`
+ - Installed as fallback; its config is also included.
+- `hyprpicker`
+ - Used in Hyprland and Quickshell config.
+- `songrec`
+ - Used in Quickshell config.
+- `translate-shell`
+ - Used in Quickshell config.
+- `wlogout`
+ - Used in Hyprland config.
+
+
+# Actual packages
+## illogical-impulse-quickshell-git
+- Pinned commit.
+- Also with extra dependencies (mainly Qt things) needed by the illogical-impulse Quickshell config.
+
+Extra dependencies.
+- `qt6-base`
+- `qt6-declarative`
+- `qt6-5compat`
+- `qt6-avif-image-plugin`
+- `qt6-imageformats`
+- `qt6-multimedia`
+- `qt6-positioning`
+- `qt6-quicktimeline`
+- `qt6-sensors`
+- `qt6-svg`
+- `qt6-tools`
+- `qt6-translations`
+- `qt6-virtualkeyboard`
+- `qt6-wayland`
+- `kdialog`
+- `syntax-highlighting`
+
+## illogical-impulse-bibata-modern-classic-bin
+- [source](https://github.com/ful1e5/Bibata_Cursor)
+- Used in Hyprland config, not necessary.
+
+## illogical-impulse-microtex-git
+- [source](https://github.com/NanoMichael/MicroTeX)
+- This package will be installed as `/opt/MicroTeX`.
+
+## illogical-impulse-oneui4-icons-git
+- [source](https://github.com/end-4/OneUI4-Icons)
+- Customed version of normal oneui4-icons.
diff --git a/sdata/dist-arch/README.md b/sdata/dist-arch/README.md
index 7f2338480..7e4fac9bf 100644
--- a/sdata/dist-arch/README.md
+++ b/sdata/dist-arch/README.md
@@ -18,3 +18,6 @@ Why is this awesome?
The PKGBUILDs contains two forms of dependencies:
- Package name written in dependencies, like a "meta" package.
- Normal PKGBUILD content to build dependencies, e.g. AGS, which is often for version controlling.
+
+## Note
+- `pkgver()` should be removed from `PKGBUILD` cuz it will modify the `PKGBUILD` which is tracked by Git and should not be modified during building.
diff --git a/sdata/dist-arch/illogical-impulse-hyprland/PKGBUILD b/sdata/dist-arch/illogical-impulse-hyprland/PKGBUILD
index 8722c9246..84eefda3c 100644
--- a/sdata/dist-arch/illogical-impulse-hyprland/PKGBUILD
+++ b/sdata/dist-arch/illogical-impulse-hyprland/PKGBUILD
@@ -1,15 +1,11 @@
pkgname=illogical-impulse-hyprland
pkgver=1.0
-pkgrel=1
+pkgrel=4
pkgdesc='Illogical Impulse Hyprland relatated packages'
arch=(any)
license=(None)
depends=(
- hypridle
hyprland
- hyprlock
- hyprpicker
hyprsunset
- xdg-desktop-portal-hyprland
wl-clipboard
)
diff --git a/sdata/dist-arch/illogical-impulse-microtex-git/PKGBUILD b/sdata/dist-arch/illogical-impulse-microtex-git/PKGBUILD
index b2f48a5bd..8b4ab8f36 100644
--- a/sdata/dist-arch/illogical-impulse-microtex-git/PKGBUILD
+++ b/sdata/dist-arch/illogical-impulse-microtex-git/PKGBUILD
@@ -17,11 +17,6 @@ makedepends=("git" "cmake")
source=("git+${url}.git")
sha256sums=("SKIP")
-pkgver() {
- cd $_pkgname
- printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
-}
-
prepare() {
cd $_pkgname
sed -i 's/gtksourceviewmm-3.0/gtksourceviewmm-4.0/' CMakeLists.txt
diff --git a/sdata/dist-arch/illogical-impulse-oneui4-icons-git/PKGBUILD b/sdata/dist-arch/illogical-impulse-oneui4-icons-git/PKGBUILD
index 9b9a9c36d..ad8270712 100644
--- a/sdata/dist-arch/illogical-impulse-oneui4-icons-git/PKGBUILD
+++ b/sdata/dist-arch/illogical-impulse-oneui4-icons-git/PKGBUILD
@@ -10,11 +10,6 @@ source=("git+${url}.git")
sha256sums=('SKIP')
options=('!strip')
-pkgver(){
- cd $srcdir/$_pkgname
- printf 'r%s.%s' "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
-}
-
package() {
cd $srcdir/$_pkgname
install -dm755 "$pkgdir/usr/share/icons"
diff --git a/sdata/dist-arch/illogical-impulse-portal/PKGBUILD b/sdata/dist-arch/illogical-impulse-portal/PKGBUILD
index 5e01482b7..2715a96b8 100644
--- a/sdata/dist-arch/illogical-impulse-portal/PKGBUILD
+++ b/sdata/dist-arch/illogical-impulse-portal/PKGBUILD
@@ -10,4 +10,3 @@ depends=(
xdg-desktop-portal-gtk
xdg-desktop-portal-hyprland
)
-
diff --git a/sdata/dist-arch/illogical-impulse-quickshell-git/.gitignore b/sdata/dist-arch/illogical-impulse-quickshell-git/.gitignore
new file mode 100644
index 000000000..7606c6ed4
--- /dev/null
+++ b/sdata/dist-arch/illogical-impulse-quickshell-git/.gitignore
@@ -0,0 +1 @@
+/quickshell
\ No newline at end of file
diff --git a/sdata/dist-arch/illogical-impulse-quickshell-git/PKGBUILD b/sdata/dist-arch/illogical-impulse-quickshell-git/PKGBUILD
index b7909843b..806f2272e 100644
--- a/sdata/dist-arch/illogical-impulse-quickshell-git/PKGBUILD
+++ b/sdata/dist-arch/illogical-impulse-quickshell-git/PKGBUILD
@@ -9,8 +9,8 @@ conflicts=("quickshell-git")
_pkgname=quickshell
pkgname="$_prefix-$_pkgname-git"
pkgver=0.1.0.r1
-pkgrel=4
-pkgdesc="$_pkgname-git which version pinned for $_prefix"
+pkgrel=5
+pkgdesc="$_pkgname-git pinned commit and extra deps for $_prefix"
arch=(x86_64 aarch64)
url='https://git.outfoxxed.me/quickshell/quickshell'
options=(!strip)
@@ -61,13 +61,6 @@ source=("$_pkgsrc::git+$url.git#commit=$_commit"
sha256sums=('SKIP'
'8543e21aeaaa5441b73a679160e7601a957f16c433e8d6bd9257e80bd0e94083')
-
-pkgver() {
- cd "$_pkgsrc"
- git describe --long --tags --abbrev=7 --exclude='*[a-zA-Z][a-zA-Z]*' \
- | sed -E 's/^[^0-9]*//;s/([^-]*-g)/r\1/;s/-/./g'
-}
-
build() {
cd "$_pkgname"
cmake -GNinja -B build \
diff --git a/sdata/dist-arch/install-deps.sh b/sdata/dist-arch/install-deps.sh
index c799369aa..3cd43d6ba 100644
--- a/sdata/dist-arch/install-deps.sh
+++ b/sdata/dist-arch/install-deps.sh
@@ -12,11 +12,17 @@ install-yay(){
rm -rf /tmp/buildyay
}
-# NOTE: `handle-deprecated-dependencies` was for the old days when we just switch from dependencies.conf to local PKGBUILDs.
-# However, let's just keep it as references for other distros writing their `sdata/dist-/install-deps.sh`, if they need it.
-handle-deprecated-dependencies(){
+remove_deprecated_dependencies(){
printf "${STY_CYAN}[$0]: Removing deprecated dependencies:${STY_RST}\n"
- for i in illogical-impulse-{microtex,pymyc-aur} {quickshell,hyprutils,hyprpicker,hyprlang,hypridle,hyprland-qt-support,hyprland-qtutils,hyprlock,xdg-desktop-portal-hyprland,hyprcursor,hyprwayland-scanner,hyprland}-git;do try sudo pacman --noconfirm -Rdd $i;done
+ local list=()
+ list+=(illogical-impulse-{microtex,pymyc-aur})
+ list+=(hyprland-qtutils)
+ list+=({quickshell,hyprutils,hyprpicker,hyprlang,hypridle,hyprland-qt-support,hyprland-qtutils,hyprlock,xdg-desktop-portal-hyprland,hyprcursor,hyprwayland-scanner,hyprland}-git)
+ for i in ${list[@]};do try sudo pacman --noconfirm -Rdd $i;done
+}
+# NOTE: `implicitize_old_dependencies()` was for the old days when we just switch from dependencies.conf to local PKGBUILDs.
+# However, let's just keep it as references for other distros writing their `sdata/dist-/install-deps.sh`, if they need it.
+implicitize_old_dependencies(){
# Convert old dependencies to non explicit dependencies so that they can be orphaned if not in meta packages
remove_bashcomments_emptylines ./sdata/dist-arch/previous_dependencies.conf ./cache/old_deps_stripped.conf
readarray -t old_deps_list < ./cache/old_deps_stripped.conf
@@ -37,6 +43,9 @@ if ! command -v pacman >/dev/null 2>&1; then
exit 1
fi
+showfun remove_deprecated_dependencies
+v remove_deprecated_dependencies
+
# Issue #363
case $SKIP_SYSUPDATE in
true) sleep 0;;
@@ -51,8 +60,8 @@ if ! command -v yay >/dev/null 2>&1;then
v install-yay
fi
-showfun handle-deprecated-dependencies
-v handle-deprecated-dependencies
+showfun implicitize_old_dependencies
+v implicitize_old_dependencies
# https://github.com/end-4/dots-hyprland/issues/581
# yay -Bi is kinda hit or miss, instead cd into the relevant directory and manually source and install deps
diff --git a/sdata/dist-arch/install-setups.sh b/sdata/dist-arch/install-setups.sh
deleted file mode 100644
index 923ac2bc5..000000000
--- a/sdata/dist-arch/install-setups.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-# This script is meant to be sourced.
-# It's not for directly running.
-
-#####################################################################################
-# These python packages are installed using uv into the venv (virtual environment). Once the folder of the venv gets deleted, they are all gone cleanly. So it's considered as setups, not dependencies.
-showfun install-python-packages
-v install-python-packages
-
-v sudo usermod -aG video,i2c,input "$(whoami)"
-v bash -c "echo i2c-dev | sudo tee /etc/modules-load.d/i2c-dev.conf"
-v systemctl --user enable ydotool --now
-v sudo systemctl enable bluetooth --now
-v gsettings set org.gnome.desktop.interface font-name 'Rubik 11'
-v gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark'
-v kwriteconfig6 --file kdeglobals --group KDE --key widgetStyle Darkly
diff --git a/sdata/dist-fallback/install-deps.sh b/sdata/dist-fallback/install-deps.sh
deleted file mode 100644
index b106cfbe6..000000000
--- a/sdata/dist-fallback/install-deps.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-# This script is meant to be sourced.
-# It's not for directly running.
-
-# This file is currently WIP.
-
-v install-Rubik
-v install-Gabarito
-v install-OneUI
-v install-bibata
-v install-MicroTeX
-v install-uv
diff --git a/sdata/dist-fallback/install-setups.sh b/sdata/dist-fallback/install-setups.sh
deleted file mode 100644
index 923ac2bc5..000000000
--- a/sdata/dist-fallback/install-setups.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-# This script is meant to be sourced.
-# It's not for directly running.
-
-#####################################################################################
-# These python packages are installed using uv into the venv (virtual environment). Once the folder of the venv gets deleted, they are all gone cleanly. So it's considered as setups, not dependencies.
-showfun install-python-packages
-v install-python-packages
-
-v sudo usermod -aG video,i2c,input "$(whoami)"
-v bash -c "echo i2c-dev | sudo tee /etc/modules-load.d/i2c-dev.conf"
-v systemctl --user enable ydotool --now
-v sudo systemctl enable bluetooth --now
-v gsettings set org.gnome.desktop.interface font-name 'Rubik 11'
-v gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark'
-v kwriteconfig6 --file kdeglobals --group KDE --key widgetStyle Darkly
diff --git a/sdata/dist-fallback/outdate-detect-mode b/sdata/dist-fallback/outdate-detect-mode
deleted file mode 100644
index 00d7bdd40..000000000
--- a/sdata/dist-fallback/outdate-detect-mode
+++ /dev/null
@@ -1 +0,0 @@
-WIP
diff --git a/sdata/dist-fedora/install-deps.sh b/sdata/dist-fedora/install-deps.sh
index 7a4da7138..6374d5e7e 100644
--- a/sdata/dist-fedora/install-deps.sh
+++ b/sdata/dist-fedora/install-deps.sh
@@ -12,6 +12,9 @@ case $SKIP_SYSUPDATE in
*) v sudo dnf upgrade --refresh -y;;
esac
+# Remove version lock
+v sudo dnf versionlock delete quickshell-git 2>/dev/null
+
# Development-tools installation
v sudo dnf install @development-tools fedora-packager rpmdevtools fonts-rpm-macros qt6-rpm-macros -y
@@ -42,8 +45,9 @@ v sudo dnf install ${themes_deps[@]} -y
# Hyprland
hyprland_deps=(
- hypridle hyprland hyprlock hyprpicker hyprsunset
- xdg-desktop-portal-hyprland wl-clipboard
+ hyprland
+ hyprsunset
+ wl-clipboard
)
v sudo dnf install --setopt="install_weak_deps=False" "${hyprland_deps[@]}" -y
# hyprland-qt-support's build deps
@@ -115,5 +119,9 @@ install_RPMS() {
showfun install_RPMS
v install_RPMS
+
# hyprland-qtutils depends on hyprland-qt-support
-v sudo dnf install hyprland-qtutils -y
\ No newline at end of file
+v sudo dnf install hyprland-qtutils -y
+
+# Add back versionlock at the end
+v sudo dnf versionlock add quickshell-git
diff --git a/sdata/dist-fedora/install-setups.sh b/sdata/dist-fedora/install-setups.sh
deleted file mode 100644
index 6364ca3f5..000000000
--- a/sdata/dist-fedora/install-setups.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-# This script is meant to be sourced.
-# It's not for directly running.
-
-#####################################################################################
-# These python packages are installed using uv into the venv (virtual environment). Once the folder of the venv gets deleted, they are all gone cleanly. So it's considered as setups, not dependencies.
-showfun install-python-packages
-v install-python-packages
-
-v sudo usermod -aG video,input "$(whoami)"
-v mkdir -p "${XDG_CONFIG_HOME}/systemd/user"
-v ln -s /usr/lib/systemd/system/ydotool.service "${XDG_CONFIG_HOME}/systemd/user/ydotool.service"
-v bash -c "echo uinput | sudo tee /etc/modules-load.d/uinput.conf"
-v bash -c 'echo SUBSYSTEM==\"misc\", KERNEL==\"uinput\", MODE=\"0660\", GROUP=\"input\" |
- sudo tee /etc/udev/rules.d/99-uinput.rules'
-v systemctl --user enable ydotool
-v sudo systemctl enable bluetooth --now
-v gsettings set org.gnome.desktop.interface font-name 'Rubik 11'
-v gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark'
-v kwriteconfig6 --file kdeglobals --group KDE --key widgetStyle Darkly
diff --git a/sdata/dist-gentoo/README.md b/sdata/dist-gentoo/README.md
index c488d50e8..630a3a178 100644
--- a/sdata/dist-gentoo/README.md
+++ b/sdata/dist-gentoo/README.md
@@ -10,7 +10,6 @@ Note:
## Contributors
- Author: [jwihardi](https://github.com/jwihardi)
-
## install-deps.sh
1. Enables localrepo and guru overlays if not already enabled.
2. Copies _keywords_ to _keywords-user_ and appends the correct unmask keywords for the user's architecture (adm64, arm64, and x86 are supported).
@@ -19,19 +18,13 @@ Note:
5. Copies over the custom live ebuilds (hyprgraphics, hyprland-qt-support, hyprland-qtutils, hyprlang, hyprwayland-scanner) into localrepo and digests them.
6. Loops through all illogical-impulse ebuilds to digest and emerge them.
-## install-setup.sh
-1. Creates the _i2c_ group since Gentoo doesn't have this by default, then adds the user to it.
-2. Enables _bluetooth_ and _ydotool_ services (systemd or openrc)
-3. _icons_, _konsole_, _hypr_, and _quickshell_ are are chowned to user since they're emerge in as root by default.
-4. gsettings and kwriteconfig6 are set (same as sdata/dist-arch).
-
## Recommended use flags (useflags)
- **The recommended useflags are not required, this is a more out of the box experience with these**
- Pipewire is used, alsa and pulseaudio are disabled (enabling them won't hurt).
- Init system is not assumed or considered so disabling systemd should be done in make.conf, same with session managers (elogind is recommended).
## Making the dot-files work
-- elogind is expected to be installed and run as a service on OpenRC to set ```XDG_RUNTIME_DIR```
+- elogind is expected to be installed and run as a service on OpenRC to set `XDG_RUNTIME_DIR`
- NOT recommended: seatd will require more manual setup
- pipewire, pipewire-pulse, and wireplumber must be started after a dbus-session is created and before Hyprland is launched.
@@ -54,8 +47,8 @@ end
```
## Known Issues
-- If Hyprland is just blank, rebuild Quickshell (emerge -q gui-apps/quickshell)
-- ```Hyprland: error while loading shared libraries: libhyprgraphics.so.0: cannot open shared object file: No such file or directory```
- - The Hyprland live ebuild sometimes has linkage issues, deleting _Hyprland_ and _hyprland_ from ```/usr/bin/``` and then re-emerging usually fixes this.
-- When emerging Hyprland if you get an issue relating to```undefined reference to `Hyprutils::Math::Vector2D::˜Vector2D()` ```
- - Clear the cache folder (```rm -fr /var/tmp/portage/gui-wm/hyprland*```) then try again
+- If Hyprland is just blank, rebuild Quickshell (`emerge -q gui-apps/quickshell`)
+- `Hyprland: error while loading shared libraries: libhyprgraphics.so.0: cannot open shared object file: No such file or directory`
+ - The Hyprland live ebuild sometimes has linkage issues, deleting _Hyprland_ and _hyprland_ from `/usr/bin/` and then re-emerging usually fixes this.
+- When emerging Hyprland if you get an issue relating to `undefined reference to ``Hyprutils::Math::Vector2D::˜Vector2D()`` `
+ - Clear the cache folder (`rm -fr /var/tmp/portage/gui-wm/hyprland*`) then try again
diff --git a/sdata/dist-gentoo/illogical-impulse-audio/illogical-impulse-audio-1.0-r1.ebuild b/sdata/dist-gentoo/illogical-impulse-audio/illogical-impulse-audio-1.0-r1.ebuild
index f36834a4d..a5cccd625 100644
--- a/sdata/dist-gentoo/illogical-impulse-audio/illogical-impulse-audio-1.0-r1.ebuild
+++ b/sdata/dist-gentoo/illogical-impulse-audio/illogical-impulse-audio-1.0-r1.ebuild
@@ -6,7 +6,7 @@ EAPI=8
DESCRIPTION="Illogical Impulse Audio Dependencies"
HOMEPAGE=""
-LICENSE="GPL-2"
+LICENSE="metapackage"
SLOT="0"
KEYWORDS="~amd64 ~arm64 ~x86"
RESTRICT="strip"
diff --git a/sdata/dist-gentoo/illogical-impulse-backlight/illogical-impulse-backlight-1.0-r1.ebuild b/sdata/dist-gentoo/illogical-impulse-backlight/illogical-impulse-backlight-1.0-r1.ebuild
index 0b7243111..d9a196e75 100644
--- a/sdata/dist-gentoo/illogical-impulse-backlight/illogical-impulse-backlight-1.0-r1.ebuild
+++ b/sdata/dist-gentoo/illogical-impulse-backlight/illogical-impulse-backlight-1.0-r1.ebuild
@@ -6,7 +6,7 @@ EAPI=8
DESCRIPTION="Illogical Impulse Backlight Dependencies"
HOMEPAGE=""
-LICENSE="GPL-2"
+LICENSE="metapackage"
SLOT="0"
KEYWORDS="~amd64 ~arm64 ~x86"
RESTRICT="strip"
diff --git a/sdata/dist-gentoo/illogical-impulse-basic/illogical-impulse-basic-1.0-r2.ebuild b/sdata/dist-gentoo/illogical-impulse-basic/illogical-impulse-basic-1.0-r2.ebuild
index eeae5c57b..cb3308c77 100644
--- a/sdata/dist-gentoo/illogical-impulse-basic/illogical-impulse-basic-1.0-r2.ebuild
+++ b/sdata/dist-gentoo/illogical-impulse-basic/illogical-impulse-basic-1.0-r2.ebuild
@@ -6,24 +6,22 @@ EAPI=8
DESCRIPTION="Illogical Impulse Basic Dependencies"
HOMEPAGE=""
-LICENSE="GPL-2"
+LICENSE="metapackage"
SLOT="0"
KEYWORDS="~amd64 ~arm64 ~x86"
RESTRICT="strip"
DEPEND=""
RDEPEND="
- net-misc/axel
sys-devel/bc
sys-apps/coreutils
app-misc/cliphist
dev-build/cmake
net-misc/curl
- net-misc/rsync
net-misc/wget
sys-apps/ripgrep
dev-python/jq
- dev-build/meson
x11-misc/xdg-user-dirs
+ net-misc/rsync
app-misc/yq-go
"
diff --git a/sdata/dist-gentoo/illogical-impulse-bibata-modern-classic-bin/illogical-impulse-bibata-modern-classic-bin-2.0.6-r1.ebuild b/sdata/dist-gentoo/illogical-impulse-bibata-modern-classic-bin/illogical-impulse-bibata-modern-classic-bin-2.0.6-r1.ebuild
index e2a70d6d2..07ff29108 100644
--- a/sdata/dist-gentoo/illogical-impulse-bibata-modern-classic-bin/illogical-impulse-bibata-modern-classic-bin-2.0.6-r1.ebuild
+++ b/sdata/dist-gentoo/illogical-impulse-bibata-modern-classic-bin/illogical-impulse-bibata-modern-classic-bin-2.0.6-r1.ebuild
@@ -2,13 +2,12 @@
# Distributed under the terms of the GNU General Public License v2
EAPI=8
-Bibata_VER=2.0.6
DESCRIPTION="Material Based Cursor Theme, installed for illogical-impulse dotfiles"
HOMEPAGE=""
-SRC_URI="https://github.com/ful1e5/Bibata_Cursor/releases/download/v${Bibata_VER}/Bibata-Modern-Classic.tar.xz -> bibata-modern-classic.tar.xz"
+SRC_URI="https://github.com/ful1e5/Bibata_Cursor/releases/download/v${PV}/Bibata-Modern-Classic.tar.xz -> bibata-modern-classic.tar.xz"
-LICENSE="GPL-2"
+LICENSE="GPL-3+"
SLOT="0"
KEYWORDS="~amd64 ~arm64 ~x86"
RESTRICT="strip"
diff --git a/sdata/dist-gentoo/illogical-impulse-fonts-themes/illogical-impulse-fonts-themes-1.0-r1.ebuild b/sdata/dist-gentoo/illogical-impulse-fonts-themes/illogical-impulse-fonts-themes-1.0-r1.ebuild
index d220350cd..5442d5d68 100644
--- a/sdata/dist-gentoo/illogical-impulse-fonts-themes/illogical-impulse-fonts-themes-1.0-r1.ebuild
+++ b/sdata/dist-gentoo/illogical-impulse-fonts-themes/illogical-impulse-fonts-themes-1.0-r1.ebuild
@@ -2,90 +2,40 @@
# Distributed under the terms of the GNU General Public License v2
EAPI=8
-DART_SASS_VER=1.78.0
-SPACE_GROTESK_VER=1.1.4
DESCRIPTION="Illogical Impulse Fonts and Theming Dependencies"
-HOMEPAGE=""
-SRC_URI="
-https://github.com/Bali10050/Darkly/archive/refs/heads/main.tar.gz -> ${P}-darkly.tar.gz
-https://github.com/naipefoundry/gabarito/archive/refs/heads/main.tar.gz -> ${P}-gabarito.tar.gz
-https://github.com/googlefonts/rubik/archive/refs/heads/main.tar.gz -> ${P}-rubik.tar.gz
-https://github.com/ThomasJockin/readexpro/archive/refs/heads/master.tar.gz -> ${P}-readexpro.tar.gz
-https://github.com/mjkim0727/breeze-plus/archive/refs/heads/main.tar.gz -> ${P}-breeze-plus.tar.gz
-https://github.com/lassekongo83/adw-gtk3/archive/refs/heads/main.tar.gz -> ${P}-adw-gtk3.tar.gz
-https://github.com/google/material-design-icons/raw/refs/heads/master/variablefont/MaterialSymbolsOutlined%5BFILL,GRAD,opsz,wght%5D.ttf -> MaterialSymbolsOutlined.ttf
- https://github.com/google/material-design-icons/raw/refs/heads/master/variablefont/MaterialSymbolsRounded%5BFILL,GRAD,opsz,wght%5D.ttf -> MaterialSymbolsRounded.ttf
- https://github.com/google/material-design-icons/raw/refs/heads/master/variablefont/MaterialSymbolsSharp%5BFILL,GRAD,opsz,wght%5D.ttf -> MaterialSymbolsSharp.ttf
-https://github.com/floriankarsten/space-grotesk/archive/refs/tags/${SPACE_GROTESK_VER}.tar.gz -> ${P}-space-grotesk-${SPACE_GROTESK_VER}.tar.gz
-"
-LICENSE="GPL-2"
+
+LICENSE="metapackage"
SLOT="0"
KEYWORDS="~amd64 ~arm64 ~x86"
RESTRICT="strip"
DEPEND=""
RDEPEND="
+ x11-themes/adw-gtk3
kde-plasma/breeze
+ kde-plasma/breeze-plus
+ x11-themes/darkly
sys-apps/eza
app-shells/fish
media-libs/fontconfig
x11-terms/kitty
x11-misc/matugen
+ media-fonts/space-grotesk
app-shells/starship
+ media-fonts/gabarito
media-fonts/jetbrains-mono
+ media-fonts/material-symbols-variable
+ media-fonts/readex-pro
+ media-fonts/roboto-flex
+ media-fonts/rubik-vf
media-fonts/twemoji
"
-
-# Source directories
-S="${WORKDIR}"
-S_DARKLY="${S}/Darkly-main"
-S_GABARITO="${S}/gabarito-main"
-S_RUBIK="${S}/rubik-main"
-S_READEXPRO="${S}/readexpro-master"
-S_ADW_GTK3="${S}/adw-gtk3-main"
-S_BREEZE_PLUS="${S}/breeze-plus-main"
-S_SPACE_GROTESK="${S}/space-grotesk-${SPACE_GROTESK_VER}"
-
-src_unpack() {
- default
-
- mv "${WORKDIR}/dart-sass-${DART_SASS_VER}-linux-x64" "${S_DART_SASS}"
-}
-
-src_compile() {
- cd "${S_DARKLY}"
- mkdir -p build
- cd build
- cmake .. -DBUILD_QT5=OFF -DBUILD_QT6=ON
- cmake --build . --parallel=$(nproc)
-
- cd "${S_ADW_GTK3}"
- meson setup build
- meson compile -C build
-}
-
-src_install() {
- cd "${S_DARKLY}/build"
- cmake --install . --destdir="${D}"
-
- insinto /usr/share/fonts/ttf-gabarito
- doins "${S_GABARITO}"/fonts/ttf/*.ttf
-
- insinto /usr/share/fonts/ttf-readex-pro
- doins "${S_READEXPRO}"/fonts/ttf/*.ttf
-
- insinto /usr/share/fonts/material-symbols
- doins "${DISTDIR}"/MaterialSymbols*.ttf
-
- insinto /usr/share/fonts/OTF
- doins "${S_SPACE_GROTESK}"/fonts/otf/*.otf
-
- insinto /usr/share/themes
- doins -r "${S_BREEZE_PLUS}"/src/breeze-plus*
-
- cd "${S_ADW_GTK3}"
- meson install -C build --destdir="${D}"
-
- fc-cache -f
-}
+##### CUSTOM EBUILDS
+# x11-themes/adw-gtk3
+# x11-themes/darkly
+# media-fonts/space-grotesk
+# media-fonts/gabarito
+# media-fonts/material-symbols-variable
+# media-fonts/readex-pro
+# media-fonts/rubik-vf
diff --git a/sdata/dist-gentoo/illogical-impulse-hyprland/hyprgraphics-9999.ebuild b/sdata/dist-gentoo/illogical-impulse-hyprland/hyprgraphics-9999.ebuild
deleted file mode 100644
index 95c36237c..000000000
--- a/sdata/dist-gentoo/illogical-impulse-hyprland/hyprgraphics-9999.ebuild
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright 2023-2025 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=8
-
-inherit cmake git-r3
-
-DESCRIPTION="Hyprland graphics / resource utilities (live/HEAD)"
-HOMEPAGE="https://github.com/hyprwm/hyprgraphics"
-
-# For live ebuilds, Portage clones the git repo
-EGIT_REPO_URI="https://github.com/hyprwm/hyprgraphics.git"
-
-LICENSE="BSD"
-SLOT="0"
-KEYWORDS="~amd64"
-
-RDEPEND="
- >=gui-libs/hyprutils-0.1.1:=
- media-libs/libjpeg-turbo:=
- media-libs/libjxl:=
- media-libs/libspng
- media-libs/libwebp:=
- sys-apps/file
- x11-libs/cairo
-"
-DEPEND="${RDEPEND}"
-
diff --git a/sdata/dist-gentoo/illogical-impulse-hyprland/hyprland-qt-support-9999.ebuild b/sdata/dist-gentoo/illogical-impulse-hyprland/hyprland-qt-support-9999.ebuild
deleted file mode 100644
index 11b5d1aa2..000000000
--- a/sdata/dist-gentoo/illogical-impulse-hyprland/hyprland-qt-support-9999.ebuild
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2023-2025 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=8
-
-inherit cmake git-r3
-
-DESCRIPTION="QML style provider for hypr* Qt apps"
-HOMEPAGE="https://github.com/hyprwm/hyprland-qt-support"
-EGIT_REPO_URI="https://github.com/hyprwm/hyprland-qt-support.git"
-
-LICENSE="BSD"
-
-SLOT="0"
-KEYWORDS="amd64"
-
-RDEPEND="
- dev-qt/qtbase:6
- dev-qt/qtdeclarative:6
- >=dev-libs/hyprlang-0.6.0
-"
-
-DEPEND="${RDEPEND}"
-
-BDEPEND="
- virtual/pkgconfig
-"
-
-src_configure() {
- local mycmakeargs=(
- -DINSTALL_QML_PREFIX="${EPFREIX}/$(get_libdir)/qt6/qml"
- )
-
- cmake_src_configure
-}
diff --git a/sdata/dist-gentoo/illogical-impulse-hyprland/hyprland-qtutils-9999.ebuild b/sdata/dist-gentoo/illogical-impulse-hyprland/hyprland-qtutils-9999.ebuild
deleted file mode 100644
index 15eaed2ec..000000000
--- a/sdata/dist-gentoo/illogical-impulse-hyprland/hyprland-qtutils-9999.ebuild
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2023-2025 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=8
-
-inherit cmake git-r3
-
-DESCRIPTION="Hyprland QT/qml utility apps"
-HOMEPAGE="https://github.com/hyprwm/hyprland-qtutils"
-EGIT_REPO_URI="https://github.com/hyprwm/hyprland-qtutils.git"
-
-LICENSE="BSD"
-
-SLOT="0"
-KEYWORDS="~amd64 ~arm64 ~x86"
-
-RDEPEND="
- dev-qt/qtbase:6
- dev-qt/qtdeclarative:6
- dev-qt/qtwayland:6
- gui-libs/hyprutils:=
- gui-libs/hyprland-qt-support
- kde-frameworks/qqc2-desktop-style:6
-"
-
-DEPEND="${RDEPEND}"
diff --git a/sdata/dist-gentoo/illogical-impulse-hyprland/hyprlang-9999.ebuild b/sdata/dist-gentoo/illogical-impulse-hyprland/hyprlang-9999.ebuild
deleted file mode 100644
index aa1557128..000000000
--- a/sdata/dist-gentoo/illogical-impulse-hyprland/hyprlang-9999.ebuild
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2023-2025 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=8
-
-inherit cmake toolchain-funcs git-r3
-
-DESCRIPTION="Official implementation library for the hypr config language"
-HOMEPAGE="https://github.com/hyprwm/hyprlang"
-EGIT_REPO_URI="https://github.com/hyprwm/hyprlang.git"
-
-LICENSE="LGPL-3"
-SLOT="0"
-KEYWORDS="~amd64"
-
-RDEPEND=">=gui-libs/hyprutils-0.7.1:="
-DEPEND="${RDEPEND}"
-BDEPEND="|| ( >=sys-devel/gcc-14:* >=llvm-core/clang-18:* )"
-
-pkg_setup() {
- [[ ${MERGE_TYPE} == binary ]] && return
-
- tc-check-min_ver gcc 14
- tc-check-min_ver clang 18
-}
diff --git a/sdata/dist-gentoo/illogical-impulse-hyprland/hyprwayland-scanner-9999.ebuild b/sdata/dist-gentoo/illogical-impulse-hyprland/hyprwayland-scanner-9999.ebuild
deleted file mode 100644
index 1ee36c663..000000000
--- a/sdata/dist-gentoo/illogical-impulse-hyprland/hyprwayland-scanner-9999.ebuild
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2024-2025 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=8
-
-inherit cmake toolchain-funcs
-
-DESCRIPTION="A Hyprland implementation of wayland-scanner, in and for C++"
-HOMEPAGE="https://github.com/hyprwm/hyprwayland-scanner/"
-
-if [[ ${PV} == 9999 ]] ; then
- EGIT_REPO_URI="https://github.com/hyprwm/hyprwayland-scanner.git"
- inherit git-r3
-else
- SRC_URI="https://github.com/hyprwm/hyprwayland-scanner/archive/v${PV}.tar.gz -> ${P}.gh.tar.gz"
-fi
-
-LICENSE="BSD"
-KEYWORDS="amd64 arm64 x86"
-SLOT="0"
-
-RDEPEND=">=dev-libs/pugixml-1.14"
-DEPEND="${RDEPEND}"
-
-pkg_setup() {
- [[ ${MERGE_TYPE} == binary ]] && return
-
- if tc-is-gcc && ver_test $(gcc-version) -lt 13 ; then
- eerror "Hyprland requires >=sys-devel/gcc-13 to build"
- eerror "Please upgrade GCC: emerge -v1 sys-devel/gcc"
- die "GCC version is too old to compile Hyprland!"
- elif tc-is-clang && ver_test $(clang-version) -lt 16 ; then
- eerror "Hyprland requires >=llvm-core/clang-16 to build"
- eerror "Please upgrade Clang: emerge -v1 llvm-core/clang"
- die "Clang version is too old to compile Hyprland!"
- fi
-}
diff --git a/sdata/dist-gentoo/illogical-impulse-hyprland/illogical-impulse-hyprland-1.0-r1.ebuild b/sdata/dist-gentoo/illogical-impulse-hyprland/illogical-impulse-hyprland-1.0-r3.ebuild
similarity index 51%
rename from sdata/dist-gentoo/illogical-impulse-hyprland/illogical-impulse-hyprland-1.0-r1.ebuild
rename to sdata/dist-gentoo/illogical-impulse-hyprland/illogical-impulse-hyprland-1.0-r3.ebuild
index e86b04a2d..07330f63b 100644
--- a/sdata/dist-gentoo/illogical-impulse-hyprland/illogical-impulse-hyprland-1.0-r1.ebuild
+++ b/sdata/dist-gentoo/illogical-impulse-hyprland/illogical-impulse-hyprland-1.0-r3.ebuild
@@ -13,20 +13,7 @@ RESTRICT="strip"
DEPEND=""
RDEPEND="
- gui-apps/hypridle
- gui-libs/hyprcursor
- gui-libs/hyprland-qtutils
- gui-libs/hyprland-qt-support
- dev-libs/hyprlang
- gui-apps/hyprlock
- gui-apps/hyprpicker
gui-apps/hyprsunset
- gui-libs/hyprutils
- dev-libs/hyprland-protocols
- dev-libs/hyprgraphics
- gui-libs/aquamarine
gui-wm/hyprland
- dev-util/hyprwayland-scanner
- gui-libs/xdg-desktop-portal-hyprland
gui-apps/wl-clipboard
"
diff --git a/sdata/dist-gentoo/illogical-impulse-microtex-git/illogical-impulse-microtex-git-1.0-r1.ebuild b/sdata/dist-gentoo/illogical-impulse-microtex-git/illogical-impulse-microtex-git-1.0-r1.ebuild
index 7a8aafdde..9fab4c1f1 100644
--- a/sdata/dist-gentoo/illogical-impulse-microtex-git/illogical-impulse-microtex-git-1.0-r1.ebuild
+++ b/sdata/dist-gentoo/illogical-impulse-microtex-git/illogical-impulse-microtex-git-1.0-r1.ebuild
@@ -21,7 +21,6 @@ RDEPEND="
dev-cpp/cairomm
"
-# Use WORKDIR directly after stripping top-level folder
S="${WORKDIR}"
src_unpack() {
@@ -38,7 +37,7 @@ src_prepare() {
}
src_compile() {
- cd "${S}" || die
+ cd "${S}"
mkdir -p build
cmake -B build -S . -DCMAKE_BUILD_TYPE=None
cmake --build build
@@ -53,4 +52,3 @@ src_install() {
insinto /usr/share/licenses/illogical-impulse-microtex-git
doins LICENSE
}
-
diff --git a/sdata/dist-gentoo/illogical-impulse-oneui4-icons-git/illogical-impulse-oneui4-icons-git-1.0-r1.ebuild b/sdata/dist-gentoo/illogical-impulse-oneui4-icons-git/illogical-impulse-oneui4-icons-git-1.0-r1.ebuild
index 563b450b1..4e38d2e8b 100644
--- a/sdata/dist-gentoo/illogical-impulse-oneui4-icons-git/illogical-impulse-oneui4-icons-git-1.0-r1.ebuild
+++ b/sdata/dist-gentoo/illogical-impulse-oneui4-icons-git/illogical-impulse-oneui4-icons-git-1.0-r1.ebuild
@@ -7,9 +7,9 @@ DESCRIPTION="A fork of mjkim0727/OneUI4-Icons for illogical-impulse dotfiles"
HOMEPAGE=""
SRC_URI="https://github.com/end-4/OneUI4-Icons/archive/main.tar.gz -> ${P}.tar.gz"
-LICENSE="GPL-2"
+LICENSE="GPL-3"
SLOT="0"
-KEYWORDS="~amd64"
+KEYWORDS="~amd64 ~arm64 ~x86"
RESTRICT="strip"
DEPEND=""
diff --git a/sdata/dist-gentoo/illogical-impulse-portal/illogical-impulse-portal-1.0-r1.ebuild b/sdata/dist-gentoo/illogical-impulse-portal/illogical-impulse-portal-1.0-r1.ebuild
index e93a2fa2b..01a3d6a78 100644
--- a/sdata/dist-gentoo/illogical-impulse-portal/illogical-impulse-portal-1.0-r1.ebuild
+++ b/sdata/dist-gentoo/illogical-impulse-portal/illogical-impulse-portal-1.0-r1.ebuild
@@ -6,7 +6,7 @@ EAPI=8
DESCRIPTION="Illogical Impulse XDG Desktop Portals"
HOMEPAGE=""
-LICENSE="GPL-2"
+LICENSE="metapackage"
SLOT="0"
KEYWORDS="~amd64 ~arm64 ~x86"
RESTRICT="strip"
diff --git a/sdata/dist-gentoo/illogical-impulse-python/illogical-impulse-python-1.1-r1.ebuild b/sdata/dist-gentoo/illogical-impulse-python/illogical-impulse-python-1.1-r1.ebuild
index 4b01ad269..a7bce2e89 100644
--- a/sdata/dist-gentoo/illogical-impulse-python/illogical-impulse-python-1.1-r1.ebuild
+++ b/sdata/dist-gentoo/illogical-impulse-python/illogical-impulse-python-1.1-r1.ebuild
@@ -6,12 +6,10 @@ EAPI=8
DESCRIPTION="Illogical Impulse Python Dependencies"
HOMEPAGE=""
-LICENSE="GPL-2"
+LICENSE="metapackage"
SLOT="0"
KEYWORDS="~amd64 ~arm64 ~x86"
-RESTRICT="strip"
-# SASSC is not needed here, pkgbuild is capping
DEPEND=""
RDEPEND="
dev-python/clang
diff --git a/sdata/dist-gentoo/illogical-impulse-quickshell-git/illogical-impulse-quickshell-git-9999-r3.ebuild b/sdata/dist-gentoo/illogical-impulse-quickshell-git/illogical-impulse-quickshell-git-9999-r3.ebuild
index 8ba94cb9b..c82f67d99 100644
--- a/sdata/dist-gentoo/illogical-impulse-quickshell-git/illogical-impulse-quickshell-git-9999-r3.ebuild
+++ b/sdata/dist-gentoo/illogical-impulse-quickshell-git/illogical-impulse-quickshell-git-9999-r3.ebuild
@@ -20,6 +20,21 @@ IUSE="+breakpad +jemalloc +sockets +wayland +layer-shell +session-lock +toplevel
RDEPEND="
dev-qt/qtbase:6
dev-qt/qtsvg:6
+ dev-qt/qt5compat:6
+
+ dev-qt/qtimageformats:6
+ dev-qt/qtmultimedia:6
+ dev-qt/qtpositioning:6
+ dev-qt/qtquicktimeline:6
+ dev-qt/qtsensors:6
+ dev-qt/qtsvg:6
+ dev-qt/qttools:6
+ dev-qt/qttranslations:6
+ dev-qt/qtvirtualkeyboard:6
+ dev-qt/qtwayland:6
+ kde-apps/kdialog
+ kde-frameworks/syntax-highlighting:6
+
jemalloc? ( dev-libs/jemalloc )
wayland? (
dev-libs/wayland
@@ -34,9 +49,6 @@ RDEPEND="
mpris? ( dev-qt/qtdbus )
pam? ( sys-libs/pam )
bluetooth? ( net-wireless/bluez )
-
-
-
"
DEPEND="${RDEPEND}"
BDEPEND="
@@ -60,7 +72,7 @@ BDEPEND="
src_configure(){
mycmakeargs=(
-DCMAKE_BUILD_TYPE=RelWithDebInfo
- -DDISTRIBUTOR="Gentoo GURU"
+ -DDISTRIBUTOR="Gentoo Illogical-Impulses"
-DINSTALL_QML_PREFIX="lib64/qt6/qml"
-DCRASH_REPORTER=$(usex breakpad ON OFF)
-DUSE_JEMALLOC=$(usex jemalloc ON OFF)
diff --git a/sdata/dist-gentoo/illogical-impulse-screencapture/illogical-impulse-screencapture-1.0-r1.ebuild b/sdata/dist-gentoo/illogical-impulse-screencapture/illogical-impulse-screencapture-1.0-r1.ebuild
index 1630b6689..e3b32109e 100644
--- a/sdata/dist-gentoo/illogical-impulse-screencapture/illogical-impulse-screencapture-1.0-r1.ebuild
+++ b/sdata/dist-gentoo/illogical-impulse-screencapture/illogical-impulse-screencapture-1.0-r1.ebuild
@@ -6,10 +6,9 @@ EAPI=8
DESCRIPTION="Illogical Impulse Screenshot and Recording Dependencies"
HOMEPAGE=""
-LICENSE="GPL-2"
+LICENSE="metapackage"
SLOT="0"
KEYWORDS="~amd64 ~arm64 ~x86"
-RESTRICT="strip"
DEPEND=""
RDEPEND="
diff --git a/sdata/dist-gentoo/illogical-impulse-toolkit/illogical-impulse-toolkit-1.0-r1.ebuild b/sdata/dist-gentoo/illogical-impulse-toolkit/illogical-impulse-toolkit-1.0-r1.ebuild
index b7e8868c6..fe6d1cb80 100644
--- a/sdata/dist-gentoo/illogical-impulse-toolkit/illogical-impulse-toolkit-1.0-r1.ebuild
+++ b/sdata/dist-gentoo/illogical-impulse-toolkit/illogical-impulse-toolkit-1.0-r1.ebuild
@@ -3,31 +3,15 @@
EAPI=8
-DESCRIPTION="Illogical Impulse GTK/Qt Dependencies"
+DESCRIPTION="Illogical Impulse Toolkit Dependencies"
HOMEPAGE=""
-LICENSE="GPL-2"
+LICENSE="metapackage"
SLOT="0"
KEYWORDS="~amd64 ~arm64 ~x86"
-RESTRICT="strip"
DEPEND=""
RDEPEND="
- kde-apps/kdialog
- dev-qt/qt5compat
- dev-qt/qtbase
- dev-qt/qtdeclarative
- dev-qt/qtimageformats
- dev-qt/qtmultimedia
- dev-qt/qtpositioning
- dev-qt/qtquicktimeline
- dev-qt/qtsensors
- dev-qt/qtsvg
- dev-qt/qttools
- dev-qt/qttranslations
- dev-qt/qtvirtualkeyboard
- dev-qt/qtwayland
- kde-frameworks/syntax-highlighting
sys-power/upower
gui-apps/wtype
x11-misc/ydotool
diff --git a/sdata/dist-gentoo/illogical-impulse-widgets/illogical-impulse-widgets-1.0-r2.ebuild b/sdata/dist-gentoo/illogical-impulse-widgets/illogical-impulse-widgets-1.0-r3.ebuild
similarity index 83%
rename from sdata/dist-gentoo/illogical-impulse-widgets/illogical-impulse-widgets-1.0-r2.ebuild
rename to sdata/dist-gentoo/illogical-impulse-widgets/illogical-impulse-widgets-1.0-r3.ebuild
index fe6109223..95ffeffba 100644
--- a/sdata/dist-gentoo/illogical-impulse-widgets/illogical-impulse-widgets-1.0-r2.ebuild
+++ b/sdata/dist-gentoo/illogical-impulse-widgets/illogical-impulse-widgets-1.0-r3.ebuild
@@ -6,10 +6,9 @@ EAPI=8
DESCRIPTION="Illogicall Impulse Widget Dependencies"
HOMEPAGE=""
-LICENSE="GPL-2"
+LICENSE="metapackage"
SLOT="0"
KEYWORDS="~amd64 ~arm64 ~x86"
-RESTRICT="strip"
DEPEND=""
RDEPEND="
@@ -17,9 +16,11 @@ RDEPEND="
dev-libs/glib
media-gfx/imagemagick
gui-apps/hypridle
- gui-libs/hyprutils
gui-apps/hyprlock
gui-apps/hyprpicker
+ app-misc/songrec
app-i18n/translate-shell
gui-apps/wlogout
"
+##### CUSTOM EBUILDS
+# app-misc/songrec
diff --git a/sdata/dist-gentoo/import-local-pkgs.sh b/sdata/dist-gentoo/import-local-pkgs.sh
new file mode 100644
index 000000000..bb1a5375f
--- /dev/null
+++ b/sdata/dist-gentoo/import-local-pkgs.sh
@@ -0,0 +1,26 @@
+HYPR_DIR="local-pkgs/hyprland"
+FT_DIR="local-pkgs/fonts-and-themes"
+WIDGETS_DIR="local-pkgs/widgets"
+
+function import_ebuild(){
+ from_dir="$1"
+ to_dir="$2"
+ ename="$3"
+ x sudo rm -rf "${ebuild_dir}/${to_dir}/${ename}"
+ x sudo mkdir -p "${ebuild_dir}/${to_dir}/${ename}"
+ v sudo cp ./sdata/dist-gentoo/${from_dir}/${ename}*.ebuild "${ebuild_dir}/${to_dir}/${ename}"
+ v sudo ebuild "${ebuild_dir}/${to_dir}/${ename}/${ename}"*.ebuild digest
+}
+
+############### FONTS AND THEMES
+import_ebuild "${FT_DIR}" "media-fonts" "gabarito"
+import_ebuild "${FT_DIR}" "media-fonts" "material-symbols-variable"
+import_ebuild "${FT_DIR}" "media-fonts" "readex-pro"
+import_ebuild "${FT_DIR}" "media-fonts" "rubik-vf"
+import_ebuild "${FT_DIR}" "media-fonts" "space-grotesk"
+import_ebuild "${FT_DIR}" "kde-plasma" "breeze-plus"
+import_ebuild "${FT_DIR}" "x11-themes" "darkly"
+import_ebuild "${FT_DIR}" "media-fonts" "roboto-flex"
+
+############### WIDGETS
+import_ebuild "${WIDGETS_DIR}" "app-misc" "songrec"
diff --git a/sdata/dist-gentoo/install-deps.sh b/sdata/dist-gentoo/install-deps.sh
index 7c7dcd58d..0aadbf81b 100644
--- a/sdata/dist-gentoo/install-deps.sh
+++ b/sdata/dist-gentoo/install-deps.sh
@@ -18,17 +18,19 @@ printf "${STY_RST}"
pause
printf "${STY_YELLOW}"
-printf "https://github.com/end-4/dots-hyprland/blob/main/sdata/dist-gentoo/README.md"
-printf "Checkout the above README for potential bug fixes or additional information"
+printf "https://github.com/end-4/dots-hyprland/blob/main/sdata/dist-gentoo/README.md\n"
+printf "Checkout the above README for potential bug fixes or additional information\n\n"
printf "${STY_RST}"
pause
-x sudo emerge --noreplace --quiet app-eselect/eselect-repository
-x sudo emerge --noreplace --quiet app-portage/smart-live-rebuild
+x sudo emerge --update --quiet app-eselect/eselect-repository
+x sudo emerge --update --quiet app-portage/smart-live-rebuild
+# Currently using 3.12 python, this doesn't need to be default though
+x sudo emerge --update --quiet dev-lang/python:3.12
-if [[ -z $(eselect repository list | grep localrepo) ]]; then
- v sudo eselect repository create localrepo
- v sudo eselect repository enable localrepo
+if [[ -z $(eselect repository list | grep ii-dots) ]]; then
+ v sudo eselect repository create ii-dots
+ v sudo eselect repository enable ii-dots
fi
if [[ -z $(eselect repository list | grep -E ".*guru \*.*") ]]; then
@@ -40,18 +42,29 @@ arch=$(portageq envvar ACCEPT_KEYWORDS)
# Exclude hyprland, will deal with that separately
metapkgs=(illogical-impulse-{audio,backlight,basic,bibata-modern-classic-bin,fonts-themes,hyprland,kde,microtex-git,oneui4-icons-git,portal,python,quickshell-git,screencapture,toolkit,widgets})
-ebuild_dir="/var/db/repos/localrepo"
+ebuild_dir="/var/db/repos/ii-dots"
-# Unmasks
+
+########## IMPORT KEYWORDS (START)
+# Illogical-Impulse
x sudo cp ./sdata/dist-gentoo/keywords ./sdata/dist-gentoo/keywords-user
x sed -i "s/$/ ~${arch}/" ./sdata/dist-gentoo/keywords-user
v sudo cp ./sdata/dist-gentoo/keywords-user /etc/portage/package.accept_keywords/illogical-impulse
-# Use Flags
+# QT
+x sudo cp ./sdata/dist-gentoo/qt-keywords ./sdata/dist-gentoo/qt-keywords-user
+x sed -i "s/$/ ~${arch}/" ./sdata/dist-gentoo/qt-keywords-user
+v sudo cp ./sdata/dist-gentoo/qt-keywords-user /etc/portage/package.accept_keywords/qt
+
+########## IMPORT UNMASKS
+sudo mkdir -p /etc/portage/package.unmask/
+v sudo cp ./sdata/dist-gentoo/qt-unmasks /etc/portage/package.unmask/qt
+
+########## IMPORT USEFLAGS
v sudo cp ./sdata/dist-gentoo/useflags /etc/portage/package.use/illogical-impulse
v sudo sh -c 'cat ./sdata/dist-gentoo/additional-useflags >> /etc/portage/package.use/illogical-impulse'
-# Update system
+########## UPDATE SYSTEM
v sudo emerge --sync
v sudo emerge --quiet --newuse --update --deep @world
v sudo emerge --quiet @smart-live-rebuild
@@ -60,35 +73,12 @@ v sudo emerge --depclean
# Remove old ebuilds (if this isn't done the wildcard will fuck upon a version change)
x sudo rm -fr ${ebuild_dir}/app-misc/illogical-impulse-*
-###### LIVE EBUILDS START
-HYPR_DIR="illogical-impulse-hyprland"
-x sudo mkdir -p ${ebuild_dir}/dev-libs/hyprgraphics/
-x sudo mkdir -p ${ebuild_dir}/gui-libs/hyprland-qt-support
-x sudo mkdir -p ${ebuild_dir}/gui-libs/hyprland-qtutils
-x sudo mkdir -p ${ebuild_dir}/dev-libs/hyprlang
-x sudo mkdir -p ${ebuild_dir}/dev-libs/hyprlang
-x sudo mkdir -p ${ebuild_dir}/dev-util/hyprwayland-scanner
+source ./sdata/dist-gentoo/import-local-pkgs.sh
-v sudo cp ./sdata/dist-gentoo/${HYPR_DIR}/hyprgraphics*.ebuild ${ebuild_dir}/dev-libs/hyprgraphics
-v sudo cp ./sdata/dist-gentoo/${HYPR_DIR}/hyprland-qt-support*.ebuild ${ebuild_dir}/gui-libs/hyprland-qt-support
-v sudo cp ./sdata/dist-gentoo/${HYPR_DIR}/hyprland-qtutils*.ebuild ${ebuild_dir}/gui-libs/hyprland-qtutils
-v sudo cp ./sdata/dist-gentoo/${HYPR_DIR}/hyprlang*.ebuild ${ebuild_dir}/dev-libs/hyprlang
-v sudo cp ./sdata/dist-gentoo/${HYPR_DIR}/hyprwayland-scanner*.ebuild ${ebuild_dir}/dev-util/hyprwayland-scanner
-
-v sudo ebuild ${ebuild_dir}/dev-libs/hyprgraphics/hyprgraphics*9999.ebuild digest
-v sudo ebuild ${ebuild_dir}/gui-libs/hyprland-qt-support/hyprland-qt-support*9999.ebuild digest
-v sudo ebuild ${ebuild_dir}/gui-libs/hyprland-qtutils/hyprland-qtutils*9999.ebuild digest
-v sudo ebuild ${ebuild_dir}/dev-libs/hyprlang/hyprlang*9999.ebuild digest
-v sudo ebuild ${ebuild_dir}/dev-util/hyprwayland-scanner/hyprwayland-scanner*9999.ebuild digest
-###### LIVE EBUILDS END
-
-# Install dependencies
+########## INSTALL ILLOGICAL-IMPUSEL EBUILDS
for i in "${metapkgs[@]}"; do
x sudo mkdir -p ${ebuild_dir}/app-misc/${i}
v sudo cp ./sdata/dist-gentoo/${i}/${i}*.ebuild ${ebuild_dir}/app-misc/${i}/
v sudo ebuild ${ebuild_dir}/app-misc/${i}/*.ebuild digest
- v sudo emerge --quiet app-misc/${i}
+ v sudo emerge --update --quiet app-misc/${i}
done
-
-# Currently using 3.12 python, this doesn't need to be default though
-v sudo emerge --noreplace --quiet dev-lang/python:3.12
diff --git a/sdata/dist-gentoo/install-setups.sh b/sdata/dist-gentoo/install-setups.sh
deleted file mode 100644
index db75e555d..000000000
--- a/sdata/dist-gentoo/install-setups.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-# This script is meant to be sourced.
-# It's not for directly running.
-
-#####################################################################################
-# These python packages are installed using uv into the venv (virtual environment). Once the folder of the venv gets deleted, they are all gone cleanly. So it's considered as setups, not dependencies.
-showfun install-python-packages
-v install-python-packages
-
-if [[ -z $(getent group i2c) ]]; then
- v sudo groupadd i2c
-fi
-
-v sudo usermod -aG video,i2c,input "$(whoami)"
-
-if [[ ! -z $(systemctl --version) ]]; then
- v bash -c "echo i2c-dev | sudo tee /etc/modules-load.d/i2c-dev.conf"
- v systemctl --user enable ydotool --now
- v sudo systemctl enable bluetooth --now
-elif [[ ! -z $(openrc --version) ]]; then
- v bash -c "echo 'modules=i2c-dev' | sudo tee -a /etc/conf.d/modules"
- v sudo rc-update add modules boot
- v sudo rc-update add ydotool default
- v sudo rc-update add bluetooth default
-
- x sudo rc-service ydotool start
- x sudo rc-service bluetooth start
-else
- printf "${STY_RED}"
- printf "====================INIT SYSTEM NOT FOUND====================\n"
- printf "${STY_RST}"
- pause
-fi
-
-v sudo chown -R $(whoami):$(whoami) ~/.config/hypr/
-v sudo chown -R $(whoami):$(whoami) ~/.config/quickshell/
-
-v gsettings set org.gnome.desktop.interface font-name 'Rubik 11'
-v gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark'
-v kwriteconfig6 --file kdeglobals --group KDE --key widgetStyle Darkly
diff --git a/sdata/dist-gentoo/keywords b/sdata/dist-gentoo/keywords
index a10d1111e..512705188 100644
--- a/sdata/dist-gentoo/keywords
+++ b/sdata/dist-gentoo/keywords
@@ -29,17 +29,27 @@ gui-apps/fuzzel
gui-apps/quickshell **
gui-apps/wlogout
dev-cpp/sdbus-c++
-dev-libs/hyprland-protocols **
-gui-libs/aquamarine **
-gui-libs/hyprutils **
-dev-util/hyprwayland-scanner **
-dev-libs/hyprlang **
-dev-libs/hyprgraphics **
-gui-libs/hyprcursor **
-gui-libs/hyprland-qt-support **
-gui-libs/hyprland-qtutils **
-gui-wm/hyprland **
+dev-libs/hyprland-protocols
+gui-libs/aquamarine
+gui-libs/hyprutils
+dev-util/hyprwayland-scanner
+dev-libs/hyprlang
+dev-libs/hyprgraphics
+gui-libs/hyprcursor
+gui-libs/hyprland-qt-support
+gui-libs/hyprland-qtutils
+gui-wm/hyprland
x11-libs/libxkbcommon
dev-util/breakpad
dev-libs/linux-syscall-support
dev-embedded/libdisasm
+kde-plasma/breeze-plus
+x11-themes/darkly
+x11-themes/adw-gtk3
+media-fonts/space-grotesk
+media-fonts/gabarito **
+media-fonts/material-symbols-variable **
+media-fonts/readex-pro
+media-fonts/rubik-vf
+media-fonts/roboto-flex
+app-misc/songrec
diff --git a/sdata/dist-gentoo/local-pkgs/fonts-and-themes/breeze-plus-6.2.5-r1.ebuild b/sdata/dist-gentoo/local-pkgs/fonts-and-themes/breeze-plus-6.2.5-r1.ebuild
new file mode 100644
index 000000000..07dd0d129
--- /dev/null
+++ b/sdata/dist-gentoo/local-pkgs/fonts-and-themes/breeze-plus-6.2.5-r1.ebuild
@@ -0,0 +1,22 @@
+# Copyright 2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DESCRIPTION="Breeze styled extra icon theme for KDE"
+HOMEPAGE="https://github.com/mjkim0727/breeze-plus"
+SRC_URI="https://github.com/mjkim0727/breeze-plus/archive/refs/tags/${PV}.tar.gz -> ${P}.tar.gz"
+
+LICENSE="LGPL-2.1"
+SLOT="0"
+KEYWORDS="~amd64 ~arm64 ~x86"
+RDEPEND="kde-plasma/breeze"
+BDEPEND=""
+
+S="${WORKDIR}/${PN}-${PV}"
+
+src_install() {
+ insinto /usr/share/icons
+ doins -r src/breeze-plus*
+}
+
diff --git a/sdata/dist-gentoo/local-pkgs/fonts-and-themes/darkly-0.5.24-r1.ebuild b/sdata/dist-gentoo/local-pkgs/fonts-and-themes/darkly-0.5.24-r1.ebuild
new file mode 100644
index 000000000..828c7b976
--- /dev/null
+++ b/sdata/dist-gentoo/local-pkgs/fonts-and-themes/darkly-0.5.24-r1.ebuild
@@ -0,0 +1,54 @@
+# Copyright 2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+# NOTE: Did not include QT5 backwards compatibility
+
+inherit cmake
+
+DESCRIPTION="Fork of Lightly - A modern style for Qt applications"
+HOMEPAGE="https://github.com/Bali10050/Darkly"
+SRC_URI="https://github.com/Bali10050/darkly/archive/refs/tags/v${PV}.tar.gz -> ${P}.tar.gz"
+
+LICENSE="GPL-2+"
+SLOT="0"
+KEYWORDS="~amd64 ~arm64 ~x86"
+
+DEPEND="
+ kde-frameworks/kcoreaddons:6
+ kde-frameworks/kconfig:6
+ kde-frameworks/kguiaddons:6
+ kde-frameworks/ki18n:6
+ kde-frameworks/kiconthemes:6
+ kde-frameworks/kwindowsystem:6
+ kde-frameworks/kcmutils:6
+ kde-frameworks/frameworkintegration:6
+ kde-frameworks/kconfigwidgets:6
+ kde-plasma/kdecoration:6
+ dev-qt/qtdeclarative:6
+"
+RDEPEND="${DEPEND}"
+
+BDEPEND="
+ dev-build/cmake
+ kde-frameworks/extra-cmake-modules
+ dev-vcs/git
+"
+
+S="${WORKDIR}/Darkly-${PV}"
+
+src_configure() {
+ local mycmakeargs=(
+ -DBUILD_TESTING=OFF
+ -DBUILD_QT5=OFF
+ -DBUILD_QT6=ON
+ )
+ cmake_src_configure
+}
+
+src_install() {
+ cmake_src_install
+ rm -rf "${ED}/usr/$(get_libdir)/cmake" || die
+}
+
diff --git a/sdata/dist-gentoo/local-pkgs/fonts-and-themes/gabarito-9999.ebuild b/sdata/dist-gentoo/local-pkgs/fonts-and-themes/gabarito-9999.ebuild
new file mode 100644
index 000000000..b0813dcb0
--- /dev/null
+++ b/sdata/dist-gentoo/local-pkgs/fonts-and-themes/gabarito-9999.ebuild
@@ -0,0 +1,22 @@
+# Copyright 2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+inherit font git-r3
+
+DESCRIPTION="Illogical Impulse Fonts and Theming Dependencies"
+HOMEPAGE=""
+EGIT_REPO_URI="https://github.com/naipefoundry/gabarito"
+
+LICENSE="OFL-1.1"
+SLOT="0"
+KEYWORDS=""
+
+FONT_S="${S}/fonts/ttf"
+FONT_SUFFIX="ttf"
+
+src_install() {
+ font_src_install
+ dodoc OFL.txt
+}
diff --git a/sdata/dist-gentoo/local-pkgs/fonts-and-themes/material-symbols-variable-9999.ebuild b/sdata/dist-gentoo/local-pkgs/fonts-and-themes/material-symbols-variable-9999.ebuild
new file mode 100644
index 000000000..4bc410d0e
--- /dev/null
+++ b/sdata/dist-gentoo/local-pkgs/fonts-and-themes/material-symbols-variable-9999.ebuild
@@ -0,0 +1,40 @@
+# Copyright 1999-2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+inherit font
+
+DESCRIPTION="Material Design icons by Google - variable fonts"
+HOMEPAGE="https://github.com/google/material-design-icons"
+
+BASE_URL="https://github.com/google/material-design-icons/raw/refs/heads/master"
+
+SRC_URI="
+ ${BASE_URL}/variablefont/MaterialSymbolsOutlined%5BFILL,GRAD,opsz,wght%5D.ttf -> MaterialSymbolsOutlined-FILL-GRAD-opsz-wght.ttf
+ ${BASE_URL}/variablefont/MaterialSymbolsRounded%5BFILL,GRAD,opsz,wght%5D.ttf -> MaterialSymbolsRounded-FILL-GRAD-opsz-wght.ttf
+ ${BASE_URL}/variablefont/MaterialSymbolsSharp%5BFILL,GRAD,opsz,wght%5D.ttf -> MaterialSymbolsSharp-FILL-GRAD-opsz-wght.ttf
+"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS=""
+
+S="${WORKDIR}"
+
+FONT_SUFFIX="ttf"
+
+src_unpack() {
+ mkdir -p "${S}"
+ cp "${DISTDIR}/MaterialSymbolsOutlined-FILL-GRAD-opsz-wght.ttf" \
+ "${S}/MaterialSymbolsOutlined[FILL,GRAD,opsz,wght].ttf"
+ cp "${DISTDIR}/MaterialSymbolsRounded-FILL-GRAD-opsz-wght.ttf" \
+ "${S}/MaterialSymbolsRounded[FILL,GRAD,opsz,wght].ttf"
+ cp "${DISTDIR}/MaterialSymbolsSharp-FILL-GRAD-opsz-wght.ttf" \
+ "${S}/MaterialSymbolsSharp[FILL,GRAD,opsz,wght].ttf"
+}
+
+src_install() {
+ font_src_install
+}
+
diff --git a/sdata/dist-gentoo/local-pkgs/fonts-and-themes/readex-pro-1.0-r1.ebuild b/sdata/dist-gentoo/local-pkgs/fonts-and-themes/readex-pro-1.0-r1.ebuild
new file mode 100644
index 000000000..0e17cec74
--- /dev/null
+++ b/sdata/dist-gentoo/local-pkgs/fonts-and-themes/readex-pro-1.0-r1.ebuild
@@ -0,0 +1,21 @@
+# Copyright 2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+inherit font
+
+DESCRIPTION="Illogical Impulse Fonts and Theming Dependencies"
+HOMEPAGE=""
+SRC_URI="https://github.com/ThomasJockin/readexpro/archive/refs/heads/master.tar.gz -> ${P}-readexpro.tar.gz"
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="~amd64 ~arm64 ~x86"
+RESTRICT="strip"
+
+S="${WORKDIR}/readexpro-master"
+
+src_install() {
+ insinto /usr/share/fonts/ttf-readex-pro
+ doins "${S}"/fonts/ttf/*.ttf
+}
diff --git a/sdata/dist-gentoo/local-pkgs/fonts-and-themes/roboto-flex-3.200.ebuild b/sdata/dist-gentoo/local-pkgs/fonts-and-themes/roboto-flex-3.200.ebuild
new file mode 100644
index 000000000..520e74895
--- /dev/null
+++ b/sdata/dist-gentoo/local-pkgs/fonts-and-themes/roboto-flex-3.200.ebuild
@@ -0,0 +1,29 @@
+# Copyright 1999-2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+inherit font
+
+DESCRIPTION="Upgrades Roboto to become a more powerful typeface system"
+HOMEPAGE="https://github.com/googlefonts/roboto-flex"
+SRC_URI="
+ https://github.com/googlefonts/roboto-flex/releases/download/${PV}/roboto-flex-fonts.zip -> ${P}.zip
+ https://github.com/googlefonts/roboto-flex/raw/main/OFL.txt -> ${P}-OFL.txt
+"
+
+LICENSE="OFL-1.1"
+SLOT="0"
+KEYWORDS="~amd64 ~arm64 ~x86"
+
+BDEPEND="app-arch/unzip"
+
+S="${WORKDIR}/roboto-flex-fonts"
+
+FONT_SUFFIX="ttf"
+FONT_S="${S}/fonts/variable"
+
+src_install() {
+ font_src_install
+ dodoc "${DISTDIR}/${P}-OFL.txt"
+}
diff --git a/sdata/dist-gentoo/local-pkgs/fonts-and-themes/rubik-vf-1.0-r1.ebuild b/sdata/dist-gentoo/local-pkgs/fonts-and-themes/rubik-vf-1.0-r1.ebuild
new file mode 100644
index 000000000..ef66f6c93
--- /dev/null
+++ b/sdata/dist-gentoo/local-pkgs/fonts-and-themes/rubik-vf-1.0-r1.ebuild
@@ -0,0 +1,27 @@
+# Copyright 2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+COMMIT="e337a5f69a9bea30e58d05bd40184d79cc099628"
+
+inherit font
+
+DESCRIPTION="A sans serif font family with slightly rounded corners: variable font version"
+HOMEPAGE="https://github.com/googlefonts/rubik"
+SRC_URI="https://github.com/googlefonts/rubik/archive/${COMMIT}.tar.gz -> ${P}.tar.gz"
+
+LICENSE="OFL-1.1"
+SLOT="0"
+KEYWORDS="~amd64 ~arm64 ~x86"
+
+S="${WORKDIR}/rubik-${COMMIT}"
+
+FONT_S="${S}/fonts/variable"
+FONT_SUFFIX="ttf"
+
+src_install() {
+ font_src_install
+ dodoc OFL.txt AUTHORS.txt CONTRIBUTORS.txt
+}
+
diff --git a/sdata/dist-gentoo/local-pkgs/fonts-and-themes/space-grotesk-1.1.4-r1.ebuild b/sdata/dist-gentoo/local-pkgs/fonts-and-themes/space-grotesk-1.1.4-r1.ebuild
new file mode 100644
index 000000000..64bed0c30
--- /dev/null
+++ b/sdata/dist-gentoo/local-pkgs/fonts-and-themes/space-grotesk-1.1.4-r1.ebuild
@@ -0,0 +1,28 @@
+# Copyright 1999-2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+inherit font
+
+DESCRIPTION="Space Grotesk OTF font from 38C3 styleguide"
+HOMEPAGE="https://events.ccc.de/congress/2024/infos/styleguide.html"
+SRC_URI="https://events.ccc.de/congress/2024/infos/styleguide/38c3-styleguide-full-v2.zip"
+
+LICENSE="OFL-1.1"
+SLOT="0"
+KEYWORDS="~amd64 ~arm64 ~x86"
+
+BDEPEND="app-arch/unzip"
+
+S="${WORKDIR}/fonts/space-grotesk-${PV}"
+
+FONT_S="${S}/otf"
+FONT_SUFFIX="otf"
+
+src_install() {
+ font_src_install
+
+ dodoc OFL.txt
+}
+
diff --git a/sdata/dist-gentoo/local-pkgs/widgets/songrec-0.4.3-r1.ebuild b/sdata/dist-gentoo/local-pkgs/widgets/songrec-0.4.3-r1.ebuild
new file mode 100644
index 000000000..fa5f1e6b3
--- /dev/null
+++ b/sdata/dist-gentoo/local-pkgs/widgets/songrec-0.4.3-r1.ebuild
@@ -0,0 +1,48 @@
+# Copyright 2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DESCRIPTION="Illogicall Impulse Widget Dependencies"
+HOMEPAGE=""
+SRC_URI="https://github.com/marin-m/SongRec/archive/${PV}.tar.gz -> ${P}-SongRec.tar.gz"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="~amd64 ~arm64 ~x86"
+# need for cargo fetch, idk how to get around it if possible
+RESTRICT="strip network-sandbox"
+
+DEPEND=""
+RDEPEND=""
+
+S="${WORKDIR}/SongRec-${PV}"
+
+src_prepare() {
+ default
+ export CARGO_HOME="${WORKDIR}/cargo"
+ cargo fetch --locked --target "$(rustc -vV | sed -n 's/host: //p')"
+}
+
+src_compile() {
+ export CARGO_HOME="${WORKDIR}/cargo"
+ cargo build --release --frozen --offline
+}
+
+src_install() {
+ dobin target/release/songrec
+ insinto /usr/share/applications
+
+ doins packaging/rootfs/usr/share/applications/com.github.marinm.songrec.desktop
+
+ insinto /usr/share/icons/hicolor/scalable/apps
+ doins packaging/rootfs/usr/share/icons/hicolor/scalable/apps/com.github.marinm.songrec.svg
+
+ insinto /usr/share/metainfo
+ doins packaging/rootfs/usr/share/metainfo/com.github.marinm.songrec.metainfo.xml
+
+ insinto /usr/share/songrec/translations
+ doins -r translations/*
+
+ dodoc README.md
+}
diff --git a/sdata/dist-gentoo/qt-keywords b/sdata/dist-gentoo/qt-keywords
new file mode 100644
index 000000000..71e812c54
--- /dev/null
+++ b/sdata/dist-gentoo/qt-keywords
@@ -0,0 +1,27 @@
+dev-qt/qtbase
+dev-qt/qtdeclarative
+dev-qt/qtlanguageserver
+dev-qt/qtsvg
+dev-qt/qtshadertools
+dev-qt/qttranslations
+dev-qt/qttools
+dev-qt/qt5compat
+dev-qt/qtcore
+dev-qt/qtdbus
+dev-qt/qtgraphicaleffects
+dev-qt/qtgui
+dev-qt/qtimageformats
+dev-qt/qtlocation
+dev-qt/qtmultimedia
+dev-qt/qtnetwork
+dev-qt/qtpositioning
+dev-qt/qtquick3d
+dev-qt/qtquickcontrols2
+dev-qt/qtquicktimeline
+dev-qt/qtsensors
+dev-qt/qtspeech
+dev-qt/qttest
+dev-qt/qtvirtualkeyboard
+dev-qt/qtwayland
+dev-qt/qtwayland
+dev-qt/qtwidgets
diff --git a/sdata/dist-gentoo/qt-unmasks b/sdata/dist-gentoo/qt-unmasks
new file mode 100644
index 000000000..71e812c54
--- /dev/null
+++ b/sdata/dist-gentoo/qt-unmasks
@@ -0,0 +1,27 @@
+dev-qt/qtbase
+dev-qt/qtdeclarative
+dev-qt/qtlanguageserver
+dev-qt/qtsvg
+dev-qt/qtshadertools
+dev-qt/qttranslations
+dev-qt/qttools
+dev-qt/qt5compat
+dev-qt/qtcore
+dev-qt/qtdbus
+dev-qt/qtgraphicaleffects
+dev-qt/qtgui
+dev-qt/qtimageformats
+dev-qt/qtlocation
+dev-qt/qtmultimedia
+dev-qt/qtnetwork
+dev-qt/qtpositioning
+dev-qt/qtquick3d
+dev-qt/qtquickcontrols2
+dev-qt/qtquicktimeline
+dev-qt/qtsensors
+dev-qt/qtspeech
+dev-qt/qttest
+dev-qt/qtvirtualkeyboard
+dev-qt/qtwayland
+dev-qt/qtwayland
+dev-qt/qtwidgets
diff --git a/sdata/dist-nix/README.md b/sdata/dist-nix/README.md
index cc1c8dd07..3a8120e04 100644
--- a/sdata/dist-nix/README.md
+++ b/sdata/dist-nix/README.md
@@ -24,6 +24,7 @@ TODO:
```plain
Failed to connect to user scope bus via local transport: $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR not defined (consider using --machine=@.host --user to connect to bus of other user)
```
+- [ ] Handle problem that `pkill qs` and `pkill hyprland` does not work (should be `.quickshell-wra` and `.Hyprland-wrapp` when installed via Nix).
## Attentions
### PAM
diff --git a/sdata/dist-nix/home-manager/home.nix b/sdata/dist-nix/home-manager/home.nix
index b6ab39cbe..eab3e5c53 100644
--- a/sdata/dist-nix/home-manager/home.nix
+++ b/sdata/dist-nix/home-manager/home.nix
@@ -48,90 +48,83 @@
# hyprlock pamtester
- # NOTE: below are migrated from dist-arch. For each package, must know why it's needed and how it's used specifically, cuz things may be need tweak to properly use the package installed by Nix, for example those have hardcoded path /usr/* .
+ # NOTE: below are migrated from dist-arch. For each package, must know why it's needed and how it's used specifically, cuz things may be need tweak to properly use the package installed by Nix, for example those have hardcoded path /usr/* . See sdata/deps-info.md
### illogical-impulse-audio
- libcava #cava (Used in Quickshell config)
- lxqt.pavucontrol-qt #pavucontrol-qt (Used in Hyprland and Quickshell config)
- wireplumber #wireplumber (not explicitly used)
- pipewire #pipewire-pulse (not explicitly used)
- libdbusmenu-gtk3 #libdbusmenu-gtk3 (not explicitly used)
- playerctl #playerctl (Used in Hyprland and Quickshell config)
+ libcava #cava
+ lxqt.pavucontrol-qt #pavucontrol-qt
+ wireplumber #wireplumber
+ pipewire #pipewire-pulse
+ libdbusmenu-gtk3 #libdbusmenu-gtk3
+ playerctl #playerctl
### illogical-impulse-backlight
- (geoclue2.override { withDemoAgent = true; }) #geoclue (which demo agent used in Quickshell config)
- brightnessctl #brightnessctl (Used in Hyprland and Quickshell config)
- ddcutil #ddcutil (Used in Quickshell config)
+ (geoclue2.override { withDemoAgent = true; }) #geoclue
+ brightnessctl #brightnessctl
+ ddcutil #ddcutil
### illogical-impulse-basic
- bc #bc (Used in quickshell/ii/scripts/colors/switchwall.sh for example)
- uutils-coreutils-noprefix #coreutils (Too many executables involved, not sure where been used)
- cliphist #cliphist (Used in Hyprland and Quickshell config)
- cmake #cmake (Used in building quickshell and MicroTeX)
- curlFull #curl (Used in Quickshell config)
- wget #wget (Used in Quickshell config)
- ripgrep #ripgrep (Not sure where been used)
- jq #jq (Widely used)
- xdg-user-dirs #xdg-user-dirs (Used in Hyprland and Quickshell config)
- rsync #rsync (Used in install script)
- yq-go #go-yq (Used in install script)
+ bc #bc
+ uutils-coreutils-noprefix #coreutils
+ cliphist #cliphist
+ cmake #cmake
+ curlFull #curl
+ wget #wget
+ ripgrep #ripgrep
+ jq #jq
+ xdg-user-dirs #xdg-user-dirs
+ rsync #rsync
+ yq-go #go-yq
### illogical-impulse-bibata-modern-classic-bin
- bibata-cursors #https://github.com/ful1e5/Bibata_Cursor (Used in Hyprland config, not necessary)
+ bibata-cursors
### illogical-impulse-fonts-themes
- adw-gtk3 #adw-gtk-theme-git (https://github.com/lassekongo83/adw-gtk3) (Used in Quickshell config)
- kdePackages.breeze kdePackages.breeze-icons #breeze (Used in kdeglobals config)
- #breeze-plus (https://github.com/mjkim0727/breeze-plus) (TODO: Not available as nixpkg) (Used in kde-material-you-colors config)
- darkly darkly-qt5 #darkly-bin (darkly is supposed to be set as the theme for Qt apps, just have not figured out how to properly set it yet.)
- eza #eza (Used in Fish config: `alias ls 'eza --icons'`)
- #fish (Install via system PM instead; TODO: should install via nix in future when authentication problem fixed)
- fontconfig #fontconfig (Basic thing)
+ adw-gtk3 #adw-gtk-theme-git
+ kdePackages.breeze kdePackages.breeze-icons #breeze
+ #breeze-plus (TODO: Not available as nixpkg)
+ darkly darkly-qt5 #darkly-bin
+ eza #eza
+ #fish (Currently install via system PM; TODO: should install via nix in future when authentication problem fixed)
+ fontconfig #fontconfig
kitty #kitty (Used in fuzzel, Hyprland, kdeglobals and Quickshell config; kitty config is also included as dots)
matugen #matugen-bin (Used in Quickshell)
- #otf-space-grotesk (https://events.ccc.de/congress/2024/infos/styleguide.html) (TODO: Not available as Nixpkg) (Used in Quickshell and matugen config)
- starship #starship (Used in Fish config)
- #ttf-gabarito-git (Font name: Gabarito) (Used in fuzzel and Quickshell config) (TODO: Not available as Nixpkg)
- nerd-fonts.jetbrains-mono #ttf-jetbrains-mono-nerd (Font name: JetBrains Mono NF, JetBrainsMono Nerd Font) (Used in foot, kdeglobals, kitty, qt5ct, qt6ct and Quickshell config)
- material-symbols #ttf-material-symbols-variable-git (Font name: Material Symbols Rounded, Material Symbols Outlined) (Used in Hyprland, matugen, Quickshell and wlogout config)
- #ttf-readex-pro (Font name: Readex Pro) (Used in Quickshell config) (TODO: seems not available as nixpkg)
- roboto-flex #ttf-roboto-flex (Font name: Roboto Flex) (Used in Hyprland, matugen and Quickshell config)
- rubik #ttf-rubik-vf (Font name: Rubik, Rubik Light) (Used in Hyprland, kdeglobals, matugen, qt5ct, qt6ct and Quickshell config)
- twemoji-color-font #ttf-twemoji (Not explicitly used, but it may help as fallback for displaying emoji charaters)
+ #otf-space-grotesk (TODO: Not available as Nixpkg)
+ starship #starship
+ #ttf-gabarito-git (TODO: Not available as Nixpkg)
+ nerd-fonts.jetbrains-mono #ttf-jetbrains-mono-nerd
+ material-symbols #ttf-material-symbols-variable-git
+ #ttf-readex-pro (TODO: seems not available as nixpkg)
+ roboto-flex #ttf-roboto-flex
+ rubik #ttf-rubik-vf
+ twemoji-color-font #ttf-twemoji
### illogical-impulse-hyprland
- hypridle #hypridle (Used for loginctl to lock session)
- #hyprland (Need NixGL, included elsewhere)
- #hyprlock (Should not be installed via Nix; TODO: should install via nix in future when authentication problem fixed)
- hyprpicker #hyprpicker (Used in Hyprland and Quickshell config)
- hyprsunset #hyprsunset (Used in Quickshell config)
- #xdg-desktop-portal-hyprland (DUPLICATE)
- wl-clipboard #wl-clipboard (Surely needed)
+ #hyprland
+ hyprsunset #hyprsunset
+ wl-clipboard #wl-clipboard
### illogical-impulse-kde
- kdePackages.bluedevil #bluedevil (Seems not being used anywhere, maybe a part of KDE settings panel)
- #gnome-keyring #gnome-keyring (TODO: Install via system PM instead; should install via nix in future when authentication problem fixed) (Provide executable gnome-keyring-daemon, used in Hyprland and Quickshell config)
+ kdePackages.bluedevil #bluedevil
+ #gnome-keyring #gnome-keyring (TODO: Install via system PM instead; should install via nix in future when authentication problem fixed)
networkmanager #networkmanager
- kdePackages.plasma-nm #plasma-nm (Seems not being used anywhere, maybe a part of KDE settings panel)
+ kdePackages.plasma-nm #plasma-nm
#polkit-kde-agent (TODO: Install via system PM instead; should install via nix in future when authentication problem fixed)
- kdePackages.dolphin #dolphin (Used in Hyprland and Quickshell config)
- kdePackages.systemsettings #systemsettings (Used in Hyprland keybinds.conf)
+ kdePackages.dolphin #dolphin
+ kdePackages.systemsettings #systemsettings
### illogical-impulse-microtex-git
- # This package will be installed as /opt/MicroTeX
- #MicroTeX#https://github.com/NanoMichael/MicroTeX
# TODO: Not available as nixpkg
### illogical-impulse-oneui4-icons-git
- #OneUI4-Icons#https://github.com/end-4/OneUI4-Icons
- # TODO: Custom repo, need to make a package
+ # TODO: Customed version of normal oneui4-icons, need to make a package
### illogical-impulse-portal
@@ -142,41 +135,40 @@
### illogical-impulse-python
- #clang (Some python package may need this to be built, e.g. #1235; However when cmake is installed by Nix, then pkg-config, cairo etc will be used but they can only be accessible in Nix development environment for example nix-shell, nix develop, etc. See `sdata/uv/shell.nix`. )
- uv #uv (Used for python venv)
- gtk4 #gtk4 (Not explicitly used)
- libadwaita #libadwaita (Not explicitly used)
- libsoup_3 #libsoup3 (Not explicitly used)
- libportal-gtk4 #libportal-gtk4 (Not explicitly used)
- gobject-introspection #gobject-introspection (Not explicitly used)
+ #clang (Not needed for Nix. However, when cmake is installed by Nix, then pkg-config, cairo etc will be used but they can only be accessible in Nix development environment for example nix-shell, nix develop, etc. See `sdata/uv/shell.nix`. )
+ uv #uv
+ gtk4 #gtk4
+ libadwaita #libadwaita
+ libsoup_3 #libsoup3
+ libportal-gtk4 #libportal-gtk4
+ gobject-introspection #gobject-introspection
### illogical-impulse-screencapture
- hyprshot #hyprshot (Used in Hyprland keybinds.conf as fallback)
- slurp #slurp (Used in Hyprland and Quickshell config)
- swappy #swappy (Used in Quickshell config)
- tesseract #tesseract (Used in Quickshell and Hyprland config)
- #tesseract-data-eng (Used as data for tesseract) (TODO: Seems not available as nixpkg)
- wf-recorder #wf-recorder (Used in Quickshell config)
+ hyprshot #hyprshot
+ slurp #slurp
+ swappy #swappy
+ tesseract #tesseract
+ #tesseract-data-eng (TODO: Seems not available as nixpkg)
+ wf-recorder #wf-recorder
### illogical-impulse-toolkit
- upower #upower (Used in Quickshell config)
- wtype #wtype (Used in Hyprland scripts/fuzzel-emoji.sh)
- ydotool #ydotool (Used in Quickshell config)
+ upower #upower
+ wtype #wtype
+ ydotool #ydotool
### illogical-impulse-widgets
- fuzzel #fuzzel (Used in Hyprland and Quickshell config; its config is also included)
- glib #glib2 (Provide executable gsettings) (Used in install script, also in matugen and quickshell config)
- imagemagick #imagemagick (Provide executable: magick) (Used in Quickshell config)
- #hypridle (DUPLICATE)
- #hyprutils (DUPLICATE)
- #hyprlock (DUPLICATE)
- #hyprpicker (DUPLICATE)
- songrec #songrec (Used in Quickshell config)
- translate-shell #translate-shell (Used in Quickshell config)
- wlogout #wlogout (Used in Hyprland config)
+ fuzzel #fuzzel
+ glib #glib2
+ imagemagick #imagemagick
+ hypridle #hypridle
+ #hyprlock (Should not be installed via Nix; TODO: should install via nix in future when authentication problem fixed)
+ hyprpicker #hyprpicker
+ songrec #songrec
+ translate-shell #translate-shell
+ wlogout #wlogout
]
++ [
diff --git a/sdata/dist-nix/home-manager/quickshell.nix b/sdata/dist-nix/home-manager/quickshell.nix
index 83601718d..823797082 100644
--- a/sdata/dist-nix/home-manager/quickshell.nix
+++ b/sdata/dist-nix/home-manager/quickshell.nix
@@ -40,8 +40,8 @@ in pkgs.stdenv.mkDerivation {
qt6.qttranslations #qt6-translations
qt6.qtvirtualkeyboard #qt6-virtualkeyboard
qt6.qtwayland #qt6-wayland
- kdePackages.kdialog #kdialog (Used in Quickshell config)
- kdePackages.syntax-highlighting #syntax-highlighting (Used in Quickshell config)
+ kdePackages.kdialog #kdialog
+ kdePackages.syntax-highlighting #syntax-highlighting
];
installPhase = ''
diff --git a/sdata/dist-nix/install-deps.sh b/sdata/dist-nix/install-deps.sh
index cda6f38f4..357bb498f 100644
--- a/sdata/dist-nix/install-deps.sh
+++ b/sdata/dist-nix/install-deps.sh
@@ -2,46 +2,15 @@
# It's not for directly running.
function vianix-warning(){
- printf "${STY_YELLOW}Currently \"--via-nix\" will run:\n"
+ printf "${STY_YELLOW}"
+ printf "Currently \"--via-nix\" will run:\n"
printf " home-manager switch --flake .#illogical_impulse\n"
- printf "If you are already using home-manager, it may override your current config,\n"
+ printf "If you are already using home-manager,\n"
+ printf "it may override your current config,\n"
printf "despite that this should be reversible.\n"
+ printf "${STY_RST}"
pause
}
-function install_cmds(){
- if [[ "$OS_DISTRO_ID" == "arch" || "$OS_DISTRO_ID_LIKE" == "arch" || "$OS_DISTRO_ID" == "cachyos" ]]; then
- local pkgs=()
- for cmd in "$@";do
- # For package name which is not cmd name, use "case" syntax to replace
- pkgs+=($cmd)
- done
- x sudo pacman -Syu
- x sudo pacman -S --noconfirm --needed "${pkgs[@]}"
- elif [[ "$OS_DISTRO_ID" == "debian" || "$OS_DISTRO_ID_LIKE" == "debian" ]]; then
- local pkgs=()
- for cmd in "$@";do
- # For package name which is not cmd name, use "case" syntax to replace
- pkgs+=($cmd)
- done
- x sudo apt update -y
- x sudo apt install -y "${pkgs[@]}"
- elif [[ "$OS_DISTRO_ID" == "fedora" || "$OS_DISTRO_ID_LIKE" == "fedora" ]]; then
- local pkgs=()
- for cmd in "$@";do
- # For package name which is not cmd name, use "case" syntax to replace
- pkgs+=($cmd)
- done
- x sudo dnf install -y "${pkgs[@]}"
- elif [[ "$OS_DISTRO_ID" =~ ^(opensuse-leap|opensuse-tumbleweed)$ ]] || [[ "$OS_DISTRO_ID_LIKE" =~ ^(opensuse|suse)(\ (opensuse|suse))?$ ]]; then
- local pkgs=()
- for cmd in "$@";do
- # For package name which is not cmd name, use "case" syntax to replace
- pkgs+=($cmd)
- done
- x sudo zypper refresh
- x sudo zypper -n install "${pkgs[@]}"
- fi
-}
function install_nix(){
# https://github.com/NixOS/experimental-nix-installer
local cmd=nix
@@ -96,18 +65,8 @@ function hm_deps(){
vianix-warning
-NOT_FOUND_CMDS=()
TEST_CMDS=(curl fish swaylock gnome-keyring)
-for cmd in "${TEST_CMDS[@]}"; do
- if ! command -v $cmd >/dev/null 2>&1;then
- NOT_FOUND_CMDS+=($cmd)
- fi
-done
-if [[ ${#NOT_FOUND_CMDS[@]} -gt 0 ]]; then
- echo -e "${STY_YELLOW}[$0]: Not found: ${NOT_FOUND_CMDS[*]}.${STY_RST}"
- showfun install_cmds
- v install_cmds "${NOT_FOUND_CMDS[@]}"
-fi
+ensure_cmds "${TEST_CMDS[@]}"
if ! command -v nix >/dev/null 2>&1;then
echo -e "${STY_YELLOW}[$0]: \"nix\" not found.${STY_RST}"
diff --git a/sdata/dist-nix/install-setups.sh b/sdata/dist-nix/install-setups.sh
deleted file mode 100644
index 0ddcfcf37..000000000
--- a/sdata/dist-nix/install-setups.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-# This script is meant to be sourced.
-# It's not for directly running.
-
-#####################################################################################
-# These python packages are installed using uv into the venv (virtual environment). Once the folder of the venv gets deleted, they are all gone cleanly. So it's considered as setups, not dependencies.
-showfun install-python-packages
-v install-python-packages
-
-if [[ -z $(getent group i2c) ]]; then
- v sudo groupadd i2c
-fi
-
-v sudo usermod -aG video,i2c,input "$(whoami)"
-
-if [[ ! -z $(systemctl --version) ]]; then
- v bash -c "echo i2c-dev | sudo tee /etc/modules-load.d/i2c-dev.conf"
- # TODO: find a proper way for enable Nix installed ydotool
- if ! [[ "${INSTALL_VIA_NIX}" == true ]]; then
- v systemctl --user enable ydotool --now
- fi
- v sudo systemctl enable bluetooth --now
-elif [[ ! -z $(openrc --version) ]]; then
- v bash -c "echo 'modules=i2c-dev' | sudo tee -a /etc/conf.d/modules"
- v sudo rc-update add modules boot
- v sudo rc-update add ydotool default
- v sudo rc-update add bluetooth default
-
- x sudo rc-service ydotool start
- x sudo rc-service bluetooth start
-else
- printf "${STY_RED}"
- printf "====================INIT SYSTEM NOT FOUND====================\n"
- printf "${STY_RST}"
- pause
-fi
-
-v gsettings set org.gnome.desktop.interface font-name 'Rubik 11'
-v gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark'
-v kwriteconfig6 --file kdeglobals --group KDE --key widgetStyle Darkly
diff --git a/sdata/lib/dist-determine.sh b/sdata/lib/dist-determine.sh
new file mode 100644
index 000000000..46f9afdd8
--- /dev/null
+++ b/sdata/lib/dist-determine.sh
@@ -0,0 +1,126 @@
+# This script is meant to be sourced.
+# It's not for directly running.
+function print_os_group_id(){
+ printf "${STY_CYAN}"
+ printf "===INFO===\n"
+ printf "Detected OS_DISTRO_ID: ${OS_DISTRO_ID}\n"
+ printf "Detected OS_DISTRO_ID_LIKE: ${OS_DISTRO_ID_LIKE}\n"
+ printf "Determined OS_GROUP_ID: ${OS_GROUP_ID}\n"
+ printf "==========\n\n"
+ printf "${STY_RST}"
+}
+function print_os_group_id_alike(){
+ printf "${STY_YELLOW}"
+ printf "===WARNING===\n"
+ printf "Your OS_GROUP_ID has been determined by \"alike\" match.\n"
+ printf "Ideally, it should also work for your distro.\n"
+ printf "Still, there is a chance that it not works as expected or even fails.\n"
+ printf "Proceed only at your own risk.\n"
+ printf "=============\n\n"
+ printf "${STY_RST}"
+}
+function print_os_group_id_unofficial(){
+ printf "${STY_PURPLE}"
+ printf "===NOTICE===\n"
+ printf "The support for your distro is provided by the community.\n"
+ printf "It is not officially supported by github:end-4/dots-hyprland .\n"
+ printf "${STY_BOLD}"
+ printf "If you find out any problems about it, PR is welcomed if you are able to address it. Or, create a discussion about it, but please do not submit issue, because the developers do not use this distro, therefore they cannot help.${STY_RST}\n"
+ printf "${STY_PURPLE}"
+ printf "Proceed only at your own risk.\n"
+ printf "============\n\n"
+ printf "${STY_RST}"
+}
+function print_os_group_id_unsupported(){
+ printf "${STY_RED}"
+ printf "===CAUTION===\n"
+ printf "\"--via-nix\" is forcely specified \n"
+ printf "as the only way to try to install on your distro.\n"
+ printf "It is still experimental.\n"
+ printf "Some functionalities are missing.\n"
+ printf "It may also behave unexpectedly.\n"
+ printf "Proceed only at your own risk.\n"
+ printf "=============\n\n"
+ printf "${STY_RST}"
+ sleep 3
+}
+function print_os_group_id_fallback(){
+ printf "${STY_RED}"
+ printf "===CAUTION===\n"
+ printf "Distro not recognized, determined as fallback.\n"
+ printf "=============\n\n"
+ printf "${STY_RST}"
+}
+function print_os_group_id_architecture(){
+ printf "${STY_RED}"
+ printf "===CAUTION===\n"
+ printf "Detected machine architecture: ${MACHINE_ARCH}\n"
+ printf "This script only supports x86_64.\n"
+ printf "It is very likely to fail when installing dependencies on your machine.\n"
+ printf "=============\n\n"
+ printf "${STY_RST}"
+}
+#####################################################################################
+
+####################
+# Detect distro
+# Helpful link(s):
+# http://stackoverflow.com/questions/29581754
+# https://github.com/which-distro/os-release
+OS_RELEASE_FILE_CUSTOM="${REPO_ROOT}/os-release"
+if test -f "${OS_RELEASE_FILE_CUSTOM}"; then
+ printf "${STY_YELLOW}Warning: using custom os-release file \"${OS_RELEASE_FILE_CUSTOM}\".${STY_RST}\n"
+ OS_RELEASE_FILE="${OS_RELEASE_FILE_CUSTOM}"
+elif test -f /etc/os-release; then
+ OS_RELEASE_FILE=/etc/os-release
+else
+ printf "${STY_RED}/etc/os-release does not exist, aborting...${STY_RST}\n" ; exit 1
+fi
+export OS_DISTRO_ID=$(awk -F'=' '/^ID=/ { gsub("\"","",$2); print tolower($2) }' ${OS_RELEASE_FILE} 2> /dev/null)
+export OS_DISTRO_ID_LIKE=$(awk -F'=' '/^ID_LIKE=/ { gsub("\"","",$2); print tolower($2) }' ${OS_RELEASE_FILE} 2> /dev/null)
+
+
+####################
+# Determine distro ID
+
+if [[ "$OS_DISTRO_ID" =~ ^(arch|endeavouros|cachyos)$ ]]; then
+ OS_GROUP_ID="arch"
+ print_os_group_id_functions=(print_os_group_id)
+elif [[ "$OS_DISTRO_ID_LIKE" == "arch" ]]; then
+ OS_GROUP_ID="arch"
+ print_os_group_id_functions=(print_os_group_id{,_alike})
+elif [[ "$OS_DISTRO_ID" == "gentoo" ]]; then
+ OS_GROUP_ID="gentoo"
+ print_os_group_id_functions=(print_os_group_id{,_unofficial})
+elif [[ "$OS_DISTRO_ID_LIKE" == "gentoo" ]]; then
+ OS_GROUP_ID="gentoo"
+ print_os_group_id_functions=(print_os_group_id{,_alike,_unofficial})
+elif [[ "$OS_DISTRO_ID" == "fedora" ]]; then
+ OS_GROUP_ID="fedora"
+ print_os_group_id_functions=(print_os_group_id{,_unofficial})
+elif [[ "$OS_DISTRO_ID_LIKE" == "fedora" ]]; then
+ OS_GROUP_ID="fedora"
+ print_os_group_id_functions=(print_os_group_id{,_alike,_unofficial})
+elif [[ "$OS_DISTRO_ID" =~ ^(opensuse-leap|opensuse-tumbleweed)$ ]] || [[ "$OS_DISTRO_ID_LIKE" =~ ^(opensuse|suse)(\ (opensuse|suse))?$ ]]; then
+ OS_GROUP_ID="suse"
+ INSTALL_VIA_NIX=true
+ print_os_group_id_functions=(print_os_group_id{,_unsupported})
+elif [[ "$OS_DISTRO_ID" == "debian" || "$OS_DISTRO_ID_LIKE" == "debian" ]]; then
+ OS_GROUP_ID="debian"
+ INSTALL_VIA_NIX=true
+ print_os_group_id_functions=(print_os_group_id{,_unsupported})
+else
+ OS_GROUP_ID="fallback"
+ INSTALL_VIA_NIX=true
+ print_os_group_id_functions=(print_os_group_id{,_fallback,_unsupported})
+fi
+
+####################
+# Detect architecture
+# Helpful link(s):
+# http://stackoverflow.com/questions/45125516
+export MACHINE_ARCH=$(uname -m)
+case "${MACHINE_ARCH}" in
+ "x86_64") sleep 0;;
+ *) print_os_group_id_functions+=(print_os_group_id_architecture);;
+esac
diff --git a/sdata/lib/environment-variables.sh b/sdata/lib/environment-variables.sh
index 71ca6d023..5344be4c7 100644
--- a/sdata/lib/environment-variables.sh
+++ b/sdata/lib/environment-variables.sh
@@ -26,4 +26,4 @@ STY_RST='\e[00m'
# Used by register_temp_file()
declare -a TEMP_FILES_TO_CLEANUP=()
-
+FIRSTRUN_FILE="${XDG_CACHE_HOME}/.ii-qs-installed"
diff --git a/sdata/lib/functions.sh b/sdata/lib/functions.sh
index a2455c2a2..54d4c3b73 100644
--- a/sdata/lib/functions.sh
+++ b/sdata/lib/functions.sh
@@ -344,3 +344,74 @@ function backup_clashing_targets(){
x mkdir -p $backup_dir
x rsync -av --progress "${args_includes[@]}" "$target_dir/" "$backup_dir/"
}
+
+function install_cmds(){
+ case $OS_GROUP_ID in
+ "arch")
+ local pkgs=()
+ for cmd in "$@";do
+ # For package name which is not cmd name, use "case" syntax to replace
+ case $cmd in
+ ip) pkgs+=(iproute2);;
+ *) pkgs+=($cmd) ;;
+ esac
+ done
+ v sudo pacman -Syu
+ v sudo pacman -S --noconfirm --needed "${pkgs[@]}"
+ ;;
+ "debian")
+ local pkgs=()
+ for cmd in "$@";do
+ # For package name which is not cmd name, use "case" syntax to replace
+ case $cmd in
+ ip) pkgs+=(iproute2);;
+ *) pkgs+=($cmd) ;;
+ esac
+ done
+ v sudo apt update -y
+ v sudo apt install -y "${pkgs[@]}"
+ ;;
+ "fedora")
+ local pkgs=()
+ for cmd in "$@";do
+ # For package name which is not cmd name, use "case" syntax to replace
+ case $cmd in
+ ip) pkgs+=(iproute);;
+ *) pkgs+=($cmd) ;;
+ esac
+ done
+ v sudo dnf install -y "${pkgs[@]}"
+ ;;
+ "suse")
+ local pkgs=()
+ for cmd in "$@";do
+ # For package name which is not cmd name, use "case" syntax to replace
+ case $cmd in
+ ip) pkgs+=(iproute2);;
+ *) pkgs+=($cmd) ;;
+ esac
+ done
+ v sudo zypper refresh
+ v sudo zypper -n install "${pkgs[@]}"
+ ;;
+ *)
+ printf "WARNING\n"
+ printf "No method found to install package providing the commands:\n"
+ printf " $@\n"
+ printf "Please install by yourself.\n"
+ ;;
+ esac
+}
+
+function ensure_cmds(){
+ local not_found_cmds=()
+ for cmd in "$@"; do
+ if ! command -v $cmd >/dev/null 2>&1;then
+ not_found_cmds+=($cmd)
+ fi
+ done
+ if [[ ${#not_found_cmds[@]} -gt 0 ]]; then
+ echo -e "${STY_YELLOW}[$0]: Not found: ${not_found_cmds[*]}.${STY_RST}"
+ install_cmds "${not_found_cmds[@]}"
+ fi
+}
diff --git a/sdata/subcmd-checkdeps/options.sh b/sdata/subcmd-checkdeps/options.sh
index 562b2e364..b5d0dbcd0 100644
--- a/sdata/subcmd-checkdeps/options.sh
+++ b/sdata/subcmd-checkdeps/options.sh
@@ -16,13 +16,14 @@ para=$(getopt \
-l help \
-n "$0" -- "$@")
[ $? != 0 ] && echo "$0: Error when getopt, please recheck parameters." && exit 1
+echo $para
#####################################################################################
eval set -- "$para"
while true ; do
case "$1" in
-h|--help) showhelp;exit;;
--) shift;break ;;
- *) sleep 0 ;;
+ *) echo -e "$0: Wrong parameters.";exit 1;;
esac
done
diff --git a/sdata/subcmd-install/1.deps-router.sh b/sdata/subcmd-install/1.deps-router.sh
new file mode 100644
index 000000000..1287e4c6f
--- /dev/null
+++ b/sdata/subcmd-install/1.deps-router.sh
@@ -0,0 +1,92 @@
+# This script is meant to be sourced.
+# It's not for directly running.
+printf "${STY_CYAN}[$0]: 1. Install dependencies\n${STY_RST}"
+
+function outdate_detect(){
+ # Shallow clone prevent latest_commit_timestamp() from working.
+ x git_auto_unshallow 2>&1>/dev/null
+
+ local source_path="$1"
+ local target_path="$2"
+ local source_timestamp="$(latest_commit_timestamp $source_path 2>/dev/null)"
+ local target_timestamp="$(latest_commit_timestamp $target_path 2>/dev/null)"
+ local outdate_detect_mode="$(cat ${target_path}/outdate-detect-mode)"
+
+ # outdate-detect-mode possible modes:
+ # - WIP: Work in progress (should be taken as outdated)
+ # - FORCE_OUTDATED: forcely taken as outdated
+ # - FORCE_UPDATED: forcely taken as updated
+ # - AUTO: Let the script decide automatically
+ #
+ # outdate status possible values:
+ # - WIP,FORCE_OUTDATED,FORCE_UPDATED: Inherited directly from outdate-detect-mode
+ # - EMPTY_SOURCE: source path has empty timestamp, maybe not tracked by git (should be taken as outdated)
+ # - EMPTY_TARGET: target path has empty timestamp, maybe not tracked by git (should be taken as outdated)
+ # - OUTDATED: target path is older than source path.
+ # - UPDATED: target path is not older than source path.
+
+ # Does target path have an outdate-detect-mode file which content is special?
+ if [[ "${outdate_detect_mode}" =~ ^(WIP|FORCE_OUTDATED|FORCE_UPDATED)$ ]]; then
+ echo "${outdate_detect_mode}"
+ # Does source path has an empty timestamp?
+ elif [ -z "$source_timestamp" ]; then
+ echo "EMPTY_SOURCE"
+ # Does target path has an empty timestamp?
+ elif [ -z "$target_timestamp" ]; then
+ echo "EMPTY_TARGET"
+ # If target path is older than source path, it's outdated.
+ elif [[ "$target_timestamp" -lt "$source_timestamp" ]]; then
+ echo "OUTDATED"
+ else
+ echo "UPDATED"
+ fi
+}
+#####################################################################################
+
+if [[ "$INSTALL_VIA_NIX" == "true" ]]; then
+
+ TARGET_ID=nix
+ printf "${STY_YELLOW}"
+ printf "===WARNING===\n"
+ printf "./sdata/dist-${TARGET_ID}/install-deps.sh will be used.\n"
+ printf "The process is still WIP.\n"
+ printf "Proceed only at your own risk.\n"
+ printf "\n"
+ printf "${STY_RST}"
+ pause
+ source ./sdata/dist-${TARGET_ID}/install-deps.sh
+
+elif [[ "$OS_GROUP_ID" =~ ^(arch|gentoo|fedora)$ ]]; then
+
+ TARGET_ID=$OS_GROUP_ID
+ if ! [[ "${TARGET_ID}" = "arch" ]]; then
+ tmp_update_status="$(outdate_detect sdata/dist-arch sdata/dist-${TARGET_ID})"
+ if [[ "${tmp_update_status}" =~ ^(OUTDATED|EMPTY_TARGET|EMPTY_SOURCE|FORCE_OUTDATED|WIP)$ ]]; then
+ printf "${STY_RED}${STY_BOLD}===URGENT===${STY_RST}\n"
+ printf "${STY_RED}"
+ printf "The community provided ./sdata/dist-${TARGET_ID}/ is outdated (status: ${tmp_update_status}),\n"
+ printf "which means it probably does not reflect all latest changes of ./sdata/dist-arch/ .\n"
+ printf "\n"
+ printf "According to the actual changes, it may still works, but it can also work unexpectedly.\n"
+ printf "It's highly recommended to check the following links before continue:${STY_RST}\n"
+ printf "${STY_UNDERLINE}https://github.com/end-4/dots-hyprland/discussions/2140${STY_RST}\n"
+ printf "${STY_UNDERLINE}https://github.com/end-4/dots-hyprland/commits/main/sdata/dist-arch${STY_RST}\n"
+ printf "${STY_UNDERLINE}https://github.com/end-4/dots-hyprland/commits/main/sdata/dist-${TARGET_ID}${STY_RST}\n"
+ printf "\n"
+ printf "${STY_PURPLE}${STY_INVERT}PR on ./sdata/dist-${TARGET_ID}/ to properly reflect the latest changes of ./sdata/dist-arch is welcomed.${STY_RST}\n"
+ printf "\n"
+ if [ "$ask" = "false" ]; then
+ echo "Urgent problem encountered, aborting...";exit 1
+ else
+ printf "${STY_RED}Still proceed?${STY_RST}\n"
+ read -p "[y/N]: " p
+ case "$p" in
+ [yY])sleep 0;;
+ *)echo "Aborting...";exit 1;;
+ esac
+ fi
+ fi
+ fi
+ printf "./sdata/dist-${TARGET_ID}/install-deps.sh will be used.\n"
+ source ./sdata/dist-${TARGET_ID}/install-deps.sh
+fi
diff --git a/sdata/subcmd-install/1.deps-selector.sh b/sdata/subcmd-install/1.deps-selector.sh
deleted file mode 100644
index 6ab87afd6..000000000
--- a/sdata/subcmd-install/1.deps-selector.sh
+++ /dev/null
@@ -1,193 +0,0 @@
-# This script is meant to be sourced.
-# It's not for directly running.
-printf "${STY_CYAN}[$0]: 1. Install dependencies\n${STY_RST}"
-
-function outdate_detect(){
- # Shallow clone prevent latest_commit_timestamp() from working.
- x git_auto_unshallow 2>&1>/dev/null
-
- local source_path="$1"
- local target_path="$2"
- local source_timestamp="$(latest_commit_timestamp $source_path 2>/dev/null)"
- local target_timestamp="$(latest_commit_timestamp $target_path 2>/dev/null)"
- local outdate_detect_mode="$(cat ${target_path}/outdate-detect-mode)"
-
- # outdate-detect-mode possible modes:
- # - WIP: Work in progress (should be taken as outdated)
- # - FORCE_OUTDATED: forcely taken as outdated
- # - FORCE_UPDATED: forcely taken as updated
- # - AUTO: Let the script decide automatically
- #
- # outdate status possible values:
- # - WIP,FORCE_OUTDATED,FORCE_UPDATED: Inherited directly from outdate-detect-mode
- # - EMPTY_SOURCE: source path has empty timestamp, maybe not tracked by git (should be taken as outdated)
- # - EMPTY_TARGET: target path has empty timestamp, maybe not tracked by git (should be taken as outdated)
- # - OUTDATED: target path is older than source path.
- # - UPDATED: target path is not older than source path.
-
- # Does target path have an outdate-detect-mode file which content is special?
- if [[ "${outdate_detect_mode}" =~ ^(WIP|FORCE_OUTDATED|FORCE_UPDATED)$ ]]; then
- echo "${outdate_detect_mode}"
- # Does source path has an empty timestamp?
- elif [ -z "$source_timestamp" ]; then
- echo "EMPTY_SOURCE"
- # Does target path has an empty timestamp?
- elif [ -z "$target_timestamp" ]; then
- echo "EMPTY_TARGET"
- # If target path is older than source path, it's outdated.
- elif [[ "$target_timestamp" -lt "$source_timestamp" ]]; then
- echo "OUTDATED"
- else
- echo "UPDATED"
- fi
-}
-####################
-# Detect architecture
-# Helpful link(s):
-# http://stackoverflow.com/questions/45125516
-export MACHINE_ARCH=$(uname -m)
-case $MACHINE_ARCH in
- "x86_64") sleep 0;;
- *)
- printf "${STY_YELLOW}"
- printf "===WARNING===\n"
- printf "Detected machine architecture: ${MACHINE_ARCH}\n"
- printf "This script only supports x86_64.\n"
- printf "It is very likely to fail when installing dependencies on your machine.\n"
- printf "\n"
- printf "${STY_RST}"
- pause
- ;;
-esac
-
-####################
-# Detect distro
-# Helpful link(s):
-# http://stackoverflow.com/questions/29581754
-# https://github.com/which-distro/os-release
-OS_RELEASE_FILE_CUSTOM="${REPO_ROOT}/os-release"
-if test -f "${OS_RELEASE_FILE_CUSTOM}"; then
- printf "${STY_YELLOW}Warning: using custom os-release file \"${OS_RELEASE_FILE_CUSTOM}\".${STY_RST}\n"
- OS_RELEASE_FILE="${OS_RELEASE_FILE_CUSTOM}"
-elif test -f /etc/os-release; then
- OS_RELEASE_FILE=/etc/os-release
-else
- printf "${STY_RED}/etc/os-release does not exist, aborting...${STY_RST}\n" ; exit 1
-fi
-export OS_DISTRO_ID=$(awk -F'=' '/^ID=/ { gsub("\"","",$2); print tolower($2) }' ${OS_RELEASE_FILE} 2> /dev/null)
-export OS_DISTRO_ID_LIKE=$(awk -F'=' '/^ID_LIKE=/ { gsub("\"","",$2); print tolower($2) }' ${OS_RELEASE_FILE} 2> /dev/null)
-
-
-if [[ "$INSTALL_VIA_NIX" == "true" ]]; then
-
- TARGET_ID=nix
- printf "${STY_YELLOW}"
- printf "===WARNING===\n"
- printf "./sdata/dist-${TARGET_ID}/install-deps.sh will be used.\n"
- printf "The process is still WIP.\n"
- printf "Proceed only at your own risk.\n"
- printf "\n"
- printf "${STY_RST}"
- pause
- source ./sdata/dist-${TARGET_ID}/install-deps.sh
-
-elif [[ "$OS_DISTRO_ID" =~ ^(arch|endeavouros)$ ]]; then
-
- TARGET_ID=arch
- printf "${STY_GREEN}"
- printf "===INFO===\n"
- printf "Detected distro ID: ${OS_DISTRO_ID}\n"
- printf "./sdata/dist-${TARGET_ID}/install-deps.sh will be used.\n"
- printf "\n"
- printf "${STY_RST}"
- pause
- source ./sdata/dist-${TARGET_ID}/install-deps.sh
-
-elif [[ -f "./sdata/dist-${OS_DISTRO_ID}/install-deps.sh" ]]; then
-
- TARGET_ID=${OS_DISTRO_ID}
- printf "${STY_PURPLE}"
- printf "===NOTICE===\n"
- printf "Detected distro ID: ${OS_DISTRO_ID}\n"
- printf "./sdata/dist-${TARGET_ID}/install-deps.sh will be used.\n"
- printf "This file is provided by the community.\n"
- printf "It is not officially supported by github:end-4/dots-hyprland .\n"
- test -f "./sdata/dist-${TARGET_ID}/README.md" && \
- printf "Read ${STY_INVERT} ./sdata/dist-${TARGET_ID}/README.md ${STY_RST}${STY_PURPLE} for more information.\n"
- printf "${STY_BOLD}"
- printf "If you find out any problems about it, PR is welcomed if you are able to address it. Or, create a discussion about it, but please do not submit issue, because the developers do not use this distro, therefore they cannot help.${STY_RST}\n"
- printf "${STY_PURPLE}"
- printf "Proceed only at your own risk.\n"
- printf "\n"
- printf "${STY_RST}"
- pause
- tmp_update_status="$(outdate_detect sdata/dist-arch sdata/dist-${TARGET_ID})"
- if [[ "${tmp_update_status}" =~ ^(OUTDATED|EMPTY_TARGET|EMPTY_SOURCE|FORCE_OUTDATED|WIP)$ ]]; then
- printf "${STY_RED}${STY_BOLD}===URGENT===${STY_RST}\n"
- printf "${STY_RED}"
- printf "The community provided ./sdata/dist-${TARGET_ID}/ is outdated (status: ${tmp_update_status}),\n"
- printf "which means it probably does not reflect all latest changes of ./sdata/dist-arch/ .\n"
- printf "\n"
- printf "According to the actual changes, it may still works, but it can also work unexpectedly.\n"
- printf "It's highly recommended to check the following links before continue:${STY_RST}\n"
- printf "${STY_UNDERLINE}https://github.com/end-4/dots-hyprland/discussions/2140${STY_RST}\n"
- printf "${STY_UNDERLINE}https://github.com/end-4/dots-hyprland/commits/main/sdata/dist-arch${STY_RST}\n"
- printf "${STY_UNDERLINE}https://github.com/end-4/dots-hyprland/commits/main/sdata/dist-${TARGET_ID}${STY_RST}\n"
- printf "\n"
- printf "${STY_PURPLE}${STY_INVERT}PR on ./sdata/dist-${TARGET_ID}/ to properly reflect the latest changes of ./sdata/dist-arch is welcomed.${STY_RST}\n"
- printf "\n"
- if [ "$ask" = "false" ]; then
- echo "Urgent problem encountered, aborting...";exit 1
- else
- printf "${STY_RED}Still proceed?${STY_RST}\n"
- read -p "[y/N]: " p
- case "$p" in
- [yY])sleep 0;;
- *)echo "Aborting...";exit 1;;
- esac
- fi
- fi
- source ./sdata/dist-${TARGET_ID}/install-deps.sh
-
-elif [[ "$OS_DISTRO_ID_LIKE" == "arch" || "$OS_DISTRO_ID" == "cachyos" ]]; then
-
- TARGET_ID=arch
- printf "${STY_YELLOW}"
- printf "===WARNING===\n"
- printf "Detected distro ID: ${OS_DISTRO_ID}\n"
- printf "Detected distro ID_LIKE: ${OS_DISTRO_ID_LIKE}\n"
- printf "./sdata/dist-${TARGET_ID}/install-deps.sh will be used.\n"
- printf "Ideally, it should also work for your distro.\n"
- printf "Still, there is a chance that it not works as expected or even fails.\n"
- printf "Proceed only at your own risk.\n"
- printf "\n"
- printf "${STY_RST}"
- pause
- source ./sdata/dist-${TARGET_ID}/install-deps.sh
-
-else
-
- TARGET_ID=fallback
- printf "${STY_RED}${STY_BOLD}===URGENT===${STY_RST}\n"
- printf "${STY_RED}"
- printf "Detected distro ID: ${OS_DISTRO_ID}\n"
- printf "Detected distro ID_LIKE: ${OS_DISTRO_ID_LIKE}\n"
- printf "./sdata/dist-${OS_DISTRO_ID}/install-deps.sh not found.\n"
- printf "./sdata/dist-${TARGET_ID}/install-deps.sh will be used.\n"
- printf "1. It may disrupt your system and will likely fail without your manual intervention.\n"
- printf "2. It is WIP and only contains small number of dependencies far from enough.\n"
- printf "Proceed only at your own risk.\n"
- printf "${STY_RST}"
- if [ "$ask" = "false" ]; then
- echo "Urgent problem encountered, aborting...";exit 1
- else
- printf "${STY_RED}Still proceed?${STY_RST}\n"
- read -p "[y/N]: " p
- case "$p" in
- [yY])sleep 0;;
- *)echo "Aborting...";exit 1;;
- esac
- fi
- source ./sdata/dist-${TARGET_ID}/install-deps.sh
-
-fi
diff --git a/sdata/subcmd-install/2.setups-selector.sh b/sdata/subcmd-install/2.setups-selector.sh
deleted file mode 100644
index 0a72e8728..000000000
--- a/sdata/subcmd-install/2.setups-selector.sh
+++ /dev/null
@@ -1,95 +0,0 @@
-# This script is meant to be sourced.
-# It's not for directly running.
-printf "${STY_CYAN}[$0]: 2. Setup for permissions/services etc\n${STY_RST}"
-
-# shellcheck shell=bash
-
-####################
-# Detect distro
-# Helpful link(s):
-# http://stackoverflow.com/questions/29581754
-# https://github.com/which-distro/os-release
-export OS_RELEASE_FILE=${OS_RELEASE_FILE:-/etc/os-release}
-test -f ${OS_RELEASE_FILE} || \
- ( echo "${OS_RELEASE_FILE} does not exist. Aborting..." ; exit 1 ; )
-export OS_DISTRO_ID=$(awk -F'=' '/^ID=/ { gsub("\"","",$2); print tolower($2) }' ${OS_RELEASE_FILE} 2> /dev/null)
-export OS_DISTRO_ID_LIKE=$(awk -F'=' '/^ID_LIKE=/ { gsub("\"","",$2); print tolower($2) }' ${OS_RELEASE_FILE} 2> /dev/null)
-
-
-
-if [[ "$INSTALL_VIA_NIX" == "true" ]]; then
-
- TARGET_ID=nix
- printf "${STY_YELLOW}"
- printf "===WARNING===\n"
- printf "./sdata/dist-${TARGET_ID}/install-setups.sh will be used.\n"
- printf "The process is still WIP.\n"
- printf "Proceed only at your own risk.\n"
- printf "\n"
- printf "${STY_RST}"
- pause
- source ./sdata/dist-${TARGET_ID}/install-setups.sh
-
-elif [[ "$OS_DISTRO_ID" == "arch" ]]; then
-
- TARGET_ID=arch
- printf "${STY_GREEN}"
- printf "===INFO===\n"
- printf "Detected distro ID: ${OS_DISTRO_ID}\n"
- printf "./sdata/dist-${TARGET_ID}/install-setups.sh will be used.\n"
- printf "\n"
- printf "${STY_RST}"
- pause
- source ./sdata/dist-${TARGET_ID}/install-setups.sh
-
-elif [[ -f "./sdata/dist-${OS_DISTRO_ID}/install-setups.sh" ]]; then
-
- TARGET_ID=${OS_DISTRO_ID}
- printf "${STY_PURPLE}"
- printf "===NOTICE===\n"
- printf "Detected distro ID: ${OS_DISTRO_ID}\n"
- printf "./sdata/dist-${TARGET_ID}/install-setups.sh will be used.\n"
- printf "This file is provided by the community.\n"
- printf "It is not officially supported by github:end-4/dots-hyprland .\n"
- printf "${STY_INVERT}"
- printf "If you find out any problems about it, PR is welcomed if you are able to address it. Or, create a discussion about it, but please do not submit issue, because the developers do not use this distro, therefore they cannot help.${STY_RST}\n"
- printf "${STY_PURPLE}"
- printf "Proceed only at your own risk.\n"
- printf "\n"
- printf "${STY_RST}"
- pause
- source ./sdata/dist-${TARGET_ID}/install-setups.sh
-
-elif [[ "$OS_DISTRO_ID_LIKE" == "arch" || "$OS_DISTRO_ID" == "cachyos" ]]; then
-
- TARGET_ID=arch
- printf "${STY_YELLOW}"
- printf "===WARNING===\n"
- printf "Detected distro ID: ${OS_DISTRO_ID}\n"
- printf "Detected distro ID_LIKE: ${OS_DISTRO_ID_LIKE}\n"
- printf "./sdata/dist-${TARGET_ID}/install-setups.sh will be used.\n"
- printf "Ideally, it should also work for your distro.\n"
- printf "Still, there is a chance that it not works as expected or even fails.\n"
- printf "Proceed only at your own risk.\n"
- printf "\n"
- printf "${STY_RST}"
- pause
- source ./sdata/dist-${TARGET_ID}/install-setups.sh
-
-else
-
- TARGET_ID=fallback
- printf "${STY_RED}"
- printf "===WARNING===\n"
- printf "Detected distro ID: ${OS_DISTRO_ID}\n"
- printf "Detected distro ID_LIKE: ${OS_DISTRO_ID_LIKE}\n"
- printf "./sdata/dist-${OS_DISTRO_ID}/install-setups.sh not found.\n"
- printf "./sdata/dist-${TARGET_ID}/install-setups.sh will be used.\n"
- printf "It might fail or disrupt your system.\n"
- printf "Proceed only at your own risk.\n"
- printf "\n"
- printf "${STY_RST}"
- pause
- source ./sdata/dist-${TARGET_ID}/install-setups.sh
-
-fi
diff --git a/sdata/subcmd-install/2.setups.sh b/sdata/subcmd-install/2.setups.sh
new file mode 100644
index 000000000..2e585832c
--- /dev/null
+++ b/sdata/subcmd-install/2.setups.sh
@@ -0,0 +1,70 @@
+# This script is meant to be sourced.
+# It's not for directly running.
+
+function prepare_systemd_user_service(){
+ if [[ ! -d "${XDG_CONFIG_HOME}/systemd/user" ]]; then
+ x mkdir -p "${XDG_CONFIG_HOME}/systemd/user"
+ fi
+ if [[ ! -e "${XDG_CONFIG_HOME}/systemd/user/ydotool.service" ]]; then
+ x ln -s /usr/lib/systemd/system/ydotool.service "${XDG_CONFIG_HOME}/systemd/user/ydotool.service"
+ fi
+}
+
+function setup_user_group(){
+ if [[ -z $(getent group i2c) ]]; then
+ x sudo groupadd i2c
+ fi
+ x sudo usermod -aG video,i2c,input "$(whoami)"
+}
+#####################################################################################
+# These python packages are installed using uv into the venv (virtual environment). Once the folder of the venv gets deleted, they are all gone cleanly. So it's considered as setups, not dependencies.
+showfun install-python-packages
+v install-python-packages
+
+showfun setup_user_group
+v setup_user_group
+
+if [[ ! -z $(systemctl --version) ]]; then
+ # TODO: Why fedora does not add i2c-dev?
+ # TODO: Why fedora add uinput and udev rules?
+ if [[ "$OS_GROUP_ID" == "fedora" ]]; then
+ v bash -c "echo uinput | sudo tee /etc/modules-load.d/uinput.conf"
+ v bash -c 'echo SUBSYSTEM==\"misc\", KERNEL==\"uinput\", MODE=\"0660\", GROUP=\"input\" | sudo tee /etc/udev/rules.d/99-uinput.rules'
+ else
+ v bash -c "echo i2c-dev | sudo tee /etc/modules-load.d/i2c-dev.conf"
+ fi
+ # TODO: find a proper way for enable Nix installed ydotool. When running `systemctl --user enable ydotool, it errors "Failed to enable unit: Unit ydotool.service does not exist".
+ if [[ ! "${INSTALL_VIA_NIX}" == true ]]; then
+ if [[ "$OS_GROUP_ID" == "fedora" ]]; then
+ v prepare_systemd_user_service
+ fi
+ # When $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR are empty, it commonly means that the current user has been logged in with `su - user` or `ssh user@hostname`. In such case `systemctl --user enable ` is not usable. It should be `sudo systemctl --machine=$(whoami)@.host --user enable ` instead.
+ if [[ ! -z "${DBUS_SESSION_BUS_ADDRESS}" ]]; then
+ v systemctl --user enable ydotool --now
+ else
+ v sudo systemctl --machine=$(whoami)@.host --user enable ydotool --now
+ fi
+ fi
+ v sudo systemctl enable bluetooth --now
+elif [[ ! -z $(openrc --version) ]]; then
+ v bash -c "echo 'modules=i2c-dev' | sudo tee -a /etc/conf.d/modules"
+ v sudo rc-update add modules boot
+ v sudo rc-update add ydotool default
+ v sudo rc-update add bluetooth default
+
+ x sudo rc-service ydotool start
+ x sudo rc-service bluetooth start
+else
+ printf "${STY_RED}"
+ printf "====================INIT SYSTEM NOT FOUND====================\n"
+ printf "${STY_RST}"
+ pause
+fi
+
+if [[ "$OS_GROUP_ID" == "gentoo" ]]; then
+ v sudo chown -R $(whoami):$(whoami) ~/.local/
+fi
+
+v gsettings set org.gnome.desktop.interface font-name 'Rubik 11'
+v gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark'
+v kwriteconfig6 --file kdeglobals --group KDE --key widgetStyle Darkly
diff --git a/sdata/subcmd-install/3.files-exp.sh b/sdata/subcmd-install/3.files-exp.sh
index 0ff62c0e3..e924ef1d5 100644
--- a/sdata/subcmd-install/3.files-exp.sh
+++ b/sdata/subcmd-install/3.files-exp.sh
@@ -153,7 +153,7 @@ get_next_backup_number() {
# =============================================================================
# Run user preference wizard
-case $ask in
+case "$ask" in
false) sleep 0 ;;
*) wizard_update_preferences ;;
esac
@@ -214,7 +214,7 @@ for pattern in "${patterns[@]}"; do
fi
# Execute based on mode
- case $mode in
+ case "$mode" in
"sync")
if [[ -d "$from" ]]; then
warning_rsync_delete
diff --git a/sdata/subcmd-install/3.files-legacy.sh b/sdata/subcmd-install/3.files-legacy.sh
index 6b950ccd1..ebf549734 100644
--- a/sdata/subcmd-install/3.files-legacy.sh
+++ b/sdata/subcmd-install/3.files-legacy.sh
@@ -3,15 +3,58 @@
# shellcheck shell=bash
+function copy_file_s_t(){
+ local s=$1
+ local t=$2
+ if [ -f $t ];then
+ echo -e "${STY_YELLOW}[$0]: \"$t\" already exists.${STY_RST}"
+ if ${INSTALL_FIRSTRUN};then
+ echo -e "${STY_BLUE}[$0]: It seems to be the firstrun.${STY_RST}"
+ v mv $t $t.old
+ v cp -f $s $t
+ else
+ echo -e "${STY_BLUE}[$0]: It seems not a firstrun.${STY_RST}"
+ v cp -f $s $t.new
+ fi
+ else
+ echo -e "${STY_GREEN}[$0]: \"$t\" does not exist yet.${STY_RST}"
+ v cp $s $t
+ fi
+}
+function copy_dir_s_t(){
+ local s=$1
+ local t=$2
+ if [ -d $t ];then
+ echo -e "${STY_BLUE}[$0]: \"$t\" already exists, will not do anything.${STY_RST}"
+ else
+ echo -e "${STY_YELLOW}[$0]: \"$t\" does not exist yet.${STY_RST}"
+ v rsync -av --delete $s/ $t/
+ fi
+}
+
+#####################################################################################
# In case some dirs does not exists
v mkdir -p $XDG_BIN_HOME $XDG_CACHE_HOME $XDG_CONFIG_HOME $XDG_DATA_HOME/icons
+case "${INSTALL_FIRSTRUN}" in
+ # When specify --firstrun
+ true) sleep 0 ;;
+ # When not specify --firstrun
+ *)
+ if test -f "${FIRSTRUN_FILE}"; then
+ INSTALL_FIRSTRUN=false
+ else
+ INSTALL_FIRSTRUN=true
+ fi
+ ;;
+esac
+
# `--delete' for rsync to make sure that
# original dotfiles and new ones in the SAME DIRECTORY
# (eg. in ~/.config/hypr) won't be mixed together
# MISC (For dots/.config/* but not quickshell, not fish, not Hyprland, not fontconfig)
-case $SKIP_MISCCONF in
+case "${SKIP_MISCCONF}" in
true) sleep 0;;
*)
for i in $(find dots/.config/ -mindepth 1 -maxdepth 1 ! -name 'quickshell' ! -name 'fish' ! -name 'hypr' ! -name 'fontconfig' -exec basename {} \;); do
@@ -25,7 +68,7 @@ case $SKIP_MISCCONF in
;;
esac
-case $SKIP_QUICKSHELL in
+case "${SKIP_QUICKSHELL}" in
true) sleep 0;;
*)
# Should overwriting the whole directory not only ~/.config/quickshell/ii/ cuz https://github.com/end-4/dots-hyprland/issues/2294#issuecomment-3448671064
@@ -33,14 +76,14 @@ case $SKIP_QUICKSHELL in
;;
esac
-case $SKIP_FISH in
+case "${SKIP_FISH}" in
true) sleep 0;;
*)
warning_rsync_delete; v rsync -av --delete dots/.config/fish/ "$XDG_CONFIG_HOME"/fish/
;;
esac
-case $SKIP_FONTCONFIG in
+case "${SKIP_FONTCONFIG}" in
true) sleep 0;;
*)
case "$FONTSET_DIR_NAME" in
@@ -50,69 +93,26 @@ case $SKIP_FONTCONFIG in
esac
# For Hyprland
-declare -a arg_excludes=()
-arg_excludes+=(--exclude '/custom')
-arg_excludes+=(--exclude '/hyprlock.conf')
-arg_excludes+=(--exclude '/hypridle.conf')
-arg_excludes+=(--exclude '/hyprland.conf')
-case $SKIP_HYPRLAND in
+case "${SKIP_HYPRLAND}" in
true) sleep 0;;
*)
- warning_rsync_delete; v rsync -av --delete "${arg_excludes[@]}" dots/.config/hypr/ "$XDG_CONFIG_HOME"/hypr/
- if [ "$OS_DISTRO_ID" = "fedora" ];then
- v rsync -av "${REPO_ROOT}/dots-extra/fedora/hypr/hyprland/execs.conf" "$XDG_CONFIG_HOME/hypr/hyprland/execs.conf"
- fi
- # When hypr/custom does not exist, we assume that it's the firstrun.
- if [ -d "$XDG_CONFIG_HOME/hypr/custom" ];then ii_firstrun=false;else ii_firstrun=true;fi
- t="$XDG_CONFIG_HOME/hypr/hyprland.conf"
- if [ -f $t ];then
- echo -e "${STY_BLUE}[$0]: \"$t\" already exists.${STY_RST}"
- if $ii_firstrun;then
- echo -e "${STY_BLUE}[$0]: It seems to be the firstrun.${STY_RST}"
- v mv $t $t.old
- v cp -f dots/.config/hypr/hyprland.conf $t
- existed_hypr_conf_firstrun=y
+ if ! [ -d "$XDG_CONFIG_HOME"/hypr ]; then v mkdir -p "$XDG_CONFIG_HOME"/hypr ; fi
+ warning_rsync_delete; v rsync -av --delete dots/.config/hypr/hyprland/ "$XDG_CONFIG_HOME"/hypr/hyprland/
+ for i in hypr{land,lock}.conf {monitors,workspaces}.conf ; do
+ copy_file_s_t "dots/.config/hypr/$i" "${XDG_CONFIG_HOME}/hypr/$i"
+ done
+ for i in hypridle.conf ; do
+ if [[ "${INSTALL_VIA_NIX}" == true ]]; then
+ copy_file_s_t "dots-extra/via-nix/$i" "${XDG_CONFIG_HOME}/hypr/$i"
else
- echo -e "${STY_BLUE}[$0]: It seems not a firstrun.${STY_RST}"
- v cp -f dots/.config/hypr/hyprland.conf $t.new
- existed_hypr_conf=y
+ copy_file_s_t "dots/.config/hypr/$i" "${XDG_CONFIG_HOME}/hypr/$i"
fi
- else
- echo -e "${STY_YELLOW}[$0]: \"$t\" does not exist yet.${STY_RST}"
- v cp dots/.config/hypr/hyprland.conf $t
- fi
- t="$XDG_CONFIG_HOME/hypr/hypridle.conf"
- if [[ "$INSTALL_VIA_NIX" = true ]]; then
- s=dots-extra/vianix/hypridle.conf
- else
- s=dots/.config/hypr/hypridle.conf
- fi
- if [ -f $t ];then
- echo -e "${STY_BLUE}[$0]: \"$t\" already exists.${STY_RST}"
- v cp -f $s $t.new
- existed_hypridle_conf=y
- else
- echo -e "${STY_YELLOW}[$0]: \"$t\" does not exist yet.${STY_RST}"
- v cp $s $t
- existed_hypridle_conf=n
- fi
- t="$XDG_CONFIG_HOME/hypr/hyprlock.conf"
- if [ -f $t ];then
- echo -e "${STY_BLUE}[$0]: \"$t\" already exists.${STY_RST}"
- v cp -f dots/.config/hypr/hyprlock.conf $t.new
- existed_hyprlock_conf=y
- else
- echo -e "${STY_YELLOW}[$0]: \"$t\" does not exist yet.${STY_RST}"
- v cp dots/.config/hypr/hyprlock.conf $t
- existed_hyprlock_conf=n
- fi
- t="$XDG_CONFIG_HOME/hypr/custom"
- if [ -d $t ];then
- echo -e "${STY_BLUE}[$0]: \"$t\" already exists, will not do anything.${STY_RST}"
- else
- echo -e "${STY_YELLOW}[$0]: \"$t\" does not exist yet.${STY_RST}"
- v rsync -av --delete dots/.config/hypr/custom/ $t/
+ done
+ if [ "$OS_GROUP_ID" = "fedora" ];then
+ v bash -c "printf \"# For fedora to setup polkit\nexec-once = /usr/libexec/kf6/polkit-kde-authentication-agent-1\n\" >> ${XDG_CONFIG_HOME}/hypr/hyprland/execs.conf"
fi
+
+ copy_dir_s_t "dots/.config/hypr/custom" "${XDG_CONFIG_HOME}/hypr/custom"
;;
esac
declare -a arg_excludes=()
@@ -121,3 +121,5 @@ declare -a arg_excludes=()
# since the files here come from different places, not only about one program.
# v rsync -av "dots/.local/bin/" "$XDG_BIN_HOME" # No longer needed since scripts are no longer in ~/.local/bin
v cp -f "dots/.local/share/icons/illogical-impulse.svg" "${XDG_DATA_HOME}"/icons/illogical-impulse.svg
+
+v touch "${FIRSTRUN_FILE}"
diff --git a/sdata/subcmd-install/3.files.sh b/sdata/subcmd-install/3.files.sh
index 209414038..07ade39f3 100644
--- a/sdata/subcmd-install/3.files.sh
+++ b/sdata/subcmd-install/3.files.sh
@@ -78,7 +78,6 @@ for i in "${warn_files_tests[@]}"; do
done
#####################################################################################
-# TODO: output the logs below to a temp file and cat that file, also show the path of the file so users will be able to read it again.
printf "\n"
printf "\n"
printf "\n"
diff --git a/sdata/subcmd-install/options.sh b/sdata/subcmd-install/options.sh
index c5e860215..992010cfb 100644
--- a/sdata/subcmd-install/options.sh
+++ b/sdata/subcmd-install/options.sh
@@ -8,6 +8,7 @@ Idempotent installation for dotfiles.
Options for install:
-h, --help Print this help message and exit
-f, --force (Dangerous) Force mode without any confirm
+ -F, --fisrtrun Act like it is the first run
-c, --clean Clean the build cache first
--skip-allgreeting Skip the whole process greeting
--skip-alldeps Skip the whole process installing dependency
@@ -43,8 +44,8 @@ cleancache(){
# `man getopt` to see more
para=$(getopt \
- -o hfk:cs \
- -l help,force,fontset:,clean,skip-allgreeting,skip-alldeps,skip-allsetups,skip-allfiles,skip-sysupdate,skip-plasmaintg,skip-backup,skip-quickshell,skip-fish,skip-hyprland,skip-fontconfig,skip-miscconf,core,exp-files,via-nix \
+ -o hfFk:cs \
+ -l help,force,firstrun,fontset:,clean,skip-allgreeting,skip-alldeps,skip-allsetups,skip-allfiles,skip-sysupdate,skip-plasmaintg,skip-backup,skip-quickshell,skip-fish,skip-hyprland,skip-fontconfig,skip-miscconf,core,exp-files,via-nix \
-n "$0" -- "$@")
[ $? != 0 ] && echo "$0: Error when getopt, please recheck parameters." && exit 1
#####################################################################################
@@ -55,7 +56,7 @@ while true ; do
case "$1" in
-h|--help) showhelp;exit;;
-c|--clean) cleancache;shift;;
- --) break ;;
+ --) shift;break ;;
*) shift ;;
esac
done
@@ -69,6 +70,7 @@ while true ; do
-c|--clean) shift;;
## Ones without parameter
-f|--force) ask=false;shift;;
+ -F|--firstrun) INSTALL_FIRSTRUN=true;shift;;
--skip-allgreeting) SKIP_ALLGREETING=true;shift;;
--skip-alldeps) SKIP_ALLDEPS=true;shift;;
--skip-allsetups) SKIP_ALLSETUPS=true;shift;;
@@ -93,7 +95,7 @@ while true ; do
fi;;
## Ending
- --) break ;;
+ --) shift;break ;;
*) echo -e "$0: Wrong parameters.";exit 1;;
esac
done
diff --git a/sdata/subcmd-resetfirstrun/0.run.sh b/sdata/subcmd-resetfirstrun/0.run.sh
new file mode 100644
index 000000000..b81f642f4
--- /dev/null
+++ b/sdata/subcmd-resetfirstrun/0.run.sh
@@ -0,0 +1,6 @@
+# This script is meant to be sourced.
+# It's not for directly running.
+
+# shellcheck shell=bash
+
+try rm "${FIRSTRUN_FILE}"
diff --git a/sdata/subcmd-resetfirstrun/options.sh b/sdata/subcmd-resetfirstrun/options.sh
new file mode 100644
index 000000000..51b08f63a
--- /dev/null
+++ b/sdata/subcmd-resetfirstrun/options.sh
@@ -0,0 +1,27 @@
+# Handle args for subcmd: checkdeps
+# shellcheck shell=bash
+
+showhelp(){
+echo -e "Syntax: $0 resetfirstrun [OPTIONS]
+
+Reset firstrun state.
+
+Options:
+ -h, --help Show this help message and exit
+"
+}
+# `man getopt` to see more
+para=$(getopt \
+ -o c \
+ -l help \
+ -n "$0" -- "$@")
+[ $? != 0 ] && echo "$0: Error when getopt, please recheck parameters." && exit 1
+#####################################################################################
+eval set -- "$para"
+while true ; do
+ case "$1" in
+ -h|--help) showhelp;exit;;
+ --) shift;break ;;
+ *) echo -e "$0: Wrong parameters.";exit 1;;
+ esac
+done
diff --git a/sdata/subcmd-virtmon/0.run.sh b/sdata/subcmd-virtmon/0.run.sh
new file mode 100644
index 000000000..3b0426909
--- /dev/null
+++ b/sdata/subcmd-virtmon/0.run.sh
@@ -0,0 +1,90 @@
+# This script is meant to be sourced.
+# It's not for directly running.
+
+# shellcheck shell=bash
+
+ensure_cmds wayvnc lsof jq ip
+
+start_hypr_mon_guard(){
+ if ! pgrep -x hypr_mon_guard >/dev/null 2>&1; then
+ if PATH=$PATH:${REPO_ROOT}/sdata/subcmd-virtmon command -v hypr_mon_guard ; then
+ echo "Running hypr_mon_guard."
+ PATH=$PATH:${REPO_ROOT}/sdata/subcmd-virtmon setsid hypr_mon_guard > $(mktemp) 2>&1 &
+ else
+ echo "Script hypr_mon_guard not found."
+ exit 1
+ fi
+ fi
+}
+if ! [[ "${DISABLE_HYPR_MON_GUARD}" = true ]]; then
+ start_hypr_mon_guard
+fi
+
+readarray -t vmon_ids < <(hyprctl -j monitors all | jq -r '.[] | select(.name | test("^TESTER-")) | .name | sub("^TESTER-"; "")')
+
+if [[ "${CLEAN_TESTER_MONITORS}" = true ]]; then
+ echo "Cleaning tester monitors..."
+ for i in "${vmon_ids[@]}"; do
+ echo "Removing tester monitor: TESTER-$i..."
+ x hyprctl output remove "TESTER-$i"
+ done
+ echo "Cleaning tester wayvnc sessions..."
+ for i in /tmp/wayvncctl_tester_* ; do
+ # When no target is matched, * will not be expanded
+ [ -e "$i" ] || continue
+ x bash -c "wayvncctl --socket=$i -r wayvnc-exit || rm $i"
+ done
+ echo "Cleaning complete, exit..."
+ exit 0
+fi
+
+
+echo "Finding an unused port..."
+for port in {5900..5999}; do
+ if ! lsof -nP -iTCP:"$port" -sTCP:LISTEN -t >/dev/null 2>&1; then
+ vnc_port="$port"
+ break
+ fi
+done
+if [ -z "$vnc_port" ];then
+ echo "No available port for vnc server, aborting..."; exit 1
+fi
+# The name of tester_socket can be anything, the following just borrows $vnc_port as ID
+tester_socket=/tmp/wayvncctl_tester_$vnc_port
+# In case this exists for some reason
+try rm $tester_socket
+vmon_tester=TESTER-$vnc_port
+
+echo "Creating tester monitor..."
+x hyprctl output create headless ${vmon_tester}
+
+echo "Setting properties of tester monitor..."
+x hyprctl keyword monitor ${vmon_tester},${VMON_RESOLUTION}@${VMON_FPS},${VMON_POSITION},${VMON_SCALE}${VMON_EXTRA}
+
+e="%s${STY_RST}\n"
+printf "${STY_YELLOW}=========================================$e"
+printf "${STY_CYAN}The status of the virtual monitor:$e"
+printf "${STY_BLUE}Resolution: ${STY_UNDERLINE}${STY_INVERT}${VMON_RESOLUTION}$e"
+printf "${STY_BLUE}Frame rate: ${STY_UNDERLINE}${STY_INVERT}${VMON_FPS}$e"
+printf "${STY_CYAN}Use a VNC client to connect to the virtual monitor.$e"
+printf "${STY_BLUE}Port: ${STY_UNDERLINE}${STY_INVERT}$vnc_port$e"
+printf "${STY_BLUE}IP: use a suitable one from below:$e"
+printf ${STY_PURPLE}
+LANG=C LC_ALL=C ip -o addr show up | grep -v -E 'docker|veth|virbr' | awk '{split($4,a,"/"); print $2"\t"a[1]}'
+printf ${STY_RST}
+printf "${STY_CYAN}Hint:$e"
+printf "${STY_GREEN} The VNC client will ask you about server address,$e"
+printf "${STY_GREEN} either joined as : or separately.$e"
+printf "${STY_GREEN} As for username and password, just leave them as empty.$e"
+printf "${STY_YELLOW}=========================================$e"
+
+if [ "$RUNNING_IN_BACKGROUND" = true ];then
+ echo "wayvnc now running in background. Run again with --clean to cleanup."
+ nohup wayvnc ${WAYVNC_EX_ARGS} --socket=$tester_socket -f=${VMON_FPS} -o=${vmon_tester} --log-level=${WAYVNC_LOGLEVEL} 0.0.0.0 $vnc_port > $(mktemp) 2>&1 &
+ disown
+else
+ echo "wayvnc now running, press Ctrl-C to quit."
+ wayvnc ${WAYVNC_EX_ARGS} --socket=$tester_socket -f=${VMON_FPS} -o=${vmon_tester} --log-level=${WAYVNC_LOGLEVEL} 0.0.0.0 $vnc_port
+ echo "wayvnc stopped. Cleaning..."
+ hyprctl output remove "${vmon_tester}"
+fi
diff --git a/sdata/subcmd-virtmon/hypr_mon_guard b/sdata/subcmd-virtmon/hypr_mon_guard
new file mode 100755
index 000000000..9c913f928
--- /dev/null
+++ b/sdata/subcmd-virtmon/hypr_mon_guard
@@ -0,0 +1,13 @@
+#!/usr/bin/bash
+# This script is to prevent hyprland from not responding to any input when no monitor is enabled.
+# When this script is running in background,
+# it will be safe to temporarily disable monitors using hyprctl.
+# The shebang cannot be #!/usr/bin/env bash , idk why
+while true; do
+readarray -t enabled_mons < <(hyprctl -j monitors all | jq -r '.[] | select(.disabled == false) | .name')
+#if -z "$enabled_mons"; then
+if [ ${#enabled_mons[@]} -eq 0 ]; then
+hyprctl reload
+fi
+sleep 30
+done
diff --git a/sdata/subcmd-virtmon/options.sh b/sdata/subcmd-virtmon/options.sh
new file mode 100644
index 000000000..44ea51801
--- /dev/null
+++ b/sdata/subcmd-virtmon/options.sh
@@ -0,0 +1,77 @@
+# Handle args for subcmd: checkdeps
+# shellcheck shell=bash
+
+VMON_RESOLUTION=1920x1080
+VMON_FPS=60
+VMON_POSITION=auto
+VMON_SCALE=1
+VMON_EXTRA=""
+WAYVNC_LOGLEVEL=${WAYVNC_LOGLEVEL:-quiet}
+
+showhelp(){
+echo -e "Syntax: $0 virtmon [OPTIONS]
+
+Create virtual monitor for testing multi-monitors.
+
+Options:
+ -h, --help Show this help message and exit
+ -c, --clean Clean all tester monitors and wayvnc sessions and exit
+ -d, --daemon Run in background
+ --no-guard Disable hypr_mon_guard. Tip: this process can
+ also be terminated using ${STY_BOLD}pkill hypr_mon_guard${STY_RST}
+
+For the syntax of following options, see also Hyprland Wiki:
+ https://wiki.hypr.land/Configuring/Monitors
+ --res Resolution, by default ${STY_UNDERLINE}$VMON_RESOLUTION${STY_RST}
+ --fps Refresh rate and FPS, by default ${STY_UNDERLINE}$VMON_FPS${STY_RST}
+ --pos Position, by default ${STY_UNDERLINE}$VMON_POSITION${STY_RST}
+ Examples: ${STY_UNDERLINE}auto-left${STY_RST}, ${STY_UNDERLINE}0x-1080${STY_RST}
+ --sca Scale, by default ${STY_UNDERLINE}$VMON_SCALE${STY_RST}
+ --ext Extra properties, e.g. ${STY_UNDERLINE}transform, 1${STY_RST}
+
+Note 1:
+ The virtual monitor will be served via wayvnc.
+ You need a VNC client to connect to it.
+ Recommended VNC client:
+ - Android: AVNC (https://github.com/gujjwal00/avnc)
+ - Linux X11, Windows and MacOS: TigerVNC (https://github.com/TigerVNC/tigervnc)
+ - Linux Wayland: Remmina-VNC (https://remmina.org/remmina-vnc)
+
+Note 2:
+ You can run this subcommand multiple times to create multiple virtual monitor. To do this, use ${STY_UNDERLINE}-d${STY_RST} to run wayvnc in background and repeat again, or just open extra terminal/shell and run the subcommand again.
+
+Note 3:
+ If you do not have a spare device connected to the same network, it's still possible to test multi-monitor by using VNC client on this device, in which case the should be ${STY_UNDERLINE}localhost${STY_RST} or ${STY_UNDERLINE}127.0.0.1${STY_RST}.
+"
+}
+# `man getopt` to see more
+para=$(getopt \
+ -o hcd \
+ -l help,clean,daemon,no-guard,res:,fps:,pos:,sca:,ext: \
+ -n "$0" -- "$@")
+[ $? != 0 ] && echo "$0: Error when getopt, please recheck parameters." && exit 1
+#####################################################################################
+eval set -- "$para"
+while true ; do
+ case "$1" in
+ -h|--help) showhelp;exit;;
+ --) shift;break ;;
+ *) shift ;;
+ esac
+done
+
+eval set -- "$para"
+while true ; do
+ case "$1" in
+ -c|--clean) CLEAN_TESTER_MONITORS=true;shift;;
+ -d|--daemon) RUNNING_IN_BACKGROUND=true;shift;;
+ --no-guard) DISABLE_HYPR_MON_GUARD=true;shift;;
+ --res) VMON_RESOLUTION="$2";shift 2;;
+ --fps) VMON_FPS="$2";shift 2;;
+ --pos) VMON_POSITION="$2";shift 2;;
+ --sca) VMON_SCALE="$2";shift 2;;
+ --ext) VMON_EXTRA=", $2";shift 2;;
+ --) shift;break ;;
+ *) echo -e "$0: Wrong parameters.";exit 1;;
+ esac
+done
diff --git a/sdata/uv/README.md b/sdata/uv/README.md
index 700f25772..8172c7c9b 100644
--- a/sdata/uv/README.md
+++ b/sdata/uv/README.md
@@ -13,7 +13,7 @@ This is important because there has been so many complaints about the failure in
- For reference see [uv doc](https://docs.astral.sh/uv/pip/dependencies/#using-requirementsin).
- `requirements.txt` is included in Git. It's for locking package versions to enhance stability and reproducibility.[^1]
-[^1]: In fact, including package version lock file in Git is also the most common way for similar situations, for example the `package-lock.json` of Node.js projects (see also [this stackoverflow question](https://stackoverflow.com/questions/48524417/should-the-package-lock-json-file-be-added-to-gitignore)). Although there are some situations when it's not suitable to include the lock file, for example [the poetry document](https://python-poetry.org/docs/basic-usage/#committing-your-poetrylock-file-to-version-control) recommend application developers to include package version lock file in Git, but library developers should consider more, such as not inluding the lock file or including it but refreshing regularly.
+[^1]: In fact, including package version lock file in Git is also the most common way for similar situations, for example the `package-lock.json` of Node.js projects (see also [this stackoverflow question](https://stackoverflow.com/questions/48524417/should-the-package-lock-json-file-be-added-to-gitignore)). Although there are some situations when it's not suitable to include the lock file, for example [the poetry document](https://python-poetry.org/docs/basic-usage/#committing-your-poetrylock-file-to-version-control) recommend application developers to include package version lock file in Git, but library developers should consider more, such as not including the lock file or including it but refreshing regularly.
## How will the python packages get installed?
diff --git a/setup b/setup
index 9309491e2..cc5fca8ab 100755
--- a/setup
+++ b/setup
@@ -5,6 +5,7 @@ REPO_ROOT="$(pwd)"
source ./sdata/lib/environment-variables.sh
source ./sdata/lib/functions.sh
source ./sdata/lib/package-installers.sh
+source ./sdata/lib/dist-determine.sh
prevent_sudo_or_root
set -e
@@ -23,15 +24,17 @@ Syntax:
Subcommands:
install (Re)Install/Update illogical-impulse.
- Note: To update to the latest, manually run \"git pull\" first.
+ Note: To update to the latest, manually run \"git stash && git pull\" first.
install-deps Run the install step \"1. Install dependencies\"
install-setups Run the install step \"2. Setup for permissions/services etc\"
install-files Run the install step \"3. Copying config files\"
+ resetfirstrun Reset firstrun state.
exp-uninstall (Experimental) Uninstall illogical-impulse.
exp-update (Experimental) Update illogical-impulse without fully reinstall.
exp-update-old (Experimental) exp-update but use behaves like old version.
+ virtmon (For dev only) Create virtual monitors for testing multi-monitors.
checkdeps (For dev only) Check whether pkgs exist in AUR or repos of Arch.
help Show this help message.
@@ -45,7 +48,7 @@ case $1 in
# Global help
""|help|--help|-h)showhelp_global;exit;;
# Correct subcommand
- install|exp-uninstall|exp-update|exp-update-old|checkdeps)
+ install|exp-uninstall|exp-update|exp-update-old|resetfirstrun|checkdeps|virtmon)
SUBCMD_NAME=$1
SUBCMD_DIR=./sdata/subcmd-$1
shift;;
@@ -63,30 +66,46 @@ if [[ -f "${SUBCMD_DIR}/options.sh" ]];
fi
case ${SUBCMD_NAME} in
install)
+ for function in ${print_os_group_id_functions[@]}; do
+ $function
+ done
+ pause
if [[ "${SKIP_ALLGREETING}" != true ]]; then
source ${SUBCMD_DIR}/0.greeting.sh
fi
if [[ "${SKIP_ALLDEPS}" != true ]]; then
- source ${SUBCMD_DIR}/1.deps-selector.sh
+ source ${SUBCMD_DIR}/1.deps-router.sh
fi
if [[ "${SKIP_ALLSETUPS}" != true ]]; then
- source ${SUBCMD_DIR}/2.setups-selector.sh
+ source ${SUBCMD_DIR}/2.setups.sh
fi
if [[ "${SKIP_ALLFILES}" != true ]]; then
source ${SUBCMD_DIR}/3.files.sh
fi
;;
install-deps)
+ for function in ${print_os_group_id_functions[@]}; do
+ $function
+ done
+ pause
if [[ "${SKIP_ALLDEPS}" != true ]]; then
- source ${SUBCMD_DIR}/1.deps-selector.sh
+ source ${SUBCMD_DIR}/1.deps-router.sh
fi
;;
install-setups)
+ for function in ${print_os_group_id_functions[@]}; do
+ $function
+ done
+ pause
if [[ "${SKIP_ALLSETUPS}" != true ]]; then
- source ${SUBCMD_DIR}/2.setups-selector.sh
+ source ${SUBCMD_DIR}/2.setups.sh
fi
;;
install-files)
+ for function in ${print_os_group_id_functions[@]}; do
+ $function
+ done
+ pause
if [[ "${SKIP_ALLFILES}" != true ]]; then
source ${SUBCMD_DIR}/3.files.sh
fi