You are not logged in.
https://aur.archlinux.org/packages/qiq-git
interesting concept, it feels like it could directly replace my Rofi workflow, however I am experiencing two issues.
Env:
- Compositor: Hyprland
- Shell: zsh
1) UI behaviour on Hyprland
Qt frameless window behaviour seems inconsistent under Hyprland, I was able to partially stabilize it using compositor window rules:
windowrule {
name = rof!-successor
match:class = ^(qiq)$
float = on
pin = on
stay_focused = on
rounding = 0
no_blur = on
no_shadow = on
border_size = 0
force_rgbx = on
center = on
no_anim = on
}and this mostly works and makes qiq behave like a HUD-style launcher, but occasionally focus or UI behaviour still feels inconsistent...
2) Command indexing behaviour
when opening qiq and immediately typing, ls
it launches `lshw` instead of executing the shell command.
Example behaviour:
- Start qiq
- Type `ls` and enter
- `lshw` gets launched
However:
- If I run another command first (e.g. `lsblk`)
- Without closing/clicking escape on opened qiq window & type `ls`, then `ls` executes as expected.
it seems that initially qiq interprets `ls` as a desktop application entry (likely because `lshw.desktop` exists) and selects the first matching application instead of executing the shell command...
possibly related to how the application/command filter switching works.
Overall the idea and design philosophy are excellent, it feels like a promising Rofi alternative once these behaviours are ironed out... ![]()
Last edited by 5hridhyan (2026-03-08 16:05:49)
---
Offline
The default behavior is Qt::BypassWindowManagerHint
Does it help anything to either
1. export QT_WAYLAND_USE_BYPASSWINDOWMANAGERHINT=1
or
2. add
WMHacks=frameless
or
WMHacks=frameless,popup
to the config?
possibly related to how the application/command filter switching works.
Yes.
Starting to type initially switches to the application launcher and stays there until there's no match (then the input is tested as command or calculation)
With very short commands you'll run into some inevitable conflict ("ls -l" will do what you want, even if you'd still match some application as the heuristic decides that two tokens and the first being a real command means you want to run that)
Pressing tab to autocomplete the command would implicitly move to the command execution - I've currently no better idea how to handle this.
Online
Thank you for the suggestions.
I’ve tried both the environment variable and adding WMHacks to the config, the behavior persists: if I type an invalid command and hit escape, the window occasionally offsets itself toward the left corner, and sometimes to the top..., interestingly, switching workspaces seems to force a surface re-render/re-position that resets it to the center, it feels like a geometry calculation mismatch between Qt and Hyprland's XDG-shell implementation...
Edit:
Regarding indexing, pressing Tab after ls still cycles through the application filter (selecting lshw, etc.) rather than forcing a switch to command execution, so for now, I'll stick to the "two-token" heuristic (e.g., ls -l) which works perfectly.
Last edited by 5hridhyan (2026-03-07 18:58:21)
---
Offline
Regarding indexing, pressing Tab after ls still cycles through the application filter (selecting lshw, etc.)
Try the latest revision, the code needlessly entered external completion - which you likely don't have setup/working and thus is failing.
You want to look into setting up zsh completion, though (if you're using/have installed zsh - theoretically this could also work w/ bash's autocompletion system but I'd have to investigate how to leverage that)
Setting the window frameless on labwc removes the frame (unlike bypass and the environment variable makes the window not show up at all) but it's unable to control it's position afterwards (it can control the size) - any pattern to when it starts moving around?
Online
I ran an strace -f on the latest revision. The app isn't crashing; it's getting stuck in an exhaustive access() loop searching for icons, like it seems to be hitting every possible subdirectory in /usr/share/icons/hicolor and ~/.nix-profile/ for various plugins (like com.zamaudio.zamtube).
┌──(shridhyan@Aranya-Marjara)-[~]
└─$ strace -f -o qiq.trace qiq
^C
┌──(shridhyan@Aranya-Marjara)-[~]
└─$ tail -n 40 qiq.trace
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/emotes/com.zamaudio.zamtube.png", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/emotes/com.zamaudio.zamtube.svg", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/filesystems/com.zamaudio.zamtube.png", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/filesystems/com.zamaudio.zamtube.svg", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/intl/com.zamaudio.zamtube.png", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/intl/com.zamaudio.zamtube.svg", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/mimetypes/com.zamaudio.zamtube.png", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/mimetypes/com.zamaudio.zamtube.svg", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/places/com.zamaudio.zamtube.png", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/places/com.zamaudio.zamtube.svg", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/status/com.zamaudio.zamtube.png", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/status/com.zamaudio.zamtube.svg", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/stock/chart/com.zamaudio.zamtube.png", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/stock/chart/com.zamaudio.zamtube.svg", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/stock/code/com.zamaudio.zamtube.png", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/stock/code/com.zamaudio.zamtube.svg", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/stock/data/com.zamaudio.zamtube.png", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/stock/data/com.zamaudio.zamtube.svg", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/stock/form/com.zamaudio.zamtube.png", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/stock/form/com.zamaudio.zamtube.svg", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/stock/image/com.zamaudio.zamtube.png", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/stock/image/com.zamaudio.zamtube.svg", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/stock/io/com.zamaudio.zamtube.png", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/stock/io/com.zamaudio.zamtube.svg", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/stock/media/com.zamaudio.zamtube.png", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/stock/media/com.zamaudio.zamtube.svg", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/stock/navigation/com.zamaudio.zamtube.png", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/stock/navigation/com.zamaudio.zamtube.svg", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/stock/net/com.zamaudio.zamtube.png", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/stock/net/com.zamaudio.zamtube.svg", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/stock/object/com.zamaudio.zamtube.png", F_OK) = -1 ENOENT (No such file or directory)
135389 access("/home/shridhyan/.nix-profile/share/icons/hicolor/256x256@2/stock/object/com.zamaudio.zamtube.svg", F_OK) = -1 ENOENT (No such file or directory)
135389 --- SIGINT {si_signo=SIGINT, si_code=SI_KERNEL} ---
135392 <... poll resumed> <unfinished ...>) = ?
135391 <... futex resumed>) = ?
135390 <... ppoll resumed> <unfinished ...>) = ?
135392 +++ killed by SIGINT +++
135391 +++ killed by SIGINT +++
135390 +++ killed by SIGINT +++
135389 +++ killed by SIGINT +++I think, like the new indexing logic is causing the icon/desktop file scan to block the main thread, on my system (with many audio plugins and Nix paths), this scan is so heavy that the UI never maps...
Last edited by 5hridhyan (2026-03-08 05:43:52)
---
Offline
I've confirmed the hang persists even in a clean shell environment (zsh -f), the strace shows the app is still caught in a massive access() loop for icon paths (hitting ~/.local/share/icons/, ~/.nix-profile/, etc.) before the window maps. I think the new revision made the desktop file/icon indexing synchronous or way more aggressive, and with a large number of plugins installed, it never finishes the scan...
┌──(shridhyan@Aranya-Marjara)-[~]
└─$ zsh -f
Aranya-Marjara% strace -f -o qiq.trace qiq
^C
Aranya-Marjara% tail -n 40 qiq.trace
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/places/com.zamaudio.zamheadx2.png", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/places/com.zamaudio.zamheadx2.svg", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/status/com.zamaudio.zamheadx2.png", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/status/com.zamaudio.zamheadx2.svg", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/chart/com.zamaudio.zamheadx2.png", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/chart/com.zamaudio.zamheadx2.svg", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/code/com.zamaudio.zamheadx2.png", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/code/com.zamaudio.zamheadx2.svg", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/data/com.zamaudio.zamheadx2.png", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/data/com.zamaudio.zamheadx2.svg", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/form/com.zamaudio.zamheadx2.png", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/form/com.zamaudio.zamheadx2.svg", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/image/com.zamaudio.zamheadx2.png", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/image/com.zamaudio.zamheadx2.svg", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/io/com.zamaudio.zamheadx2.png", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/io/com.zamaudio.zamheadx2.svg", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/media/com.zamaudio.zamheadx2.png", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/media/com.zamaudio.zamheadx2.svg", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/navigation/com.zamaudio.zamheadx2.png", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/navigation/com.zamaudio.zamheadx2.svg", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/net/com.zamaudio.zamheadx2.png", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/net/com.zamaudio.zamheadx2.svg", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/object/com.zamaudio.zamheadx2.png", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/object/com.zamaudio.zamheadx2.svg", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/table/com.zamaudio.zamheadx2.png", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/table/com.zamaudio.zamheadx2.svg", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/text/com.zamaudio.zamheadx2.png", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/24x24@2/stock/text/com.zamaudio.zamheadx2.svg", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/256x256/actions/com.zamaudio.zamheadx2.png", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/256x256/actions/com.zamaudio.zamheadx2.svg", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/256x256/animations/com.zamaudio.zamheadx2.png", F_OK) = -1 ENOENT (No such file or directory)
137526 access("/home/shridhyan/.local/share/icons/hicolor/256x256/animations/com.zamaudio.zamheadx2.svg", F_OK) = -1 ENOENT (No such file or directory)
137526 --- SIGINT {si_signo=SIGINT, si_code=SI_KERNEL} ---
137529 <... poll resumed> <unfinished ...>) = ?
137528 <... futex resumed>) = ?
137527 <... ppoll resumed> <unfinished ...>) = ?
137529 +++ killed by SIGINT +++
137528 +++ killed by SIGINT +++
137527 +++ killed by SIGINT +++
137526 +++ killed by SIGINT +++
Aranya-Marjara% ---
Offline
There's no "new indexing logic", the UI would move on to a stringlistmodel on top of a pre-built stringlist (executable files) when you press tab on a single word - nothing else changed.
Qt will generally go through A LOT of icons when using theme icons¹ but (because of the deterministic icon list in your straces suggesting that this actually finished and) unless the process also runs one core at 100% this is way more likely related to the attempts to position a frameless window (something that's effectively not possible on wayland but by using proprietary side-channels for the specific compositor…)
As mentioned
unlike bypass and the environment variable makes the window not show up at all
so rather make sure that environment isn't set anywhere.
I would probably have to look into bypassing that and write some hyprland/wlr specific code to make this happen.
https://gitlab.freedesktop.org/wayland/ … quests/264 was pushed a month ago (don't get fooled by the PR being 2½ years old, it's the second attempt, the entire discussion has been going for > 8 years…
)
No idea whether this results in something universally adapted and useful.
¹ what will happen for the application list and (delayed) when using the filesystem completion (for file icons)
It's annoyingly inefficient but because of the filesystem cache also not *that* bad (as you can see, most accesses are just ENOENT and result in nothing)
Online
Oops! My Bad...
┌──(shridhyan@Aranya-Marjara)-[~]
└─$ printenv | grep QT_WAYLAND
QT_WAYLAND_DISABLE_WINDOWDECORATION=1
QT_WAYLAND_USE_BYPASSWINDOWMANAGERHINT=1
┌──(shridhyan@Aranya-Marjara)-[~]
└─$ unset QT_WAYLAND_USE_BYPASSWINDOWMANAGERHINT
qiqYes now the Window pops up, and the ls upon pressing tab correctly switches to commands!, nice:)
I remembered I was set it globally in zsh, so I went and removed it, however, it now just runs and does ntg...
the process is there but does not show up...
┌──(shridhyan@Aranya-Marjara)-[~]
└─$ qiq
┌──(shridhyan@Aranya-Marjara)-[~]
└─$ pgrep qiq
190425
┌──(shridhyan@Aranya-Marjara)-[~]
└─$ hyprctl clients
Window 55b4ab955760 -> ~:
mapped: 1
hidden: 0
at: 240,149
size: 887,499
workspace: -98 (special:scratchpad)
floating: 1
monitor: 0
class: kitty
title: ~
initialClass: kitty
initialTitle: kitty
pid: 2177
xwayland: 0
pinned: 0
fullscreen: 0
fullscreenClient: 0
overFullscreen: 1
grouped: 0
tags:
swallowing: 0
focusHistoryID: 2
inhibitingIdle: 0
xdgTag:
xdgDescription:
contentType: none
stableID: 18000002
Window 55b4ab9e9740 -> hyprctl clients:
mapped: 1
hidden: 0
at: 9,50
size: 1348,709
workspace: 4 (4)
floating: 0
monitor: 0
class: kitty
title: hyprctl clients
initialClass: kitty
initialTitle: kitty
pid: 190442
xwayland: 0
pinned: 0
fullscreen: 0
fullscreenClient: 0
overFullscreen: 1
grouped: 0
tags:
swallowing: 0
focusHistoryID: 0
inhibitingIdle: 0
xdgTag:
xdgDescription:
contentType: none
stableID: 1800000b
Window 55b4ab9e6bc0 -> frameless/QT behavior+indexing issue (qiq-git) / AUR Issues, Discussion & PKGBUILD Requests / Arch Linux Forums — Zen Browser:
mapped: 1
hidden: 0
at: 9,50
size: 1348,709
workspace: 1 (1)
floating: 0
monitor: 0
class: zen
title: frameless/QT behavior+indexing issue (qiq-git) / AUR Issues, Discussion & PKGBUILD Requests / Arch Linux Forums — Zen Browser
initialClass: zen
initialTitle: Zen Browser
pid: 2538
xwayland: 0
pinned: 0
fullscreen: 0
fullscreenClient: 0
overFullscreen: 1
grouped: 0
tags:
swallowing: 0
focusHistoryID: 1
inhibitingIdle: 0
xdgTag:
xdgDescription:
contentType: none
stableID: 18000007Last edited by 5hridhyan (2026-03-08 08:17:49)
---
Offline
I think I got a workaround:
alias qiq='QT_QPA_PLATFORM=xcb qiq'yes it changes positions, also relocates upon switching workspaces, but it is not *strongly visible/noticeable... which is kinda good, and the pressing tab after ls changes to command but pressing tab another time it cycles with command.If it switched back to the application filter, it would be a seamless workflow. ![]()
Last edited by 5hridhyan (2026-03-08 09:35:50)
---
Offline
I think I got a workaround:
Using X11 is usually a good solution to problems with wayland ![]()
It's of course not exactly what you'd ideally want.
If it switched back to the application filter, it would be a seamless workflow
Escape will bring you back to the status page (you'd have to re-type ls if you so desire)
Online
Got it.
Hence Marking the thread as solved.
Thanks once again ^^
---
Offline