Without having much say, ...
1. Add widgets to the title bar (such as labels, text inputs, buttons,
checkboxes, combo boxes, etc...) to combine the benefits of CSD and window
managers
I extremely like this idea!
I would hope that this brings back together window manager windows and the
current CSD implementations.
2. Get information about the window manager's appearance to implement CSD
without off-putting the user
I'm too rookie to judge about the importance of (2)
Regards,
Chris | DarkTrick
On 2022/07/25 5:28, samuel ammonius wrote:
I don't have any rock-solid plan for this specification, I'm just throwing it out there for
discussion. I'm using the term "window manager" synonymously with "wayland
compositor" throughout this email. The idea is that window managers could provide an API for
applications to do either of the following:
1. Add widgets to the title bar (such as labels, text inputs, buttons,
checkboxes, combo boxes, etc...) to combine the benefits of CSD and window
managers
2. Get information about the window manager's appearance to implement CSD
without off-putting the user
An API like this could then lead the way for real widgeting toolkits to
integrate it into their syntax without much contrast. For example, GTK could
have the headerbar use this API once GNOME's window manager supports this
specification, or Qt could create a QTitleBar widget with a similar syntax to
QToolBar (including functions like addWidget, addSeparator, and so on). This
will allow both developers and users to get the best out of what both CSV and
window managers have to offer, and to be relieved of having to pick one or even
not getting to choose.
The challenge with creating something like this is that it will have to be very
well designed if we want to avoid either driving developers crazy or destroying
performance through something like a CSS parser. A design like this is
possible, but still a challenge. There's a lot of possible ways that the API
could look, so I'll
give a brief template to get started:
(This code is going to look horrible on any email clients that don't
support HTML) ___
#include #include intmain(intargc,char*argv[]){TitleBar *bar
=get_titlebar(/* pointer to X11 Window / Wayland shell surface */);TbWidget *checkbox
=titlebar_add_widget(bar,titlebar_button,"click me!");
TbWidget*btn =titlebar_add_widget(bar,titlebar_button,"click me!");TbWidget *label
=titlebar_add_widget(bar,titlebar_label,"<--- click it!!!")titlebar_widget_set_text(label,"<---
nevermind, don\'t click it!!!");titlebar_widget_set_tooltip(label,"clicking it will trigger the end of the
world");titlebar_remove_widget(bar,btn);update_titlebar(bar);sleep(99); /* showtime! */}
This template shows some basic functions that probably wouldn't change much in
the future. The rest of the implementation could be done in many different ways,
each with their own pros and cons. Here's a few of the questions that would
need to be answered:
* *Communication -* How will the API communicate to window managers? One
option is DBus. Another option could be a standard location for window managers
to place libraries (eg. /usr/lib/tbwidgets/[openbox].so) which implement the
specification, but this would require loading those libraries during runtime
rather than compile time, and I'm not sure if that's even possible.
* *Layout API -* The possibilities for how apps may want to organize the titlebar in
different situations is infinite. An app may want to set a maximum and minimum size for
widgets, may want to use relative or absolute sizing/positioning, may want to hide/shrink
certain widgets when the titlebar is too small, and so on, so a CSS property-like
solution would be a bad approach. I think the only way to give users the ability to place
widgets however they want is to have the user create a function that takes an unsigned
int parameter for the titlebar's new length, and have a function like
"titlebar_set_resize_callback(TitleBar *bar, void(*callback)(int));" that the
user can pass their function to. This callback function could then be called by the
internal API right before the widgets are rendered whenever the window is resized
horizontally.
* *Info detail* - This question applies to the second part of the API as
mentioned in the introduction. When an app wants to get data about a window
manager so that it can implement CSD (or maybe even style the app based on the
appearance of the window manager), what kind of info should be available and
how should that info be organized? It could get very complicated to offer all
of this information considering things like gradients, animations, borders,
shadows, fonts, etc. I don't have any good solutions to this so far.
o On the topic of how this info will be designed, there would need to be
a way for apps