Cleanup build flags, global namespace and includes#1841
Conversation
✅ Deploy Preview for conkyweb ready!
To edit notification comments on pull requests, go to your Netlify site configuration. |
3fee8d7 to
2cc7944
Compare
|
Checked for conflicts, PRs that would require some changes are:
Those are minor however, I don't mind helping out if needed. |
| enum class alignment : uint8_t { | ||
| NONE = 0, | ||
| NONE_LEFT = 0b0001, | ||
| NONE_MIDDLE = 0b0010, | ||
| NONE_RIGHT = 0b0011, | ||
| TOP_LEFT = 0b0101, | ||
| TOP_MIDDLE = 0b0110, | ||
| TOP_RIGHT = 0b0111, | ||
| MIDDLE_LEFT = 0b1001, | ||
| MIDDLE_MIDDLE = 0b1010, | ||
| MIDDLE_RIGHT = 0b1011, | ||
| BOTTOM_LEFT = 0b1101, | ||
| BOTTOM_MIDDLE = 0b1110, | ||
| BOTTOM_RIGHT = 0b1111, | ||
| }; | ||
| constexpr uint8_t operator*(alignment index) { | ||
| return static_cast<uint8_t>(index); | ||
| } |
There was a problem hiding this comment.
This is an example of how I changed global enums to enum class. I did this because headers like gui.h are included in a lot of places and using pre C++11 style enums declares enum variants as global constants. This in turn means that no other enum can use same variant names (e.g. NONE).
The bigger issues are:
- Variants cast implicitly into
intandbool- Promotes poor code hygiene because function declarations can use any int argument value which leads to same include mess this PR aims to solve.
- Variant names can make it unclear which constant is referenced.
Advantages:
enum classrequires exhaustive matching in switch statements which ensures all places referencing them get updated when new variants are added.
There was a problem hiding this comment.
Also, purely matter of taste, window_type::NORMAL looks much nicer than TYPE_NORMAL (and is more descriptive).
60843da to
063f300
Compare
- Separated displays so they don't have to be all built even when the features are disabled. - Removed weird linker magic for display init and replaced it with straightforward (and faster) template functions that behave the same. - Replaced disabled_display_output classes with log messages. - Add explicit errors when feature dependent headers get included where they shouldn't. - Use gperf to build perfect hash for color names instead of custom X11 lookup. This should make it easier to add more color names to the list with no extra cost. - Made alignment use a specific bit layout which greatly simplifies code. - Switch BUILD_MOUSE_EVENTS dependency from OWN_WINDOW to BUILD_X11. - Other minor improvements to some existing code which shouldn't affect behavior. - Add documentation links to sample configs. Signed-off-by: Tin Švagelj <tin.svagelj@live.com>
063f300 to
4cd6714
Compare
4cd6714 to
c23afeb
Compare
| own_window_type = 'desktop', | ||
| own_window_type = 'normal', | ||
| own_window_hints = 'undecorated,sticky,below,skip_taskbar,skip_pager', |
There was a problem hiding this comment.
Changed this to normal because it's the type that most commonly works, on WMs/DEs that are most commonly used (with desktops).
Caellian
left a comment
There was a problem hiding this comment.
Explanation of changes to display output registration.
| outputs.reserve(static_cast<size_t>(output_t::OUTPUT_COUNT)); | ||
| register_output<output_t::CONSOLE>(outputs); | ||
| register_output<output_t::NCURSES>(outputs); | ||
| register_output<output_t::FILE>(outputs); | ||
| register_output<output_t::HTTP>(outputs); | ||
| register_output<output_t::X11>(outputs); | ||
| register_output<output_t::WAYLAND>(outputs); | ||
|
|
||
| for (auto out : outputs) { NORM_ERR("FOUND: %s", out->name.c_str()); } |
There was a problem hiding this comment.
Given that we "called" noop init_*_output functions in order to trigger static initializers, I wondered why not just initialize them from those functions instead of relying on execution flow hidden in constructors of static objects.
| enum class output_t : uint32_t { | ||
| CONSOLE, | ||
| NCURSES, | ||
| FILE, | ||
| HTTP, | ||
| X11, | ||
| WAYLAND, | ||
| OUTPUT_COUNT | ||
| }; | ||
| template <output_t Output> | ||
| void register_output(display_outputs_t &outputs); |
There was a problem hiding this comment.
This can be handled by using a templated function, ideally with an enum representing different outputs - but could've been strings or other values, or even discrete types (though that would cause recursive dependency).
It's useful to have an enum of supported outputs in display_output.hh anyway.
| #ifndef BUILD_WAYLAND | ||
| template <> | ||
| void register_output<output_t::WAYLAND>(display_outputs_t &outputs) { | ||
| log_missing("Wayland", "BUILD_WAYLAND"); | ||
| } | ||
| #endif |
There was a problem hiding this comment.
Given that register_output functions are templated, this means that we can just log if a feature is not enabled. And this causes a linker error if either the display output isn't in compilation or a fallback isn't defined. This function will almost always be inlined by compiler, even with -O1 (unlike class constructors).
I find that to be much less error prone than hoping some global static in some other file gets constructed.
| class disabled_display_output : public display_output_base { | ||
| public: | ||
| const std::string define; | ||
| disabled_display_output(const std::string &name, const std::string &define); | ||
| }; | ||
|
|
There was a problem hiding this comment.
So disabled_display_output is no longer needed.
src/display-wayland.cc
Outdated
| namespace { | ||
|
|
||
| #ifdef BUILD_WAYLAND | ||
| namespace { | ||
| conky::display_output_wayland wayland_output; | ||
| #else | ||
| conky::disabled_display_output wayland_output_disabled("wayland", | ||
| "BUILD_WAYLAND"); | ||
| #endif | ||
|
|
||
| } // namespace | ||
| extern void init_wayland_output() {} | ||
|
|
||
| template <> | ||
| void register_output<output_t::WAYLAND>(display_outputs_t &outputs) { | ||
| outputs.push_back(&wayland_output); | ||
| } | ||
| #endif /* BUILD_WAYLAND */ |
There was a problem hiding this comment.
The functions are pretty straightforward to write, take up less space, and it's much more clear what's going on.
| void do_register_display_output(const std::string &name, | ||
| display_output_base *output) { | ||
| struct display_output_constructor { | ||
| display_output_constructor() { display_outputs = new display_outputs_t(); } | ||
| ~display_output_constructor() { | ||
| delete display_outputs; | ||
| display_outputs = nullptr; | ||
| } | ||
| }; | ||
| static display_output_constructor constructor; | ||
|
|
||
| bool inserted = display_outputs->insert({name, output}).second; | ||
| if (!inserted) { | ||
| throw std::logic_error("Display output with name '" + name + | ||
| "' already registered"); | ||
| } | ||
| } |
There was a problem hiding this comment.
Plus we don't need to handle possible out of order initialization of the static output list, nor possibility of double insertion because it's all handled in a single place.
| extern void init_console_output(); | ||
| extern void init_ncurses_output(); | ||
| extern void init_file_output(); | ||
| extern void init_http_output(); | ||
| extern void init_x11_output(); | ||
| extern void init_wayland_output(); |
There was a problem hiding this comment.
And this gets replaced by explicit template specialization, which is a well supported language mechanism.
Fix missing Colour construct alpha argument. Add Makefile ignore to 3rdparty/toluapp Signed-off-by: Tin Švagelj <tin.svagelj@live.com>
|
Good to see labeler changes working 😆 Moved color parsing into a stacked PR: #1848
|
Signed-off-by: Tin Švagelj <tin.svagelj@live.com>
|
Moved alignment changes into #1849. |
Display files are now no longer compiled if their features are disabled Signed-off-by: Tin Švagelj <tin.svagelj@live.com>
This reaches 0% unneeded X11 polution in the sources. Signed-off-by: Tin Švagelj <tin.svagelj@live.com>
550f276 to
9a2ec7a
Compare
Added documentation for it. Signed-off-by: Tin Švagelj <tin.svagelj@live.com>
9a2ec7a to
c69dcaf
Compare
brndnmtthws
left a comment
There was a problem hiding this comment.
There's a lot in this PR, but overall I like it :)
Thank you. I'll maybe tweak it a tiny bit more before merging (some added checks aren't needed). I wanted to change those things (like enums) all at once so it's just a single merge for others. |
|
There's a linking error with a specific build flag configuration, holding this off until I resolve it. Maybe it was there before, maybe it wasn't. EDIT: Only locally apparently, I wasn't able to get Imlib2.so to link for some reason. Works on CI. |
Signed-off-by: Tin Švagelj <tin.svagelj@live.com>
46767e8 to
cba15e6
Compare
Hide lua state from conky-imlib2.cc Signed-off-by: Tin Švagelj <tin.svagelj@live.com>
cba15e6 to
8e07629
Compare
Signed-off-by: Tin Švagelj <tin.svagelj@live.com>

Changes
Flags
BUILD_MOUSE_EVENTSdependency fromOWN_WINDOWtoBUILD_X11.BUILD_XINPUTdependency onBUILD_MOUSE_EVENTS(nowBUILD_X11directly).Refactor
disabled_display_outputclasses with log messages.special_ttospecial_nodeandspecial_typetotext_node_t.#undefforHANDLE_EVmacro at the end of the function.axis_alignfor single axis alignment matching.Mouse event fixes/improvements
XI_Motionwhich means that building withoutBUILD_MOUSE_EVENTSproduces a more performant binary (due to not tracking global (root) mouse movements)Documentation
Related issues
OWN_WINDOWdoesn't compilecolour.ccmake it a lot easier to string (huehue) on new color parsersTesting
Remaining work
includeimprovement using visualization