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 @@ + + + + ic_fluent_battery_0_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_battery_1_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_battery_2_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_battery_3_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_battery_4_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_battery_5_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_battery_6_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_battery_7_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_battery_8_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_battery_9_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_battery_charge_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_battery_full_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_battery_saver_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_battery_warning_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_bluetooth_connected_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_bluetooth_searching_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_cellular_data_1_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_mic_on_48_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_speaker_0_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_speaker_1_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_wifi_1_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_wifi_2_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_wifi_3_24_regular + Created with Sketch. + + + + + + + \ 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 @@ + + + + ic_fluent_wifi_4_24_regular + Created with Sketch. + + + + + + + \ 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/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