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.
Offline
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?
Offline
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)
Offline
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)
Offline
Got it.
Hence Marking the thread as solved.
Thanks once again ^^
Offline
I'm just gonna hi-jack this ![]()
1. qiq should meantime work on WLR environments as native client
2. unrelated: do you speak (read/write) Devanagari ?
Even mildly interested in qterminal?
You could do me a favor and look at https://github.com/lxqt/qterminal/issue … 5750862193 since the OP has gone somewhat silent.
It'll be required to compile https://archlinux.org/packages/extra/x8 … ermwidget/ w/ utf8proc enabled ("-DUSE_UTF8PROC=ON" should do, otherwise ccmake is your friend) and install and configure https://fonts.atipra.in/samaano.html as useful monospace font (because the variable width fonts won't work decently in any TE, regardless of the UTF8 range)
Then check whether Devanagari I/O works as expected (including extended chars, ie. diacritics) and report your findings (here or there)
Offline
qiq should meantime work on WLR environments as native client
Great.
unrelated: do you speak (read/write) Devanagari ?
Yeah, Hindi, Sanskrit...
Even mildly interested in qterminal?
No, not until now.
You could do me a favor
Sure.
You could do me a favor and look at https://github.com/lxqt/qterminal/issue … 5750862193 since the OP has gone somewhat silent.
It'll be required to compile https://archlinux.org/packages/extra/x8 … ermwidget/ w/ utf8proc enabled ("-DUSE_UTF8PROC=ON" should do, otherwise ccmake is your friend) and install and configure https://fonts.atipra.in/samaano.html as useful monospace font (because the variable width fonts won't work decently in any TE, regardless of the UTF8 range)
Got it.
Then check whether Devanagari I/O works as expected (including extended chars, ie. diacritics) and report your findings (here or there)
Okay.
Last edited by 5hridhyan (2026-09-27 18:28:15)
Offline

