# Me and mabox-noctalia labwc

**URL:** <https://forum.maboxlinux.org/t/me-and-mabox-noctalia-labwc/2612>\
**Category:** Introductions\
**Created:** [October 13, 2026, 1:55pm UTC](https://forum.maboxlinux.org/t/me-and-mabox-noctalia-labwc/2612 "2026-10-13T13:55:42Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![muzqs](https://forum.maboxlinux.org/user_avatar/forum.maboxlinux.org/muzqs/32/3702_2.png) [@muzqs](https://forum.maboxlinux.org/u/muzqs)\
**Post date:** [October 13, 2026, 1:55pm UTC](https://forum.maboxlinux.org/t/me-and-mabox-noctalia-labwc/2612/1 "2026-10-13T13:55:42Z")

</div>

# A couple of day’s ago I started to investigate noctalia (labwc)

> This topic will be random and impulsive.

So far I have converted some tools I like to use also in noctalia

mb-kb-wl : Searches the mabox-noctalia/rc.xml

```auto
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# mb-kb-wl - labwc version of mb-kb.
#
# This script reads the labwc keybinds configuration file
# ("$HOME/.config/mabox-noctalia/rc.xml") and writes them to a text file
# ("$HOME/.config/mabox-noctalia/kbinds.txt"). The keybinds are printed to the
# terminal, or shown in a separate window with --gui.
#
# Based on mb-kb, which is based on a script by wlourf 07/03/2010
# http://u-scripts.blogspot.com/2010/03/how-to-display-openboxs-shortcuts.html
#
# Written by damo <damo@bunsenlabs.org> for BunsenLabs Linux, April 2015
# Ported to Manjaro by napcok <napcok@gmail.com> March 2016
# Fix (multi-action keybinds): prefer Execute over first action - musqz
# labwc fork: labwc rc.xml has no XML namespace, actions can carry attributes
# (command="..."), and keybinds can use the name.action / command.action
# shorthand. Keys that only exist in labwc's built-in <default /> set are not
# listed because they are not in rc.xml.

import sys
import os
import datetime

try:
    from lxml import etree
except ImportError:
    import xml.etree.ElementTree as etree

cfg_dir = os.path.join(os.environ["HOME"], ".config", "mabox-noctalia")
rc_fpath = os.path.join(cfg_dir, "rc.xml")
kb_fpath = os.path.join(cfg_dir, "kbinds.txt")
arrShortcut = []
gui = False

# When a keybind has several actions, show the first one found in this list.
PREFERRED = ("Execute", "ShowMenu", "MoveResizeTo", "SnapToEdge",
             "GrowToEdge", "SendToDesktop", "GoToDesktop")

class Act:
    """One action of a keybind, whether written as <action> or as shorthand."""

    def __init__ (self, name, getter, label=None):
        self.name = name
        self._get = getter
        self.label = label

    def get(self, key):
        return self._get(key)

def clean(text):
    if text is None:
        return None
    text = " ".join(text.split())
    return text or None#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# mb-kb-wl - labwc version of mb-kb.
#
# This script reads the labwc keybinds configuration file
# ("$HOME/.config/mabox-noctalia/rc.xml") and writes them to a text file
# ("$HOME/.config/mabox-noctalia/kbinds.txt"). The keybinds are printed to the
# terminal, or shown in a separate window with --gui.
#
# Based on mb-kb, which is based on a script by wlourf 07/03/2010
# http://u-scripts.blogspot.com/2010/03/how-to-display-openboxs-shortcuts.html
#
# Written by damo <damo@bunsenlabs.org> for BunsenLabs Linux, April 2015
# Ported to Manjaro by napcok <napcok@gmail.com> March 2016
# Fix (multi-action keybinds): prefer Execute over first action - musqz
# labwc fork: labwc rc.xml has no XML namespace, actions can carry attributes
# (command="..."), and keybinds can use the name.action / command.action
# shorthand. Keys that only exist in labwc's built-in <default /> set are not
# listed because they are not in rc.xml.

import sys
import os
import datetime

try:
    from lxml import etree
except ImportError:
    import xml.etree.ElementTree as etree

cfg_dir = os.path.join(os.environ["HOME"], ".config", "mabox-noctalia")
rc_fpath = os.path.join(cfg_dir, "rc.xml")
kb_fpath = os.path.join(cfg_dir, "kbinds.txt")
arrShortcut = []
gui = False

# When a keybind has several actions, show the first one found in this list.
PREFERRED = ("Execute", "ShowMenu", "MoveResizeTo", "SnapToEdge",
             "GrowToEdge", "SendToDesktop", "GoToDesktop")

class Act:
    """One action of a keybind, whether written as <action> or as shorthand."""

    def __init__ (self, name, getter, label=None):
        self.name = name
        self._get = getter
        self.label = label

    def get(self, key):
        return self._get(key)

def clean(text):
    if text is None:
        return None
    text = " ".join(text.split())
    return text or None

def elem_value(el, key):
    """Value of key written as an attribute or as a child element."""
    value = clean(el.get(key))
    if value is not None:
        return value
    child = el.find(key)
    if child is not None:
        return clean(child.text)
    return None

def cmdargs():
    global rc_fpath, kb_fpath
    use_gui = False
    args = sys.argv[1:]
    while args:
        arg = args.pop(0)
        if arg == "--gui":
            use_gui = True
        elif arg == "--rc" and args:
            rc_fpath = os.path.expanduser(args.pop(0))
        elif arg == "--out" and args:
            kb_fpath = os.path.expanduser(args.pop(0))
        else:
            msg = "\n\n\tUSAGE: to display keybinds in a text window use 'mb-kb-wl --gui &>/dev/null'\n\n"
            msg += "\tRunning the script without args will send output to the terminal\n\n"
            msg += "\tOptional: --rc FILE read another rc.xml\n"
            msg += "\t --out FILE write the list to another text file\n\n"
            print(msg)
            sys.exit()
    return use_gui

def actions_of(keybind):
    acts = []
    for a in keybind.findall("action"):
        name = a.get("name")
        if not name:
            continue
        label = None
        if name == "Execute":
            child = a.find("name")
            if child is not None:
                label = clean(child.text)
        acts.append(Act(name, lambda key, el=a: elem_value(el, key), label))

    # Shorthand: <keybind key="F1" name.action="Execute" command.action="...">
    short = clean(keybind.get("name.action"))
    if short:
        acts.append(Act(short,
                        lambda key, kb=keybind: clean(kb.get(key + ".action"))))
    return acts

def pick(acts):
    for wanted in PREFERRED:
        for a in acts:
            if a.name == wanted:
                return a
    return acts[0]

def describe(a):
    if a.name == "Execute":
        return a.label or a.get("command") or a.get("execute") or "Execute"
    if a.name == "MoveResizeTo":
        parts = []
        for tag in ("x", "y", "width", "height"):
            value = a.get(tag)
            if value:
                parts.append(tag + ":" + value)
        return "MoveResizeTo " + " ".join(parts) if parts else "MoveResizeTo"
    if a.name == "ShowMenu":
        return a.get("menu") or "ShowMenu"
    extra = [a.get(t) for t in ("direction", "to") if a.get(t)]
    return " ".join([a.name] + extra)

def keyboard():
    tree = etree.parse(rc_fpath)
    root = tree.getroot()

    for kb in root.iter("keyboard"):
        for k in kb.findall("keybind"):
            key = k.get("key")
            if not key:
                continue

            acts = actions_of(k)
            if not acts:
                continue

            action = pick(acts)
            strType = "x " if action.name == "Execute" else "o "
            arrShortcut.append((strType, key, describe(action)))

def output_keybinds(arrShortcut, gui):
    for i in range(len(arrShortcut)):
        exe = str(arrShortcut[i][0])
        keybinding = str(arrShortcut[i][1])
        execute = str(arrShortcut[i][2])
        if gui:
            if len(execute) > 80:
                execute = execute[:75] + "....."
            line = "{:2}".format(i) + "\t" + "{:<16}".format(keybinding) \
                   + "\t" + execute
        else:
            line = exe + "{:<16}".format(keybinding) + "\t" + execute
        print(line)
        write_file(line)

def check_rcfile(fpath, mode):
    try:
        open(fpath, mode).close()
    except IOError:
        return False
    return True

def write_file(line):
    with open(kb_fpath, 'a') as f:
        f.write(line + "\n")

def check_txtfile(kb_fpath):
    try:
        open(kb_fpath, 'w').close()
    except IOError:
        return False
    return True

if __name__ == " __main__":
    gui = cmdargs()
    check_txtfile(kb_fpath)

    if gui:
        write_file(str(datetime.date.today()) + "\trc.xml KEYBINDS (labwc)")
        write_file("-------------------------------\n")

    if check_rcfile(rc_fpath, "r"):
        try:
            keyboard()
        except Exception as e:
            print("\nCan't parse rc.xml: " + str(e) + "\n\tCheck it with: xmllint --noout " + rc_fpath + "\n")
            sys.exit(1)
        output_keybinds(arrShortcut, gui)
    else:
        print("\nCan't open rc.xml for parsing\n\tCheck the filepath: " + rc_fpath + "\n")
        sys.exit(1)

    if gui:
        write_file("\n(labwc's built-in default keys are not listed here)")
        dlg = "yad --text-info --title='Mabox labwc Keybinds' "
        dlg += "--window-icon=distributor-logo-mabox --image=/usr/share/icons/mabox_trans_64.png "
        dlg += "--text '\n<b>Key bindings</b> are configured in your <i>" + rc_fpath + "</i> file. <a href=\"https://labwc.github.io/labwc-config.5.html\">docs</a>\n\t\t\t\t<b>S</b> - Shift key\n\t\t\t\t<b>C</b> - Control key\n\t\t\t\t<b>A</b> - Alt key\n\t\t\t\t<b>W</b> - Super key (usually bound to the Windows key)' "
        dlg += "--filename=" + kb_fpath + " "
        dlg += "--width=640 --height=560 --fontname=Monospace "
        dlg += "--button='Edit rc.xml:geany " + rc_fpath + "' --button='Reload labwc configuration:labwc -r' --button=Close"
        os.system(dlg)

def elem_value(el, key):
    """Value of key written as an attribute or as a child element."""
    value = clean(el.get(key))
    if value is not None:
        return value
    child = el.find(key)
    if child is not None:
        return clean(child.text)
    return None

def cmdargs():
    global rc_fpath, kb_fpath
    use_gui = False
    args = sys.argv[1:]
    while args:
        arg = args.pop(0)
        if arg == "--gui":
            use_gui = True
        elif arg == "--rc" and args:
            rc_fpath = os.path.expanduser(args.pop(0))
        elif arg == "--out" and args:
            kb_fpath = os.path.expanduser(args.pop(0))
        else:
            msg = "\n\n\tUSAGE: to display keybinds in a text window use 'mb-kb-wl --gui &>/dev/null'\n\n"
            msg += "\tRunning the script without args will send output to the terminal\n\n"
            msg += "\tOptional: --rc FILE read another rc.xml\n"
            msg += "\t --out FILE write the list to another text file\n\n"
            print(msg)
            sys.exit()
    return use_gui

def actions_of(keybind):
    acts = []
    for a in keybind.findall("action"):
        name = a.get("name")
        if not name:
            continue
        label = None
        if name == "Execute":
            child = a.find("name")
            if child is not None:
                label = clean(child.text)
        acts.append(Act(name, lambda key, el=a: elem_value(el, key), label))

    # Shorthand: <keybind key="F1" name.action="Execute" command.action="...">
    short = clean(keybind.get("name.action"))
    if short:
        acts.append(Act(short,
                        lambda key, kb=keybind: clean(kb.get(key + ".action"))))
    return acts

def pick(acts):
    for wanted in PREFERRED:
        for a in acts:
            if a.name == wanted:
                return a
    return acts[0]

def describe(a):
    if a.name == "Execute":
        return a.label or a.get("command") or a.get("execute") or "Execute"
    if a.name == "MoveResizeTo":
        parts = []
        for tag in ("x", "y", "width", "height"):
            value = a.get(tag)
            if value:
                parts.append(tag + ":" + value)
        return "MoveResizeTo " + " ".join(parts) if parts else "MoveResizeTo"
    if a.name == "ShowMenu":
        return a.get("menu") or "ShowMenu"
    extra = [a.get(t) for t in ("direction", "to") if a.get(t)]
    return " ".join([a.name] + extra)

def keyboard():
    tree = etree.parse(rc_fpath)
    root = tree.getroot()

    for kb in root.iter("keyboard"):
        for k in kb.findall("keybind"):
            key = k.get("key")
            if not key:
                continue

            acts = actions_of(k)
            if not acts:
                continue

            action = pick(acts)
            strType = "x " if action.name == "Execute" else "o "
            arrShortcut.append((strType, key, describe(action)))

def output_keybinds(arrShortcut, gui):
    for i in range(len(arrShortcut)):
        exe = str(arrShortcut[i][0])
        keybinding = str(arrShortcut[i][1])
        execute = str(arrShortcut[i][2])
        if gui:
            if len(execute) > 80:
                execute = execute[:75] + "....."
            line = "{:2}".format(i) + "\t" + "{:<16}".format(keybinding) \
                   + "\t" + execute
        else:
            line = exe + "{:<16}".format(keybinding) + "\t" + execute
        print(line)
        write_file(line)

def check_rcfile(fpath, mode):
    try:
        open(fpath, mode).close()
    except IOError:
        return False
    return True

def write_file(line):
    with open(kb_fpath, 'a') as f:
        f.write(line + "\n")

def check_txtfile(kb_fpath):
    try:
        open(kb_fpath, 'w').close()
    except IOError:
        return False
    return True

if __name__ == " __main__":
    gui = cmdargs()
    check_txtfile(kb_fpath)

    if gui:
        write_file(str(datetime.date.today()) + "\trc.xml KEYBINDS (labwc)")
        write_file("-------------------------------\n")

    if check_rcfile(rc_fpath, "r"):
        try:
            keyboard()
        except Exception as e:
            print("\nCan't parse rc.xml: " + str(e) + "\n\tCheck it with: xmllint --noout " + rc_fpath + "\n")
            sys.exit(1)
        output_keybinds(arrShortcut, gui)
    else:
        print("\nCan't open rc.xml for parsing\n\tCheck the filepath: " + rc_fpath + "\n")
        sys.exit(1)

    if gui:
        write_file("\n(labwc's built-in default keys are not listed here)")
        dlg = "yad --text-info --title='Mabox labwc Keybinds' "
        dlg += "--window-icon=distributor-logo-mabox --image=/usr/share/icons/mabox_trans_64.png "
        dlg += "--text '\n<b>Key bindings</b> are configured in your <i>" + rc_fpath + "</i> file. <a href=\"https://labwc.github.io/labwc-config.5.html\">docs</a>\n\t\t\t\t<b>S</b> - Shift key\n\t\t\t\t<b>C</b> - Control key\n\t\t\t\t<b>A</b> - Alt key\n\t\t\t\t<b>W</b> - Super key (usually bound to the Windows key)' "
        dlg += "--filename=" + kb_fpath + " "
        dlg += "--width=640 --height=560 --fontname=Monospace "
        dlg += "--button='Edit rc.xml:geany " + rc_fpath + "' --button='Reload labwc configuration:labwc -r' --button=Close"
        os.system(dlg)

```

I also created a simplified wayland version of skippy-xd, skippy-wl.

Skippy-wl _(No workspaces support)_

> **[GitHub - musqz/skippy-wl: Expose tool like skippy-xd but for wayland](https://github.com/musqz/skippy-wl)**
>
> Expose tool like skippy-xd but for wayland

```auto
skippy-wl --show

```

 ![skip](https://forum.maboxlinux.org/uploads/default/original/2X/6/63da225aba018aef448ec26067099e8310135fe8.webp)

Jumpapp for x11/wayland. _(No workspaces support)_

```auto
yay -S jumpapp-ng

```

or manual

> **[GitHub - musqz/jumpapp: A run-or-raise application switcher for any X11...](https://github.com/musqz/jumpapp)**
>
> A run-or-raise application switcher for any X11 desktop

Fittsmon-wl : Fittsmon for wayland

> **[GitHub - musqz/fittsmon: FittsMon is a lightweight X11/WAYLAND utility that...](https://github.com/musqz/fittsmon)**
>
> FittsMon is a lightweight X11/WAYLAND utility that binds mouse actions to screen corners and edges.

```auto
On Wayland, use fittsmon-wl in your compositor's autostart. It takes the same options:

fittsmon-wl --monitor eDP-1 &

```

Created a quake like terminal with terminator. _Kitty, I am not ready yet._

### q-term-toggle

```auto
#!/bin/bash
T=q-term

if ! wlrctl toplevel find title:$T; then
    terminator -T $T &
elif wlrctl toplevel find title:$T state:focused; then
    wlrctl toplevel minimize title:$T
else
    wlrctl toplevel focus title:$T

```

```auto
<keybind key="F12">
  <action name="Execute" command="/home/user/bin/q-term-toggle"/>
</keybind>

```

 ![2026-10-13_15-50-17](https://forum.maboxlinux.org/uploads/default/original/2X/d/d0bd2fc6addb00df43fdd8a8cfd89ec4cfc18527.jpeg)

---

<div class="post-metadata">

**Author:** ![muzqs](https://forum.maboxlinux.org/user_avatar/forum.maboxlinux.org/muzqs/32/3702_2.png) [@muzqs](https://forum.maboxlinux.org/u/muzqs)\
**Post date:** [October 13, 2026, 3:31pm UTC](https://forum.maboxlinux.org/t/me-and-mabox-noctalia-labwc/2612/2 "2026-10-13T15:31:57Z")

</div>

Send to another monitor.

```auto
<!-- send focused window to monitor -->
    <keybind key="S-C-KP_7"><action name="MoveToOutput" output="HDMI-A-1" /></keybind>
    <keybind key="S-C-KP_Home"><action name="MoveToOutput" output="HDMI-A-1" /></keybind>
    <keybind key="S-C-KP_9"><action name="MoveToOutput" output="DP-1" /></keybind>
    <keybind key="S-C-KP_Prior"><action name="MoveToOutput" output="DP-1" /></keybind>

```

or with `skippy-wl --multi-select`. Send multiple windows.

```auto
#!/usr/bin/env bash
# Pick windows with skippy-wl, then send each to the dell monitor.
# Focuses a window, then fires the helper keybind W-A-C-9 (MoveToOutput in rc.xml) with wtype.
set -euo pipefail

ids=$(skippy-wl --show --multi-select) || exit 0

while IFS= read -r id; do
    skippy-wl --activate "$id" || continue
    sleep 0.15
    wtype -M logo -M alt -M ctrl -k 9 -m ctrl -m alt -m logo
    sleep 0.15
done <<< "$ids"

```

---

<div class="post-metadata">

**Author:** ![muzqs](https://forum.maboxlinux.org/user_avatar/forum.maboxlinux.org/muzqs/32/3702_2.png) [@muzqs](https://forum.maboxlinux.org/u/muzqs)\
**Post date:** [October 13, 2026, 6:23pm UTC](https://forum.maboxlinux.org/t/me-and-mabox-noctalia-labwc/2612/3 "2026-10-13T18:23:32Z")

</div>

### My first little tweaks demo.

skippy-wl – expose  
jumpapp-ng – runhideraise  
fittsmon-wl – screen edges mouse events  
quake-term – script  
tabdock – tabs from firefox browsers

wallpaper: Cyberpunk

[![](https://img.youtube.com/vi/DbkYlDZlk5U/maxresdefault.jpg "my first noctalia steps") ](https://www.youtube.com/watch?v=DbkYlDZlk5U)

---

<div class="post-metadata">

**Author:** ![muzqs](https://forum.maboxlinux.org/user_avatar/forum.maboxlinux.org/muzqs/32/3702_2.png) [@muzqs](https://forum.maboxlinux.org/u/muzqs)\
**Post date:** [October 29, 2026, 8:18pm UTC](https://forum.maboxlinux.org/t/me-and-mabox-noctalia-labwc/2612/4 "2026-10-29T20:18:26Z")

</div>

Working on `skippy-wl` to work nice with noctalia. _(coloring)_

 ![2026-10-29_21-06-40](https://forum.maboxlinux.org/uploads/default/original/2X/c/c725a1c6e88a50a0277957e6a0b8927f1fc5e886.jpeg)

 ![2026-10-29_21-13-04](https://forum.maboxlinux.org/uploads/default/original/2X/d/d3580deb98a84991aea48f65704aac103a3c7e10.jpeg)

 ![2026-10-29_21-11-53](https://forum.maboxlinux.org/uploads/default/original/2X/b/b64c8d33942c0ef542c1b097af3f69215b2c3d6d.jpeg)

RC file

```auto
## skippy-wl config: copy to ~/.config/skippy-wl/skippy-wl.rc
## "key = value" lines grouped under [sections]. Read each time the overlay opens.
## Remove the leading # from an option to set it.

[layout]
## Pixels around the grid and between tiles.
margin = 48
spacing = 28

[tiles]
## Corner radius in pixels of each window preview and its frame (0-50). 0 = square.
radius = 12

[label]
## Window name on each tile. Colors are #RRGGBB or #RRGGBBAA.
show = true

## windowTitle, windowClass (the app id) or both.
option = both

## below (under the tile), or inside it: top-left, top, top-right, left, center, right, bottom-left, bottom, bottom-right.
position = bottom

## Move the label from its position; it may leave the tile.
offsetX = 0
offsetY = 0

## Box height in pixels (below also reserves it under the tile) and width as a fraction of the tile.
height = 28
width = 0.92
radius = 6

## opacity (0-255) scales border and background. backgroundHighlight is for the selected tile; unset = background.
#border = #ffffff59
#background = #16181d
#backgroundHighlight = #2d5aa8
opacity = 235

text = #ffffff
textOutline = #00000000

## Pango description or skippy-xd style (Name:size=12:weight=bold). Also sets the filter bar font.
font = Sans 11

[monitors]
## Windows per monitor: each (the ones on that monitor) or pointer (all of them on the monitor under the pointer).
mode = pointer

[switch]
## Switch mode (--next/--prev): releasing the modifiers held when the overlay opened picks the selected window.
pivot = true
## ms to wait before drawing; a tap shorter than that switches without drawing (0 = draw at once; needs pivot).
wait = 100
## ms: releasing the modifiers this long after the overlay was drawn or the last key press leaves it open (0 = always pick).
hold = 1000

[icons]
## App icon on each tile. Set theme to your icon theme: hicolor alone lacks many apps.
## size is in pixels (16-256); the theme's parents and hicolor are searched too.
enabled = true
size = 64
theme = hicolor
position = center

[animation]
## Fade and grow when the overlay opens. duration is in ms (0-1000); 0 shows it at once.
enabled = true
duration = 950

[background]
## PNG, JPEG, AVIF, HEIC or HEIF image shown behind the tiles, scaled to fill each monitor. Unset = plain color.
## colors.background = #00000000 makes the overlay see-through: windows show behind the tiles.
#image = /home/vogel/wallpapers/splash.png

## Shell command that prints the image path, run each time the overlay opens. Falls back to image if it fails or takes over 1 s.
image_cmd = noctalia msg wallpaper-get

## show: leave room for panels and docks. hide: the overlay covers them.
panels = show

[colors]
## #RRGGBB or #RRGGBBAA. With an image, setting it tints the image; leave it unset for the image alone.
background = #00000000
#highlight = #5999ff
#border = #ffffff2e

## Labwc theme file to take the highlight and border colors from (only a leading ~/ is expanded).
## Tile borders from the theme use 60% alpha. highlight and border above win.
theme_file = ~/.local/share/themes/noctalia/openbox-3/themerc

[hide]
## Windows whose app id, title or status matches are never shown, in --switch either. Comma separated globs, same syntax as --app-id and --title.
#app_id = org.keepassxc.KeePassXC
#title = Picture-in-Picture
## minimized, maximized, fullscreen or activated.
#status = minimized

[bind]
## xkb keysym names, comma separated. A line replaces the default keys of that action.
select = Return, KP_Enter
cancel = Escape
close = Delete
#minimize = m, M
left = Left
right = Right
up = Up
down = Down
#home = Home
#end = End
#next = Tab
#prev = ISO_Left_Tab

```

Skippy-wl → Multiselect → Action

 ![2026-10-29_21-15-38](https://forum.maboxlinux.org/uploads/default/original/2X/a/af250b29b48d2a4c927053f6cec2affe6e537e41.jpeg)

---

<div class="post-metadata">

**Author:** ![muzqs](https://forum.maboxlinux.org/user_avatar/forum.maboxlinux.org/muzqs/32/3702_2.png) [@muzqs](https://forum.maboxlinux.org/u/muzqs)\
**Post date:** [October 29, 2026, 8:26pm UTC](https://forum.maboxlinux.org/t/me-and-mabox-noctalia-labwc/2612/5 "2026-10-29T20:26:38Z")

</div>

Skippy-wl search `/` .

 ![2026-10-29_21-24-15](https://forum.maboxlinux.org/uploads/default/original/2X/6/6329840cabc42e667dd43b4439e2502fdf6087b1.jpeg)

---

<div class="post-metadata">

**Author:** ![muzqs](https://forum.maboxlinux.org/user_avatar/forum.maboxlinux.org/muzqs/32/3702_2.png) [@muzqs](https://forum.maboxlinux.org/u/muzqs)\
**Post date:** [October 30, 2026, 6:08pm UTC](https://forum.maboxlinux.org/t/me-and-mabox-noctalia-labwc/2612/6 "2026-10-30T18:08:36Z")

</div>

# mb-music → Noctalia /music

Created a plugin to search music from mb-music.csv.

```auto
noctalia msg panel-open launcher /music

```

 ![2026-10-30_19-02-39](https://forum.maboxlinux.org/uploads/default/original/2X/2/2feddb84c3e481f0793538d021b1e591d47d49f9.jpeg)

 ![2026-10-30_19-00-54](https://forum.maboxlinux.org/uploads/default/original/2X/4/4770abd0321ed266a33682342d42c000b29a79da.jpeg)

---

<div class="post-metadata">

**Author:** ![muzqs](https://forum.maboxlinux.org/user_avatar/forum.maboxlinux.org/muzqs/32/3702_2.png) [@muzqs](https://forum.maboxlinux.org/u/muzqs)\
**Post date:** [October 31, 2026, 9:37am UTC](https://forum.maboxlinux.org/t/me-and-mabox-noctalia-labwc/2612/7 "2026-10-31T09:37:03Z")

</div>

## mabox-noctalia-ce

_in development and mainly for inspiration_

The installation creates `Noctalia CE` session at login. So no conflicts with mabox-noctalia or other sessions.

> **[GitHub - musqz/mabox-noctalia-ce: Mabox Noctalia dots community edition](https://github.com/musqz/mabox-noctalia-ce)**
>
> Mabox Noctalia dots community edition

 ![2026-10-31_10-20-46](https://forum.maboxlinux.org/uploads/default/original/2X/8/81cc58551142505ef26d41aa22cf04405b3bb6ae.jpeg)

---

<div class="post-metadata">

**Author:** ![muzqs](https://forum.maboxlinux.org/user_avatar/forum.maboxlinux.org/muzqs/32/3702_2.png) [@muzqs](https://forum.maboxlinux.org/u/muzqs)\
**Post date:** [November 1, 2026, 12:54am UTC](https://forum.maboxlinux.org/t/me-and-mabox-noctalia-labwc/2612/8 "2026-11-01T00:54:19Z")

</div>

Alternative to `colormenu` for noctalia.

```auto
noctalia msg panel-toggle musqz/colors:picker

```

 ![2026-11-01_01-49-33](https://forum.maboxlinux.org/uploads/default/original/2X/e/eda2a8e5f0c2fe787c1bd4df12d6a20bff7a31bf.jpeg)

 ![2026-11-01_01-59-46](https://forum.maboxlinux.org/uploads/default/original/2X/5/562467aef2c30c2f9d6a5be7129b4bc0818b329f.jpeg)

 ![2026-11-01_01-58-54](https://forum.maboxlinux.org/uploads/default/original/2X/a/ab8492a82075a2761b99b948d52ff437c3f51bb3.jpeg)

 ![2026-11-01_02-45-39](https://forum.maboxlinux.org/uploads/default/original/2X/c/cbb3748f7bb234b0545b0b2b399dafaacebbbb02.jpeg)

---

<div class="post-metadata">

**Author:** ![muzqs](https://forum.maboxlinux.org/user_avatar/forum.maboxlinux.org/muzqs/32/3702_2.png) [@muzqs](https://forum.maboxlinux.org/u/muzqs)\
**Post date:** [November 1, 2026, 5:28pm UTC](https://forum.maboxlinux.org/t/me-and-mabox-noctalia-labwc/2612/9 "2026-11-01T17:28:27Z")

</div>

Noctalia `mabox/notes` plugin. (testing)

A simple notes manager. For me an alternative to xpad.

- left panel is pinned (toggle with key)
- top is main panel for all edits

```auto
<keybind key="W-n"><action name="Execute" command="noctalia msg panel-toggle mabox/notes:main"/></keybind>
    <keybind key="W-A-n"><action name="Execute" command="noctalia msg panel-toggle mabox/notes:pinned"/></keybind>

```

 ![2026-11-01_18-22-45](https://forum.maboxlinux.org/uploads/default/original/2X/1/191fb832c6649103cc40b56ed44de8b37d4f4929.jpeg)

---

<div class="post-metadata">

**Author:** ![muzqs](https://forum.maboxlinux.org/user_avatar/forum.maboxlinux.org/muzqs/32/3702_2.png) [@muzqs](https://forum.maboxlinux.org/u/muzqs)\
**Post date:** [November 2, 2026, 12:04pm UTC](https://forum.maboxlinux.org/t/me-and-mabox-noctalia-labwc/2612/10 "2026-11-02T12:04:33Z")

</div>

Hi @napcok,

The `./install.sh` is improved.

To get the latest commits

```auto
git pull
./install.sh

```

Some bug fixes and added `Tools` to the menu.  
Tools are custom plugins for the noctalia desktop I created.  
Some inspired by tools from Mabox.

- colors
- notes
- music
- status

 ![2026-11-02_12-54-08](https://forum.maboxlinux.org/uploads/default/original/2X/b/b55a2ae4ee4b38147d521b8ff1c5ba49cb9a7db9.jpeg)

status

 ![2026-11-02_13-01-30](https://forum.maboxlinux.org/uploads/default/original/2X/7/76be8529f4ffa49440f5704ec5eb0572be39ee92.png)

status - settings

 ![2026-11-02_13-01-02](https://forum.maboxlinux.org/uploads/default/original/2X/e/e4fc461a8771da242c74e35f67a2a5b3714af938.jpeg)

---

<div class="post-metadata">

**Author:** ![muzqs](https://forum.maboxlinux.org/user_avatar/forum.maboxlinux.org/muzqs/32/3702_2.png) [@muzqs](https://forum.maboxlinux.org/u/muzqs)\
**Post date:** [November 2, 2026, 2:14pm UTC](https://forum.maboxlinux.org/t/me-and-mabox-noctalia-labwc/2612/11 "2026-11-02T14:14:00Z")

</div>

Update

```auto
git pull
./install.sh

```

🙂

---

<div class="post-metadata">

**Author:** ![muzqs](https://forum.maboxlinux.org/user_avatar/forum.maboxlinux.org/muzqs/32/3702_2.png) [@muzqs](https://forum.maboxlinux.org/u/muzqs)\
**Post date:** [November 3, 2026, 3:48pm UTC](https://forum.maboxlinux.org/t/me-and-mabox-noctalia-labwc/2612/12 "2026-11-03T15:48:39Z")

</div>

# Snap/unsnap to pinned panel toggle.

A patch for noctalia to be able to this with `pinned panels`.

> <https://github.com/noctalia-dev/noctalia/pull/5192>
>
> \## Summary
> 
> Adds \`noctalia msg panel-reserve \<panel-id\> \[on|off|toggle\]\`. An ope…n persistent panel that fills one axis along a screen edge gets an exclusive zone (panel size plus shadow bleed). Maximize, snap and tiling then stop at its edge, like a dock. \`off\` gives the space back.
> 
> Centered panels and panels that fill no axis are rejected with an error. The setting is not remembered across close and reopen.
> 
> \## Motivation
> 
> Persistent panels overlay the workspace with a zero exclusive zone, so windows run under them. Plugins have no way to let the user choose between overlay and dock. This is a runtime command: no manifest key and no plugin API bump, so a plugin can offer a dock/float button.
> 
> \## Type of Change
> 
> \- \[x\] New feature
> 
> \## Testing
> 
> \- Tested on labwc with a plugin panel (\`height = "fill"\`, top\_left): after \`panel-reserve ... on\`, maximize and \`W-Left\` stop at the panel edge. After \`off\`, windows run under it again.
> \- Closing and reopening the panel drops the dock, as documented.
> \- CI: Build (debug), Build (Fedora 44), clang-format and docs format pass.
> 
> \## Manual Coverage
> 
> \- \[x\] Tested on another compositor: labwc
> 
> \## Checklist
> 
> \- \[\] This PR is ready for review, or it is marked as Draft.
> \- \[\] I read and followed the relevant guidance in \`CONTRIBUTING.md\`.
> \- \[\] I ran \`just format\` with clang-format v22+ installed, or this PR has no code changes.
> \- \[\] I ran the relevant build or test commands, or explained why they were not run.
> \- \[\] I self-reviewed the changes.
> \- \[\] I checked for new warnings or errors.
> \- \[x\] I updated user-facing documentation in \[\`docs/user/\`\](../docs/user/) when this PR changes documented behavior or configuration, or this PR does not require documentation changes.
> \- \[\] I added or updated \`assets/translations/en.json\`, or this PR adds no new user-facing strings.
> \- \[\] I did not edit non-English translation files unless this PR is explicitly for translation tooling, an import/export sync, or a maintainer-requested locale change.
> \- \[\] I used the existing canonical names for config keys, IPC names, paths, and identifiers.

 ![screenshot_20261103_162153](https://forum.maboxlinux.org/uploads/default/original/2X/4/4ae920bd4c61f9d4b19f8fecbcba343644616176.jpeg)

 ![screenshot_20261103_162127](https://forum.maboxlinux.org/uploads/default/original/2X/c/cc56d76becc22828d2cad59401e44919ffd3d193.jpeg)

 ![screenshot_20261103_164616](https://forum.maboxlinux.org/uploads/default/original/2X/d/dc4ed38936244c552b6d3173a13eb072b8dfbdae.jpeg)

 ![screenshot_20261103_164628](https://forum.maboxlinux.org/uploads/default/original/2X/6/6649374cb8a6ac4740722c1e652d9cce87084ea4.jpeg)
