From 2322493ac8f8bb09950cdafe53eecce9d551410f Mon Sep 17 00:00:00 2001 From: Nicholas-Baron Date: Tue, 1 Mar 2022 16:05:05 -0800 Subject: [PATCH 01/10] Fix a Clang 13 warning `-Wdeprecated-copy` found this copy-assignment operator, which it complains about. Since it is just `= default`, we should be able to remove both it and the default constructor, making the struct just its data members. --- CHANGELOG.md | 2 ++ include/x11/tray_manager.hpp | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f17d1b90..42e9920f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Build +- Compiler warning in clang-13 ([`#2613`](https://github.com/polybar/polybar/pull/2613)) ## [3.6.0] - 2022-03-01 ### Breaking diff --git a/include/x11/tray_manager.hpp b/include/x11/tray_manager.hpp index 06370b9b..2a388f91 100644 --- a/include/x11/tray_manager.hpp +++ b/include/x11/tray_manager.hpp @@ -40,9 +40,6 @@ class background_manager; class bg_slice; struct tray_settings { - tray_settings() = default; - tray_settings& operator=(const tray_settings& o) = default; - alignment align{alignment::NONE}; bool running{false}; int rel_x{0}; From 4350e356a7a285a302e2e589774dbad7cfb4af5b Mon Sep 17 00:00:00 2001 From: patrick96 Date: Wed, 2 Mar 2022 14:36:54 +0100 Subject: [PATCH 02/10] Documentation update for 3.6 --- README.md | 36 ++++-------------------------------- cmake/01-core.cmake | 2 +- cmake/05-summary.cmake | 2 +- doc/man/polybar.1.rst | 2 +- 4 files changed, 7 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index fa2614d7..2695b618 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ A fast and easy-to-use tool for creating status bars. **Polybar** aims to help users build beautiful and highly customizable status bars for their desktop environment, without the need of having a black belt in shell scripting. -![sample screenshot](doc/_static/default.png) +![default configuration screenshot](doc/_static/default.png) ## Table of Contents @@ -33,8 +33,7 @@ for their desktop environment, without the need of having a black belt in shell * [Contributing](#contributing) * [Getting started](#getting-started) * [Installation](#installation) - * [Configuration](#configuration) - * [Running](#running) + * [First Steps](#first-steps) * [Community](#community) * [Contributors](#contributors) * [Donations](#donations) @@ -128,35 +127,8 @@ If you are using **Fedora**, you can install [polybar](https://src.fedoraproject If you can't find your distro here, you will have to [build from source](https://github.com/polybar/polybar/wiki/Compiling). -### Configuration - -Details on how to setup and configure the bar and each module have been moved to [the wiki](https://github.com/polybar/polybar/wiki/Configuration). - -#### Install the example configuration - -For a normal installation, polybar will install the example config to -`/usr/share/doc/polybar/config` or ` /usr/local/share/doc/polybar/config` -(depending on your install parameters) - -From there you can copy it to `~/.config/polybar/config` to get started (make -sure to backup any existing config file there). - -**Note:** This example file is meant to showcase available modules and -configuration options. -Running it as-is will work but many modules will likely not start because they -require machine-specific configuration and many of the font icons will not show -up because they require a very specific [font -configuration](https://github.com/polybar/polybar/wiki/Fonts). -We encourage you to use it as a reference when building -your own configuration. - -#### Launch the example bar -~~~ sh -$ polybar example -~~~ - -### Running -[See the wiki for details on how to run polybar](https://github.com/polybar/polybar/wiki). +### First Steps +[See the wiki for details on how to run and configure polybar](https://github.com/polybar/polybar/wiki). ## Community Want to get in touch? diff --git a/cmake/01-core.cmake b/cmake/01-core.cmake index 7f8d55ef..e490e831 100644 --- a/cmake/01-core.cmake +++ b/cmake/01-core.cmake @@ -15,7 +15,7 @@ option(BUILD_POLYBAR "Build the main polybar executable" ${DEFAULT_ON}) option(BUILD_POLYBAR_MSG "Build polybar-msg" ${DEFAULT_ON}) option(BUILD_TESTS "Build testsuite" OFF) option(BUILD_DOC "Build documentation" ${DEFAULT_ON}) -option(BUILD_CONFIG "Generate sample configuration" ${DEFAULT_ON}) +option(BUILD_CONFIG "Generate default configuration" ${DEFAULT_ON}) option(BUILD_SHELL "Generate shell completion files" ${DEFAULT_ON}) include(CMakeDependentOption) diff --git a/cmake/05-summary.cmake b/cmake/05-summary.cmake index c15f3674..5f71936f 100644 --- a/cmake/05-summary.cmake +++ b/cmake/05-summary.cmake @@ -26,7 +26,7 @@ colored_option(" testsuite" BUILD_TESTS) colored_option(" documentation" BUILD_DOC) colored_option(" html" BUILD_DOC_HTML) colored_option(" man" BUILD_DOC_MAN) -colored_option(" sample config" BUILD_CONFIG) +colored_option(" default config" BUILD_CONFIG) colored_option(" shell files" BUILD_SHELL) if (BUILD_LIBPOLY) diff --git a/doc/man/polybar.1.rst b/doc/man/polybar.1.rst index 6df7eeba..7f9bacd5 100644 --- a/doc/man/polybar.1.rst +++ b/doc/man/polybar.1.rst @@ -8,7 +8,7 @@ SYNOPSIS DESCRIPTION ----------- Polybar aims to help users build beautiful and highly customizable status bars for their desktop environment, without the need of having a black belt in shell scripting. -If the *BAR* argument is not provided and the configuration file only contains one bar definition, Polybar will display this bar. +If the *BAR* argument is not provided and the configuration file only contains one bar definition, polybar will display this bar. OPTIONS ------- From 24e079afef2d7d515079721d93df4bb39c6e80bd Mon Sep 17 00:00:00 2001 From: patrick96 Date: Wed, 2 Mar 2022 14:58:47 +0100 Subject: [PATCH 03/10] build: Add missing includes Fixes #2614 Ref: https://gcc.gnu.org/gcc-12/porting_to.html --- CHANGELOG.md | 3 ++- include/cairo/context.hpp | 19 ++++++++++++------- include/ipc/msg.hpp | 2 ++ include/modules/date.hpp | 3 ++- include/modules/fs.hpp | 4 +--- include/modules/github.hpp | 4 +++- src/adapters/net_nl.cpp | 11 ++++++----- src/modules/fs.cpp | 3 ++- 8 files changed, 30 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42e9920f..c51311fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Build -- Compiler warning in clang-13 ([`#2613`](https://github.com/polybar/polybar/pull/2613)) +- Fixed compiler warning in Clang 13 ([`#2613`](https://github.com/polybar/polybar/pull/2613)) +- Fixed compiler error in GCC 12 ([`#2616`](https://github.com/polybar/polybar/pull/2616), [`#2614`](https://github.com/polybar/polybar/issues/2614)) ## [3.6.0] - 2022-03-01 ### Breaking diff --git a/include/cairo/context.hpp b/include/cairo/context.hpp index a937cd72..f0be75bc 100644 --- a/include/cairo/context.hpp +++ b/include/cairo/context.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include "cairo/font.hpp" #include "cairo/surface.hpp" @@ -117,9 +118,12 @@ namespace cairo { context& operator<<(const rounded_corners& c) { cairo_new_sub_path(m_c); - cairo_arc(m_c, c.x + c.w - c.radius.top_right, c.y + c.radius.top_right, c.radius.top_right, -90 * degree, 0 * degree); - cairo_arc(m_c, c.x + c.w - c.radius.bottom_right, c.y + c.h - c.radius.bottom_right, c.radius.bottom_right, 0 * degree, 90 * degree); - cairo_arc(m_c, c.x + c.radius.bottom_left, c.y + c.h - c.radius.bottom_left, c.radius.bottom_left, 90 * degree, 180 * degree); + cairo_arc( + m_c, c.x + c.w - c.radius.top_right, c.y + c.radius.top_right, c.radius.top_right, -90 * degree, 0 * degree); + cairo_arc(m_c, c.x + c.w - c.radius.bottom_right, c.y + c.h - c.radius.bottom_right, c.radius.bottom_right, + 0 * degree, 90 * degree); + cairo_arc(m_c, c.x + c.radius.bottom_left, c.y + c.h - c.radius.bottom_left, c.radius.bottom_left, 90 * degree, + 180 * degree); cairo_arc(m_c, c.x + c.radius.top_left, c.y + c.radius.top_left, c.radius.top_left, 180 * degree, 270 * degree); cairo_close_path(m_c); return *this; @@ -142,7 +146,8 @@ namespace cairo { cairo_rel_line_to(m_c, 0, segment.w); break; } - cairo_arc_negative(m_c, segment.x, segment.y, segment.radius - segment.w, segment.angle_to * degree, segment.angle_from * degree); + cairo_arc_negative(m_c, segment.x, segment.y, segment.radius - segment.w, segment.angle_to * degree, + segment.angle_from * degree); cairo_close_path(m_c); return *this; } @@ -360,9 +365,9 @@ namespace cairo { std::deque> m_points; int m_activegroups{0}; - private: - const double degree = M_PI / 180.0; + private: + const double degree = M_PI / 180.0; }; -} // namespace cairo +} // namespace cairo POLYBAR_NS_END diff --git a/include/ipc/msg.hpp b/include/ipc/msg.hpp index 9cc9b508..1b37022d 100644 --- a/include/ipc/msg.hpp +++ b/include/ipc/msg.hpp @@ -2,6 +2,8 @@ #include "common.hpp" +#include + POLYBAR_NS /** diff --git a/include/modules/date.hpp b/include/modules/date.hpp index ee5c5a79..296ec276 100644 --- a/include/modules/date.hpp +++ b/include/modules/date.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -44,6 +45,6 @@ namespace modules { std::atomic m_toggled{false}; }; -} // namespace modules +} // namespace modules POLYBAR_NS_END diff --git a/include/modules/fs.hpp b/include/modules/fs.hpp index 2de51340..c67663ce 100644 --- a/include/modules/fs.hpp +++ b/include/modules/fs.hpp @@ -1,7 +1,5 @@ #pragma once -#include - #include "components/config.hpp" #include "modules/meta/timer_module.hpp" #include "settings.hpp" @@ -74,6 +72,6 @@ namespace modules { // used while formatting output size_t m_index{0_z}; }; -} // namespace modules +} // namespace modules POLYBAR_NS_END diff --git a/include/modules/github.hpp b/include/modules/github.hpp index a45701f5..bb70bf8c 100644 --- a/include/modules/github.hpp +++ b/include/modules/github.hpp @@ -1,5 +1,7 @@ #pragma once +#include + #include "modules/meta/timer_module.hpp" #include "settings.hpp" #include "utils/http.hpp" @@ -37,6 +39,6 @@ namespace modules { bool m_empty_notifications{false}; std::atomic m_offline{false}; }; -} // namespace modules +} // namespace modules POLYBAR_NS_END diff --git a/src/adapters/net_nl.cpp b/src/adapters/net_nl.cpp index 0a72601a..b62f45bc 100644 --- a/src/adapters/net_nl.cpp +++ b/src/adapters/net_nl.cpp @@ -1,9 +1,10 @@ -#include "adapters/net.hpp" - #include #include #include +#include + +#include "adapters/net.hpp" #include "utils/file.hpp" POLYBAR_NS @@ -166,8 +167,8 @@ namespace net { m_essid.clear(); if (bss[NL80211_BSS_INFORMATION_ELEMENTS] != nullptr) { - // Information Element ID from ieee80211.h - #define WLAN_EID_SSID 0 +// Information Element ID from ieee80211.h +#define WLAN_EID_SSID 0 auto ies = static_cast(nla_data(bss[NL80211_BSS_INFORMATION_ELEMENTS])); auto ies_len = nla_len(bss[NL80211_BSS_INFORMATION_ELEMENTS]); @@ -226,6 +227,6 @@ namespace net { m_signalstrength.max = hardware_max - hardware_min; } } -} // namespace net +} // namespace net POLYBAR_NS_END diff --git a/src/modules/fs.cpp b/src/modules/fs.cpp index d792bd72..e13ef443 100644 --- a/src/modules/fs.cpp +++ b/src/modules/fs.cpp @@ -3,6 +3,7 @@ #include #include +#include #include "drawtypes/label.hpp" #include "drawtypes/progressbar.hpp" @@ -206,6 +207,6 @@ namespace modules { return true; } -} // namespace modules +} // namespace modules POLYBAR_NS_END From 40cbe7ed97b541b60547a6d80b04c9121837e01d Mon Sep 17 00:00:00 2001 From: Samuel Henrique Date: Tue, 1 Mar 2022 22:08:32 +0000 Subject: [PATCH 04/10] Skip manpage and html doc installation if they weren't generated Otherwise we get errors like this: CMake Error at doc/cmake_install.cmake:46 (file): file INSTALL cannot find "/<>/build/doc/html": No such file or directory. Call Stack (most recent call first): cmake_install.cmake:59 (include) --- CHANGELOG.md | 1 + doc/CMakeLists.txt | 13 +++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c51311fd..52a614ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Build - Fixed compiler warning in Clang 13 ([`#2613`](https://github.com/polybar/polybar/pull/2613)) - Fixed compiler error in GCC 12 ([`#2616`](https://github.com/polybar/polybar/pull/2616), [`#2614`](https://github.com/polybar/polybar/issues/2614)) +- Fixed installation of docs when some are not generated (man, html...) ([`#2612`](https://github.com/polybar/polybar/pull/2612) ## [3.6.0] - 2022-03-01 ### Breaking diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 27d86b6d..abecc6bf 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -49,10 +49,12 @@ endforeach() # Dummy target that depends on all documentation targets add_custom_target(doc ALL DEPENDS ${doc_targets}) -install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/ +if (BUILD_DOC_HTML) + install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/ DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT doc PATTERN ".buildinfo" EXCLUDE) +endif() install(FILES ${CMAKE_SOURCE_DIR}/CHANGELOG.md DESTINATION ${CMAKE_INSTALL_DOCDIR} @@ -62,14 +64,17 @@ install(FILES ${CMAKE_CURRENT_LIST_DIR}/config.ini DESTINATION ${CMAKE_INSTALL_DOCDIR}/examples COMPONENT doc) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/man/polybar.1 +if (BUILD_DOC_MAN) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/man/polybar.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT doc) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/man/polybar-msg.1 + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/man/polybar-msg.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT doc) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/man/polybar.5 + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/man/polybar.5 DESTINATION ${CMAKE_INSTALL_MANDIR}/man5 COMPONENT doc) +endif() + From a82e4324f6ba9430f13a07f9819cd58e75ca9932 Mon Sep 17 00:00:00 2001 From: patrick96 Date: Thu, 3 Mar 2022 15:18:27 +0100 Subject: [PATCH 05/10] fix(build): Do not replace CMAKE_EXE_LINKER_FLAGS CMAKE_EXE_LINKER_FLAGS contains, among other things, the LDFLAGS which many distros use to universally apply linker flags. When completely replacing CMAKE_EXE_LINKER_FLAGS, these flags are lost. --- CHANGELOG.md | 3 ++- cmake/cxx.cmake | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52a614ae..1cfb3324 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Build - Fixed compiler warning in Clang 13 ([`#2613`](https://github.com/polybar/polybar/pull/2613)) - Fixed compiler error in GCC 12 ([`#2616`](https://github.com/polybar/polybar/pull/2616), [`#2614`](https://github.com/polybar/polybar/issues/2614)) -- Fixed installation of docs when some are not generated (man, html...) ([`#2612`](https://github.com/polybar/polybar/pull/2612) +- Fixed installation of docs when some are not generated (man, html...) ([`#2612`](https://github.com/polybar/polybar/pull/2612)) +- Fix `LDFLAGS` not being respected ([`#2619`](https://github.com/polybar/polybar/pull/2619)) ## [3.6.0] - 2022-03-01 ### Breaking diff --git a/cmake/cxx.cmake b/cmake/cxx.cmake index fa6776af..ecc0194f 100644 --- a/cmake/cxx.cmake +++ b/cmake/cxx.cmake @@ -108,4 +108,4 @@ string(REPLACE ";" " " cxx_flags_str "${cxx_flags}") string(REPLACE ";" " " cxx_linker_flags_str "${cxx_linker_flags}") # TODO use target_link_options once min cmake version is >= 3.13 -set(CMAKE_EXE_LINKER_FLAGS "${cxx_linker_flags_str}") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${cxx_linker_flags_str}") From 0b240803361758b6383c2605e54b6d556813c494 Mon Sep 17 00:00:00 2001 From: patrick96 Date: Thu, 3 Mar 2022 22:19:37 +0100 Subject: [PATCH 06/10] fix: Allow negative values for tray and bar offset --- CHANGELOG.md | 3 +++ include/utils/units.hpp | 3 ++- src/components/bar.cpp | 18 ++++++++++-------- src/utils/units.cpp | 9 ++++++--- tests/unit_tests/utils/units.cpp | 29 ++++++++--------------------- 5 files changed, 29 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cfb3324..69509043 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed installation of docs when some are not generated (man, html...) ([`#2612`](https://github.com/polybar/polybar/pull/2612)) - Fix `LDFLAGS` not being respected ([`#2619`](https://github.com/polybar/polybar/pull/2619)) +### Fixed +- `tray-offset-x`, `tray-offset-y`, `offset-x`, and `offset-y` were mistakenly capped below at 0 ([`#2620`](https://github.com/polybar/polybar/pull/2620)) + ## [3.6.0] - 2022-03-01 ### Breaking - We added the backslash escape character (\\) for configuration values. This means that the literal backslash character now has special meaning in configuration files, therefore if you want to use it in a value as a literal backslash, you need to escape it with the backslash escape character. The parser logs an error if any unescaped backslashes are found in a value. This affects you only if you are using two consecutive backslashes in a config value, which will now be interpreted as a single literal backslash. ([`#2354`](https://github.com/polybar/polybar/issues/2354)) diff --git a/include/utils/units.hpp b/include/utils/units.hpp index 9066ed42..9e2ee414 100644 --- a/include/utils/units.hpp +++ b/include/utils/units.hpp @@ -21,7 +21,8 @@ namespace units_utils { string extent_to_string(extent_val extent); - unsigned percentage_with_offset_to_pixel(percentage_with_offset g_format, double max, double dpi); + int percentage_with_offset_to_pixel(percentage_with_offset g_format, double max, double dpi); + unsigned percentage_with_offset_to_pixel_nonnegative(percentage_with_offset g_format, double max, double dpi); spacing_type parse_spacing_unit(const string& str); spacing_val parse_spacing(const string& str); diff --git a/src/components/bar.cpp b/src/components/bar.cpp index 72716579..b1f63bb4 100644 --- a/src/components/bar.cpp +++ b/src/components/bar.cpp @@ -221,8 +221,10 @@ bar::bar(connection& conn, signal_emitter& emitter, const config& config, const // Load values used to adjust the struts atom auto margin_top = m_conf.get("global/wm", "margin-top", percentage_with_offset{}); auto margin_bottom = m_conf.get("global/wm", "margin-bottom", percentage_with_offset{}); - m_opts.strut.top = units_utils::percentage_with_offset_to_pixel(margin_top, m_opts.monitor->h, m_opts.dpi_y); - m_opts.strut.bottom = units_utils::percentage_with_offset_to_pixel(margin_bottom, m_opts.monitor->h, m_opts.dpi_y); + m_opts.strut.top = + units_utils::percentage_with_offset_to_pixel_nonnegative(margin_top, m_opts.monitor->h, m_opts.dpi_y); + m_opts.strut.bottom = + units_utils::percentage_with_offset_to_pixel_nonnegative(margin_bottom, m_opts.monitor->h, m_opts.dpi_y); // Load commands used for fallback click handlers vector actions; @@ -295,19 +297,19 @@ bar::bar(connection& conn, signal_emitter& emitter, const config& config, const m_opts.borders.emplace(edge::TOP, border_settings{}); m_opts.borders[edge::TOP].size = - units_utils::percentage_with_offset_to_pixel(border_top, m_opts.monitor->h, m_opts.dpi_y); + units_utils::percentage_with_offset_to_pixel_nonnegative(border_top, m_opts.monitor->h, m_opts.dpi_y); m_opts.borders[edge::TOP].color = parse_or_throw_color("border-top-color", border_color); m_opts.borders.emplace(edge::BOTTOM, border_settings{}); m_opts.borders[edge::BOTTOM].size = - units_utils::percentage_with_offset_to_pixel(border_bottom, m_opts.monitor->h, m_opts.dpi_y); + units_utils::percentage_with_offset_to_pixel_nonnegative(border_bottom, m_opts.monitor->h, m_opts.dpi_y); m_opts.borders[edge::BOTTOM].color = parse_or_throw_color("border-bottom-color", border_color); m_opts.borders.emplace(edge::LEFT, border_settings{}); m_opts.borders[edge::LEFT].size = - units_utils::percentage_with_offset_to_pixel(border_left, m_opts.monitor->w, m_opts.dpi_x); + units_utils::percentage_with_offset_to_pixel_nonnegative(border_left, m_opts.monitor->w, m_opts.dpi_x); m_opts.borders[edge::LEFT].color = parse_or_throw_color("border-left-color", border_color); m_opts.borders.emplace(edge::RIGHT, border_settings{}); m_opts.borders[edge::RIGHT].size = - units_utils::percentage_with_offset_to_pixel(border_right, m_opts.monitor->w, m_opts.dpi_x); + units_utils::percentage_with_offset_to_pixel_nonnegative(border_right, m_opts.monitor->w, m_opts.dpi_x); m_opts.borders[edge::RIGHT].color = parse_or_throw_color("border-right-color", border_color); // Load geometry values @@ -316,8 +318,8 @@ bar::bar(connection& conn, signal_emitter& emitter, const config& config, const auto offsetx = m_conf.get(m_conf.section(), "offset-x", percentage_with_offset{}); auto offsety = m_conf.get(m_conf.section(), "offset-y", percentage_with_offset{}); - m_opts.size.w = units_utils::percentage_with_offset_to_pixel(w, m_opts.monitor->w, m_opts.dpi_x); - m_opts.size.h = units_utils::percentage_with_offset_to_pixel(h, m_opts.monitor->h, m_opts.dpi_y); + m_opts.size.w = units_utils::percentage_with_offset_to_pixel_nonnegative(w, m_opts.monitor->w, m_opts.dpi_x); + m_opts.size.h = units_utils::percentage_with_offset_to_pixel_nonnegative(h, m_opts.monitor->h, m_opts.dpi_y); m_opts.offset.x = units_utils::percentage_with_offset_to_pixel(offsetx, m_opts.monitor->w, m_opts.dpi_x); m_opts.offset.y = units_utils::percentage_with_offset_to_pixel(offsety, m_opts.monitor->h, m_opts.dpi_y); diff --git a/src/utils/units.cpp b/src/utils/units.cpp index 5bb201cd..5030be8a 100644 --- a/src/utils/units.cpp +++ b/src/utils/units.cpp @@ -39,11 +39,14 @@ namespace units_utils { /** * Converts a percentage with offset into pixels */ - unsigned int percentage_with_offset_to_pixel(percentage_with_offset g_format, double max, double dpi) { + int percentage_with_offset_to_pixel(percentage_with_offset g_format, double max, double dpi) { int offset_pixel = extent_to_pixel(g_format.offset, dpi); - return static_cast( - std::max(0, math_util::percentage_to_value(g_format.percentage, max) + offset_pixel)); + return static_cast(math_util::percentage_to_value(g_format.percentage, max) + offset_pixel); + } + + unsigned percentage_with_offset_to_pixel_nonnegative(percentage_with_offset g_format, double max, double dpi) { + return std::max(0, percentage_with_offset_to_pixel(g_format, max, dpi)); } extent_type parse_extent_unit(const string& str) { diff --git a/tests/unit_tests/utils/units.cpp b/tests/unit_tests/utils/units.cpp index d2aec33b..814546be 100644 --- a/tests/unit_tests/utils/units.cpp +++ b/tests/unit_tests/utils/units.cpp @@ -6,7 +6,6 @@ using namespace polybar; using namespace units_utils; - namespace polybar { bool operator==(const extent_val lhs, const extent_val rhs) { return lhs.type == rhs.type && lhs.value == rhs.value; @@ -24,9 +23,9 @@ namespace polybar { * value represents the format string. The max value is always 1000 and dpi is always 96 */ class GeomFormatToPixelsTest : public ::testing::Test, - public ::testing::WithParamInterface> {}; + public ::testing::WithParamInterface> {}; -vector> to_pixels_no_offset_list = { +vector> to_pixels_no_offset_list = { {1000, percentage_with_offset{100.}}, {0, percentage_with_offset{0.}}, {1000, percentage_with_offset{150.}}, @@ -36,34 +35,33 @@ vector> to_pixels_no_offset_list = { {1, percentage_with_offset{0., extent_val{extent_type::PIXEL, 1}}}, }; -vector> to_pixels_with_offset_list = { +vector> to_pixels_with_pixels_list = { {1000, percentage_with_offset{100., ZERO_PX_EXTENT}}, {1010, percentage_with_offset{100., extent_val{extent_type::PIXEL, 10}}}, {990, percentage_with_offset{100., extent_val{extent_type::PIXEL, -10}}}, {10, percentage_with_offset{0., extent_val{extent_type::PIXEL, 10}}}, {1000, percentage_with_offset{99., extent_val{extent_type::PIXEL, 10}}}, - {0, percentage_with_offset{1., extent_val{extent_type::PIXEL, -100}}}, + {-90, percentage_with_offset{1., extent_val{extent_type::PIXEL, -100}}}, }; -vector> to_pixels_with_units_list = { +vector> to_pixels_with_points_list = { {1013, percentage_with_offset{100., extent_val{extent_type::POINT, 10}}}, {987, percentage_with_offset{100., extent_val{extent_type::POINT, -10}}}, {1003, percentage_with_offset{99., extent_val{extent_type::POINT, 10}}}, {13, percentage_with_offset{0., extent_val{extent_type::POINT, 10}}}, - {0, percentage_with_offset{0, extent_val{extent_type::POINT, -10}}}, }; INSTANTIATE_TEST_SUITE_P(NoOffset, GeomFormatToPixelsTest, ::testing::ValuesIn(to_pixels_no_offset_list)); -INSTANTIATE_TEST_SUITE_P(WithOffset, GeomFormatToPixelsTest, ::testing::ValuesIn(to_pixels_with_offset_list)); +INSTANTIATE_TEST_SUITE_P(WithPixels, GeomFormatToPixelsTest, ::testing::ValuesIn(to_pixels_with_pixels_list)); -INSTANTIATE_TEST_SUITE_P(WithUnits, GeomFormatToPixelsTest, ::testing::ValuesIn(to_pixels_with_units_list)); +INSTANTIATE_TEST_SUITE_P(WithPoints, GeomFormatToPixelsTest, ::testing::ValuesIn(to_pixels_with_points_list)); static constexpr int MAX_WIDTH = 1000; static constexpr int DPI = 96; TEST_P(GeomFormatToPixelsTest, correctness) { - unsigned exp = GetParam().first; + int exp = GetParam().first; percentage_with_offset geometry = GetParam().second; EXPECT_DOUBLE_EQ(exp, percentage_with_offset_to_pixel(geometry, MAX_WIDTH, DPI)); } @@ -83,17 +81,6 @@ TEST(UnitsUtils, extent_to_pixel) { EXPECT_EQ(0, extent_to_pixel_nonnegative({extent_type::POINT, -36}, 96)); } -TEST(UnitsUtils, percentage_with_offset_to_pixel) { - EXPECT_EQ(1100, percentage_with_offset_to_pixel({100, {extent_type::PIXEL, 100}}, 1000, 0)); - EXPECT_EQ(1048, percentage_with_offset_to_pixel({100, {extent_type::POINT, 36}}, 1000, 96)); - - EXPECT_EQ(900, percentage_with_offset_to_pixel({100, {extent_type::PIXEL, -100}}, 1000, 0)); - EXPECT_EQ(952, percentage_with_offset_to_pixel({100, {extent_type::POINT, -36}}, 1000, 96)); - - EXPECT_EQ(0, percentage_with_offset_to_pixel({0, {extent_type::PIXEL, -100}}, 1000, 0)); - EXPECT_EQ(100, percentage_with_offset_to_pixel({0, {extent_type::PIXEL, 100}}, 1000, 0)); -} - TEST(UnitsUtils, parse_extent_unit) { EXPECT_EQ(extent_type::PIXEL, parse_extent_unit("px")); EXPECT_EQ(extent_type::POINT, parse_extent_unit("pt")); From c655adea9348bcf522cc80841af5a83d575b8f8d Mon Sep 17 00:00:00 2001 From: patrick96 Date: Thu, 3 Mar 2022 23:38:51 +0100 Subject: [PATCH 07/10] fix(script): Prevent stalling during shutdown If a script module is waiting on a non-tailed script to finish, polybar cannot shut down until the script has terminted. To remedy this, we use the same polling loop as for tailed scripts which checks if it needs to terminate after every iteration. --- CHANGELOG.md | 1 + src/adapters/script_runner.cpp | 25 ++++++++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 69509043..78bdc073 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - `tray-offset-x`, `tray-offset-y`, `offset-x`, and `offset-y` were mistakenly capped below at 0 ([`#2620`](https://github.com/polybar/polybar/pull/2620)) +- `custom/script`: Polybar shutdown being stalled by hanging script ([`#2621`](https://github.com/polybar/polybar/pull/2621)) ## [3.6.0] - 2022-03-01 ### Breaking diff --git a/src/adapters/script_runner.cpp b/src/adapters/script_runner.cpp index ac8dd041..ce8fef73 100644 --- a/src/adapters/script_runner.cpp +++ b/src/adapters/script_runner.cpp @@ -96,16 +96,35 @@ script_runner::interval script_runner::run() { auto cmd = command_util::make_command(exec); try { - cmd->exec(true, m_env); + cmd->exec(false, m_env); } catch (const exception& err) { m_log.err("script_runner: %s", err.what()); throw modules::module_error("Failed to execute command, stopping module..."); } - m_exit_status = cmd->get_exit_status(); int fd = cmd->get_stdout(PIPE_READ); assert(fd != -1); - bool changed = io_util::poll_read(fd) && set_output(cmd->readline()); + + bool changed = false; + + bool got_output = false; + while (!m_stopping && cmd->is_running() && !io_util::poll(fd, POLLHUP, 0)) { + /** + * For non-tailed scripts, we only use the first line. However, to ensure interruptability when the module shuts + * down, we still need to continue polling. + */ + if (io_util::poll_read(fd, 25) && !got_output) { + changed = set_output(cmd->readline()); + got_output = true; + } + } + + if (m_stopping) { + cmd->terminate(); + return 0s; + } + + m_exit_status = cmd->wait(); if (!changed && m_exit_status != 0) { clear_output(); From 8820cc73cd6f9ee72ea2d65edd91535c6d43800e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nathana=C3=ABl=20Houn?= Date: Sat, 5 Mar 2022 07:16:57 +0100 Subject: [PATCH 08/10] Fix hint message when using deprecated polybar-msg hook --- CHANGELOG.md | 1 + src/polybar-msg.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78bdc073..f9a8b1ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - `tray-offset-x`, `tray-offset-y`, `offset-x`, and `offset-y` were mistakenly capped below at 0 ([`#2620`](https://github.com/polybar/polybar/pull/2620)) - `custom/script`: Polybar shutdown being stalled by hanging script ([`#2621`](https://github.com/polybar/polybar/pull/2621)) +- `polybar-msg`: Wrong hint when using deprecated `hook` ([`#2624`](https://github.com/polybar/polybar/pull/2624)) ## [3.6.0] - 2022-03-01 ### Breaking diff --git a/src/polybar-msg.cpp b/src/polybar-msg.cpp index 44dd22b9..f1a9c127 100644 --- a/src/polybar-msg.cpp +++ b/src/polybar-msg.cpp @@ -141,7 +141,7 @@ static std::pair parse_message(deque args) { fprintf(stderr, "Warning: Using IPC hook commands is deprecated, use the hook action on the ipc module: %s %s \"%s\"\n", exec, - ipc_type.c_str(), ipc_payload.c_str()); + "action", ipc_payload.c_str()); } } From b04f636babf61919d0ecd040d34a9de27cd8db8b Mon Sep 17 00:00:00 2001 From: patrick96 Date: Sat, 5 Mar 2022 13:38:13 +0100 Subject: [PATCH 09/10] doc: Mention XDG_RUNTIME_DIR for IPC --- doc/user/ipc.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/doc/user/ipc.rst b/doc/user/ipc.rst index b278ce36..9b1219bd 100644 --- a/doc/user/ipc.rst +++ b/doc/user/ipc.rst @@ -40,6 +40,19 @@ enabled. .. note:: IPC messages are only sent to polybar instances running under the same user as ``polybar-msg`` is running as. + Concretely, ``polybar`` and ``polybar-msg`` use the + ``$XDG_RUNTIME_DIR`` environment variable in accordance with the `XDG + Base Directory Specification`_ to determine where to find the socket + to communicate. + + If ``polybar`` and ``polybar-msg`` don't have the same value for + ``$XDG_RUNTIME_DIR``, they will likely not be able to communicate. + The variable may not be set if you use ``su`` or ``sudo`` to execute + ``polybar-msg`` as a different user, often a full user session is + required. + + .. _XDG Base Directory Specification: https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html + The ```` argument is either :ref:`action ` or :ref:`cmd `. The allowed values for ```` depend on the type. From 4a61d3157f470270a5d98e5d3b1778c11894d65f Mon Sep 17 00:00:00 2001 From: patrick96 Date: Sat, 5 Mar 2022 14:21:35 +0100 Subject: [PATCH 10/10] Release 3.6.1 --- CHANGELOG.md | 5 ++++- version.txt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9a8b1ed..b2dfc20e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] + +## [3.6.1] - 2022-03-05 ### Build - Fixed compiler warning in Clang 13 ([`#2613`](https://github.com/polybar/polybar/pull/2613)) - Fixed compiler error in GCC 12 ([`#2616`](https://github.com/polybar/polybar/pull/2616), [`#2614`](https://github.com/polybar/polybar/issues/2614)) @@ -161,7 +163,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Empty color values are no longer treated as invalid and no longer produce an error. -[Unreleased]: https://github.com/polybar/polybar/compare/3.6.0...HEAD +[Unreleased]: https://github.com/polybar/polybar/compare/3.6.1...HEAD +[3.6.1]: https://github.com/polybar/polybar/releases/tag/3.6.1 [3.6.0]: https://github.com/polybar/polybar/releases/tag/3.6.0 [3.5.7]: https://github.com/polybar/polybar/releases/tag/3.5.7 [3.5.6]: https://github.com/polybar/polybar/releases/tag/3.5.6 diff --git a/version.txt b/version.txt index cbddfc9f..cdba9da6 100644 --- a/version.txt +++ b/version.txt @@ -1,4 +1,4 @@ # Polybar version information # Update this on every release # This is used to create the version string if a git repo is not available -3.6.0 +3.6.1