Alexays / Waybar

Highly customizable Wayland bar for Sway and Wlroots based compositors. :v: :tada:
MIT License
5.83k stars 657 forks source link

Adding the ability to have dropdown menu for modules #3247

Closed benjamin-voisin closed 2 days ago

benjamin-voisin commented 1 month ago

Related to #1064 : Every ALabel module now can have a dropdown menu that can be spawned using any click you want. The menu is defined with a xml file, and the comportment of each button can be configured in the waybar/conf file. The menus can by styled in the waybar/style.css.

For example, you can now easily built a well-integrated power module with this config:

"custom/power": {
    "format" : "⏻ ",
    "tooltip": false,
    "menu": "on-click",
    "menu-file": "~/.config/waybar/power_menu.xml",
    "menu-actions": {
        "shutdown": "shutdown",
        "reboot": "reboot",
    "suspend": "systemctl suspend",
    "hibernate": "systemctl hibernate",
    },
},

Where the ~/.config/waybar/power_menu.xml look like this:

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <object class="GtkMenu" id="menu">
    <child>
        <object class="GtkMenuItem" id="suspend">
            <property name="label">Suspend</property>
        </object>
    </child>
    <child>
        <object class="GtkMenuItem" id="hibernate">
            <property name="label">Hibernate</property>
        </object>
    </child>
    <child>
        <object class="GtkMenuItem" id="shutdown">
            <property name="label">Shutdown</property>
        </object>
    </child>
    <child>
      <object class="GtkSeparatorMenuItem" id="delimiter1"/>
    </child>
    <child>
        <object class="GtkMenuItem" id="reboot">
            <property name="label">Reboot</property>
        </object>
    </child>
  </object>
</interface>

This gives something like this: 20240509_21h49m48s_grim

And it can by styled with some css:

menu {
    border-radius: 15px;
    background: #161320;
    color: #B5E8E0;
}
menuitem {
    border-radius: 15px;
}

To look like this : 20240509_21h48m57s_grim

The GObject is in the AModule class, so every module could have such menu, but I figured that only the ALabel class should build it automatically reading the config. For other AModule, it could be made differently.

nevaforget commented 1 month ago

Hey guys, wouldn't it be possible to use the already existing groups? But just adding orientation = popout-vertical | popout-horizontal | popout-inherit or something. Why having an additional xml file and why doesn't it contain the actions instead of having an extra menu-actions. Looks so inconvenient.

Thanks for your effort guys! Best regards

benjamin-voisin commented 1 month ago

@nevaforget My implementation uses Gtk objects in a more general way. That is why their is a xml file, it's not a random file, it's a Gtk ui definition. That means that the user can use all the power of Gtk menus, with documented and very used xml files. That's also why the actions need to be defined separatly : the Gtk ui definition doesn't allow this.

Alexays commented 1 month ago

Can you add it to the man, as well as an example to the default conf? :)

benjamin-voisin commented 1 month ago

@Alexays I've added the checks asked, and I made sure that the app doesn't crash when trying to build the popup menu. If something fails during constructions, it display a warning message explaining why, and still launch the waybar.

I've also updated the manpages of all the modules supporting this behaviour, and created a dedicated waybar-menu manpage.

yorunoken commented 3 days ago

This would be so so so so useful to have. Any updates?

Alexays commented 2 days ago

Thanks!