-------------------------------------------------
[11/10/2024] - ~7mins - #sway #wayland #ux
-------------------------------------------------
Ouai je vous en remet une couche sur Fuzzel [1].
Ce logiciel est vraiment bien mais en plus on peut en détourner l'usage pour faire autre chose qu'un simple launcher.
Et du coup je vous propose deux utilisation un peu plus originales.
Ça permet d'y foutre plein d'infos et également d'y mettre des actions lançables en cliquant sur différentes zones.
C'est basique mais c'est suffisant, léger et rapide.
C'est fait par le même dev et je vous en ai déjà parlé ici [2].
Et autant j'adore la possibilité d'utiliser mon ordi intégralement au clavier, autant parfois c'est vrai que cliquer sur un bouton pour lancer un truc un peu complexe, c'est plus pratique.
C'est d'autant plus vrai pour les fonctions les moins utilisées qui sont du coup moins facilement accessibles de mémoire.
Du coup j'ai eu envie de me faire un ptit menu comme on trouve sur tous les OS mainstreams.
Et vous savez quel logiciel est très cool pour faire des menus ?
FUZZEL !
Et hop !
{{}}
C'est ty pas mimi ?
Avec les emojis et la ptite barre de recherche en prime !
La classe.
En gros **yambar** affiche une icone qui ouvre un script lorsqu'on clique dessus.
Le script est tout simple (je vous le mets plus bas) avec fuzzel qui vient se coller en haut à droite de l'écran pour donner l'impression d'apparaitre sous l'icone.
Un peu de couleurs et hop.
On peut y foutre autant d'options qu'on veut et utiliser la souris pour choisir ou bien le clavier.
Vraiment pas mal.
Et on peut configurer pour qu'en cas de perte de focus, ça se ferme (par défaut).
<summary>/usr/local/bin/fuzzel-menu
{{}}
SINK=$(pw-dump | jq -r '.[] | select(.info.props["media.class"] == "Audio/Sink") | (.id | tostring) + ":" + .info.props["node.description"]' | grep Family)
IFS=: read -r SINK_ID SINK_DESCRIPTION <<< "$SINK"
choice1=$(printf "🌅 Luminosité ++
🌇 Luminosité --
🔈 Enceintes
🎧 Casque
📷 Screenshot
📸 Region Screenshot
📼 Twitch "\
| fuzzel --dmenu --config=/dev/null --index --anchor=top-right --horizontal-pad=10 --lines 7 --width 25 --background=282136fa --text-color=cdcdcdfa --selection-text-color=222222ff --border-color=bbbbbbff)
case "$choice1" in
"0")
# Monter la luminosité de l'écran
ddcutil setvcp 10 + 10 --display 2 --sleep-multiplier 0.2
return
;;
"1")
# Baisser la luminosité de l'écran
ddcutil setvcp 10 - 10 --display 2 --sleep-multiplier 0.2
return
;;
"2")
# Changer la route du sink par défaut pour les enceintes
wpctl set-route $SINK_ID 3
return
;;
"3")
# Changer la route du sink par défaut pour le casque
wpctl set-route $SINK_ID 4
return
;;
"4")
# Prendre un screenshot de tout l'écran
sleep 0.3
grim /tmp/screenshot-$(date +%Y-%m-%d-%H:%M:%S).png
return
;;
"5")
# Prendre un screenshot d'une région de l'écran
slurp | grim -g - /tmp/screenshot-$(date +%Y-%m-%d-%H:%M:%S).png
return
;;
"6")
# Démarrer le menu twitch
fuzzel-twitch
return
;;
esac
{{}}
Bon pour la partie audio j'avais des bouts en plus pour choper le numéro de route mais je me suis rendu compte que c'était fixe, donc pas besoin de complexifier plus que ça.
Le truc cool, c'est que vu que ce n'est qu'un simple script il est très facile à modifier.
Suffit de sauvegarder et de recliquer l'icone et hop ça s'ouvre.
Fuzzel supporte les icones mais je n'arrive pas à faire bien ce que je veux.
Les emojis c'est plus simple ^__^
Voilà c'est tout !
Là j'ai piqué l'idée chez Sxmo [3].
C'est une interface utilisateur pour linux mais à destination des téléphones portables.
Le but est de fournir un menu contextuel pour tout un tas d'appli et qui soit donc utilisable facilement avec les touches physiques du téléphone sans nécessiter de "colaboration" de la part des logiciels.
Ça permet d'accéder à des fonctionnalités via un unique moyen d'accès.
Et c'est vrai que ça semble contre-intuitif d'utiliser des logiciels principalement en console et optimisés pour le clavier avec un téléphone portable mais au final leurs ajustements rendent cette interface très plaisante.
Et du coup je leur ai piqué l'idée et une grande partie de l'implémentation pour refaire pareil mais sur mon gros dinateur.
Après tout, j'ai beau quasiment tout faire dans un terminal, c'est vrai que ça nécessite de connaitre et de se souvenir de nombreux raccourcis claviers.
Pour les logiciels du quotidien ça passe mais pour ceux qui servent moins souvent c'est plus compliqué.
Et du coup quel logiciel utiliser pour faire un menu ?
Et oui, c'est encore **Fuzzel** !
{{}}
Du coup dans **sway** je me fous un keybind pour déclencher mon script.
Le script détermine quelle est la fenêtre active puis en fonction de ça balance un fuzzel avec les choix prédeterminés.
Et en fonction de la sélection de l'utilisateur balance des touches depuis un clavier virtuel.
{{}}
Maintenant il n'y a plus qu'à remplir ces menus !
C'est très pratique et ça peut même être utilisé comme un ptit aide-mémoire.
<summary>/usr/local/bin/fuzzel-context-menu
{{}}
FUZZEL_OPTS="--config=/dev/null --index --dmenu --background=282136fa --text-color=cdcdcdfa --selection-text-color=222222ff --border-color=bbbbbbff"
sway_focused_app() {
swaymsg -t get_tree | jq -r '
recurse(.nodes[]) |
select(.focused == true) |
{
app_id: (if .app_id != null then
.app_id
else
.window_properties.class
end),
name: .name,
} |
select(.app_id != null and .name != null) |
.app_id
'
}
sway_focused_title() {
swaymsg -t get_tree | jq -r '
recurse(.nodes[]) |
select(.focused == true) |
{
app_id: (if .app_id != null then
.app_id
else
.window_properties.class
end),
name: .name,
} |
select(.app_id != null and .name != null) |
.name
'
}
APP=$(sway_focused_app)
TITLE=$(sway_focused_title)
if [ "$APP" = "foot" ]; then
case "$TITLE" in
hx*)
PLACEHOLDER="📙 Helix"
TO_FUZZEL="
Sélectionner paragraphe (mip) @ -k Escape mip
Choisir sélecteur (s\|) @ s\\\| -k Return
Aligner (&) @ \&
Supprimer les curseurs (,) @ ,
"
;;
rtorrent*)
PLACEHOLDER="🏴☠️rTorrent"
TO_FUZZEL="
➕ Ajouter un torrent @ -k backspace
🚀 Démarrer un torrent @ -M Ctrl s
✋ Stopper un torrent @ -M Ctrl d
⛔ Quitter rTorrent @ -M Ctrl q
"
;;
top*)
PLACEHOLDER="🧑💻Top"
TO_FUZZEL="
🪟 Changer de fenêtre (g) @ g
🔎 Chercher (L) @ L
🚩 Signal (k) @ k
🆘 Aide (h) @ h
"
;;
# Weechat
"ssh zc")
PLACEHOLDER="💬 WeeChatX"
TO_FUZZEL="
🫦 Bare Mode\0icon\x1fweechat @ -M Alt l
🔎 Rechercher @ -M Ctrl r
🔀 Toggle filters @ -M Alt =
🎨 Gras @ -M Ctrl b
🎨 Color @ -M Ctrl v
🎨 Underline @ -M Ctrl _
🖌️ Redraw @ -M Ctrl l
🔑 Show Key @ -M alt k
"
;;
Yazi*)
PLACEHOLDER="📂 Yazi"
TO_FUZZEL="
Copy (y) @ y
✂️ Cut (x) @ x
Paste (p) @ p
Rename (r) @ r
🔍 Find (/) @ /
"
;;
*)
PLACEHOLDER="🦶 Foot"
TO_FUZZEL="
🔍 Zoom ++ @ -M Ctrl +
🔎 Zoom -- @ -M Ctrl -
🌐 URL Mode @ -M Ctrl -M Shift -k o
🕶️ Search @ -M Ctrl -M Shift -k r
"
;;
esac
fi
case "$APP" in
"mpv")
PLACEHOLDER="📼 MPV"
TO_FUZZEL="
⏯️ Pause @ -k Space
🔇 Mute @ m
ℹ️ Infos @ i
🚀 Toggle hwdec @ -M Ctrl h
"
;;
"org.qutebrowser.qutebrowser")
PLACEHOLDER="🌎 QuteBrowser"
TO_FUZZEL="
💲Toggle JS @ -k Escape tsh
🛠️Devtools @ -k Escape :devtools -k Return
🔪Delete @ -k Escape -M Shift F -m Shift -s 100 k
📼To MPV @ -k Escape -M Shift F -m Shift -s 100 m
📺To TV @ -k Escape -M Shift F -m Shift -s 100 t
"
;;
esac
if [ -z "$TO_FUZZEL" ]; then
echo "Pas trouvé l'appli, désolé" | fuzzel --dmenu
exit
fi
CHOICES="$(printf "%s" "$TO_FUZZEL" | sed '/^[[:space:]]*$/d' | awk '{$1=$1};1')"
LINE_NUMBER=$(printf "%s\n" "$CHOICES" | wc --lines)
MAX_LINE_NUMBER=$(( $LINE_NUMBER < 10 ? $LINE_NUMBER : 10 ))
PICKED_LINE="$(echo -e "$CHOICES" |cut -d'@' -f1 | fuzzel --dmenu --index --placeholder="$PLACEHOLDER" --lines="$MAX_LINE_NUMBER")"
if [ "$PICKED_LINE" == "" ]; then
exit
fi
ACTION="$(printf "%s" "$CHOICES" | cut -d'@' -f2 | awk NR==$PICKED_LINE+1 )"
wtype $ACTION
{{}}
Voilà voilà, si ça peut vous inspirer ou vous aider, n'hésitez pas !
[1] Fuzzel (https://codeberg.org/dnkl/fuzzel/)
------------------------------------
------------------------------------
[11/10/2024] - #sway #wayland #ux
------------------------------------