I mean, as for the current state without rebuilding any "stock" package, and with the suggested font, it looks like this.
For example, like basic test:
printf '%s\n' \
'क कि की कु कू के कै को कौ' \
'अं अँ अः' \
'क़ ख़ ग़ ज़ फ़' \
'ड़ ढ़' \
'क्ष ज्ञ त्र श्र स्त्र प्र क्र ग्र द्व' \
'क्त त्त द्ध न्द्र ष्ट्र श्रे' \
'कर्म प्रश्न स्वतन्त्र'on "कि" (line 1), instead of positioning the short-i matra (ि) to the left of क, the terminal renders the matra over a dotted-circle placeholder.
On the bottom line, "कर्म" renders literally as क + र् + म, with an explicit virama under र.
"प्रश्न" displays as प् + र + श् + न, and "स्वतन्त्र" renders as स् + व + त + न् + त् + र.
If I read/expect "कर्म प्रश्न स्वतन्त्र", the intended reading is roughly "karma prashna svatantra", but with the current rendering I end up reading the individual visible components instead, roughly as "k r ma pr sh na sva ta n t ra".
So it looks like the characters are being output, but the required Devanagari shaping/reordering and conjunct formation aren't happening correctly.
Will rebuild qtermwidget with utf8proc after Oct 9 and report the results on the GitHub issue.
Last edited by 5hridhyan (2026-09-27 18:51:02)
Offline
Thanks a lot already.
W/o utf8proc wcwidth is used and that reports wrong widths for the diacritic glyphs (the dotted circles) for sure.
That problem went away w/ utf8proc, I just can't say whether the result is properly combined Devanagari or just random lines on my screen ![]()
Pasting your text w/ utf8proc and Samaano results in
One of the things I don't understand are the unprocessed <09xx> UTF8 codepoints - any idea what that is?
(I suspect it to be locale related)
Offline
I get it. But I think we should start using a different font IMO. Some characters actually look cut off, although that's probably a font issue.
For example, take the word `कर्म`. `क` is "ka" and `म` is "ma"; the `र्` in the middle provides the "r" sound. But for a Devanagari reader, rendering it as visibly separate `क र् म` isn't the same as rendering the properly shaped `कर्म`.
So I think there are actually two separate issues here: character/spacing width, and proper Devanagari shaping. The shirorekha (head line), along with the way the characters and marks join and align, is part of what makes the resulting word visually readable as intended...
regarding the `<09xx>` codepoints: I can't say for sure yet whether that's locale-related. Since those are the Unicode range for Devanagari, it looks like the characters are being exposed as their codepoints somewhere in the rendering path rather than being rendered/shaped as glyphs. I'd need to test this more systematically before saying what's causing it.
...
Last edited by 5hridhyan (2026-09-28 09:38:44)
Offline
Ah, interesting: र् produces "र<094d>" when pasting the glyphs in zsh, where as in bash I just get र् but pasting "कर्म" always results in "कर् म"
So that's in part the input handling, not necessarily the output.
कर्म shows as कर्म in sqriptor, saving that as karma.txt and cat'ing karma.txt however results in "कर् म" again - so there's probably some remaining (this is w/ utf8proc) issue in how extended characters are handled.
But thanks to you I now have a test case for an error that is not just weird lines - I basically speak Indian ![]()
नमस्ते
I assume the other Indian slangs will fall into the same category and benefit from the same fixes.
But we can test all sorts of stuff if you want and prefer.
Offline
The central token (and only extended character) shows up as https://unicodeplus.com/U+0930 + https://unicodeplus.com/U+094D and ends up as कर् म" in xterm, urxvt and alacritty.
Does it work as expected in any TE you're using?
Offline
कर्म shows as कर्म in sqriptor, saving that as karma.txt and cat'ing karma.txt however results in "कर् म" again - so there's probably some remaining (this is w/ utf8proc) issue in how extended characters are handled.
![]()
your welcome, and नमस्ते ^^
I assume the other Indian slangs will fall into the same category and benefit from the same fixes.
I doubt that, and I would also question your assumption :evillaugh:
But we can test all sorts of stuff if you want and prefer.
I tested kannada/Dravidian-language scripts and it is very different from Devanagari, and it was "worse" than I anticipated and I would have a hard time to actually explain what Im seeing the way Im doing with Hindi/Sanskrit, since the Issue was about Devanagari, we will look into that and when its "fixed" (hopefully) we will then move to Kannada, Tamil, Malyalam, Telagu, even though I only know Kannada in that list ![]()
Does it work as expected in any TE you're using?
I think we should discuss this in a new thread, I mean I was in ZSH while this thread started, and in this installation in bash.
https://i.ibb.co/23tQQjsy/image.png
So, this on kitty, which I use as my TE.
and the specific sentence "कर्म प्रश्न स्वतन्त्र"
here कर्म comes correctly
प्रश्न (prashna): "प्र" (pra) comes correctly but श्न (shna) comes out like न (na) and श(sha) are overlapped/stacked incorrectly but kinda readable if fluent in reading, but that's not what a Devanagari reader expects over the "polished" श्न (shna)
स्वतन्त्र (svatantra): also same case स (sa) and व(va) gets overlapped and तन्त्र gets handled nice but not perfectly like त (ta) and a space, न (na) and त्र(tra) overlapped/incorrect cluster positioning...
Last edited by 5hridhyan (2026-09-28 16:40:26)
Offline
I think we should discuss this in a new thread
If you've a github account the upstream bug would be appropriate.
I just wanted to raise qiq's visibility a bit ![]()
his on kitty, which I use as my TE … here कर्म comes correctly
Well… not fair: https://kovidgoyal.net![]()
I would have suspected this to be a ligature related issue (see eg. https://github.com/kovidgoyal/kitty/issues/5001 ), but https://github.com/lxqt/qterminal/issues/1048 makes that unlikely ![]()
also same case स (sa) and व(va) gets overlapped and तन्त्र gets handled nice but not perfectly like त (ta) and a space, न (na) and त्र(tra) overlapped/incorrect cluster positioning...
With what font?
kitty will also not be able to handle variable width fonts w/o glitches, https://github.com/kovidgoyal/kitty/issues/3701
For more reference (haven't read through it but looks interesting): https://github.com/kovidgoyal/kitty/issues/8533
Edit: about zsh, https://unix.stackexchange.com/question … ne-on-bash
Last edited by seth (2026-09-28 18:54:29)
Offline
If you've a github account the upstream bug would be appropriate.
Yeah, I have a GH account... got it.
With what font?
Samaano
kitty will also not be able to handle variable width fonts w/o glitches, https://github.com/kovidgoyal/kitty/issues/3701
and I agree the font choice may be contributing, so I'll test with a more traditional monospace Devanagari font as well.
Last edited by 5hridhyan (2026-09-28 19:08:35)
Offline