Merge remote-tracking branch 'origin/hotfix/3.6.3'
This commit is contained in:
commit
7a1824a9b9
13
CHANGELOG.md
13
CHANGELOG.md
@ -28,6 +28,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
### Fixed
|
### Fixed
|
||||||
- Waiting for double click interval on modules that don't have a double click action ([`#2663`](https://github.com/polybar/polybar/issues/2663), [`#2695`](https://github.com/polybar/polybar/pull/2695))
|
- Waiting for double click interval on modules that don't have a double click action ([`#2663`](https://github.com/polybar/polybar/issues/2663), [`#2695`](https://github.com/polybar/polybar/pull/2695))
|
||||||
|
|
||||||
|
## [3.6.3] - 2022-05-04
|
||||||
|
### Fixed
|
||||||
|
- `custom/script`: Output clearing when `exec-if` fails ([`#2674`](https://github.com/polybar/polybar/issues/2674))
|
||||||
|
- `internal/battery`: `poll-interval` not working ([`#2649`](https://github.com/polybar/polybar/issues/2649), [`#2677`](https://github.com/polybar/polybar/pull/2677))
|
||||||
|
- ipc: Polybar failing to open IPC channel after another user already ran polybar, if `XDG_RUNTIME_DIR` is not set ([`#2683`](https://github.com/polybar/polybar/issues/2683), [`#2684`](https://github.com/polybar/polybar/pull/2684))
|
||||||
|
- No overlines/underlines being drawn when using offsets ([`#2685`](https://github.com/polybar/polybar/pull/2685))
|
||||||
|
- Update struts (`_NET_WM_STRUT_PARTIAL`) when hiding the bar ([`#2702`](https://github.com/polybar/polybar/pull/2702))
|
||||||
|
- `internal/pulseaudio`: Hanging during startup ([`#2707`](https://github.com/polybar/polybar/issues/2707), [`#2709`](https://github.com/polybar/polybar/pull/2709))
|
||||||
|
- `internal/xworkspaces`: Updates of `_NET_DESKTOP_VIEWPORT` being ignored ([`#2693`](https://github.com/polybar/polybar/issues/2693), [`#2698`](https://github.com/polybar/polybar/pull/2698))
|
||||||
|
|
||||||
## [3.6.2] - 2022-04-03
|
## [3.6.2] - 2022-04-03
|
||||||
### Fixed
|
### Fixed
|
||||||
- `format-offset` being ignored ([`#2643`](https://github.com/polybar/polybar/pull/2643))
|
- `format-offset` being ignored ([`#2643`](https://github.com/polybar/polybar/pull/2643))
|
||||||
@ -191,7 +201,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
### Fixed
|
### Fixed
|
||||||
- Empty color values are no longer treated as invalid and no longer produce an error.
|
- Empty color values are no longer treated as invalid and no longer produce an error.
|
||||||
|
|
||||||
[Unreleased]: https://github.com/polybar/polybar/compare/3.6.2...HEAD
|
[Unreleased]: https://github.com/polybar/polybar/compare/3.6.3...HEAD
|
||||||
|
[3.6.3]: https://github.com/polybar/polybar/releases/tag/3.6.3
|
||||||
[3.6.2]: https://github.com/polybar/polybar/releases/tag/3.6.2
|
[3.6.2]: https://github.com/polybar/polybar/releases/tag/3.6.2
|
||||||
[3.6.1]: https://github.com/polybar/polybar/releases/tag/3.6.1
|
[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.6.0]: https://github.com/polybar/polybar/releases/tag/3.6.0
|
||||||
|
@ -406,20 +406,22 @@ Below you can see an example of a menu module:
|
|||||||
[module/apps]
|
[module/apps]
|
||||||
type = custom/menu
|
type = custom/menu
|
||||||
|
|
||||||
|
label-open = Apps
|
||||||
|
|
||||||
menu-0-0 = Browsers
|
menu-0-0 = Browsers
|
||||||
menu-0-0-exec = menu-open-1
|
menu-0-0-exec = menu-open-1
|
||||||
menu-0-1 = Multimedia
|
menu-0-1 = Multimedia
|
||||||
menu-0-1-exec = menu-open-2
|
menu-0-1-exec = menu-open-2
|
||||||
|
|
||||||
menu-1-0 = Firefox
|
menu-1-0 = Firefox
|
||||||
menu-1-0-exec = firefox &
|
menu-1-0-exec = firefox
|
||||||
menu-1-1 = Chromium
|
menu-1-1 = Chromium
|
||||||
menu-1-1-exec = chromium &
|
menu-1-1-exec = chromium
|
||||||
|
|
||||||
menu-2-0 = Gimp
|
menu-2-0 = Gimp
|
||||||
menu-2-0-exec = gimp &
|
menu-2-0-exec = gimp
|
||||||
menu-2-1 = Scrot
|
menu-2-1 = Scrot
|
||||||
menu-2-1-exec = scrot &
|
menu-2-1-exec = scrot
|
||||||
|
|
||||||
This module uses two actions: ``menu-open-1`` and ``menu-open-2``.
|
This module uses two actions: ``menu-open-1`` and ``menu-open-2``.
|
||||||
These are actions with data, the data specifies which level of the menu should
|
These are actions with data, the data specifies which level of the menu should
|
||||||
@ -437,17 +439,19 @@ likely not use ``apps``, but the name of your module.
|
|||||||
[module/apps]
|
[module/apps]
|
||||||
type = custom/menu
|
type = custom/menu
|
||||||
|
|
||||||
|
label-open = Apps
|
||||||
|
|
||||||
menu-0-0 = Browsers
|
menu-0-0 = Browsers
|
||||||
menu-0-0-exec = #apps.open.1
|
menu-0-0-exec = #apps.open.1
|
||||||
menu-0-1 = Multimedia
|
menu-0-1 = Multimedia
|
||||||
menu-0-1-exec = #apps.open.2
|
menu-0-1-exec = #apps.open.2
|
||||||
|
|
||||||
menu-1-0 = Firefox
|
menu-1-0 = Firefox
|
||||||
menu-1-0-exec = firefox &
|
menu-1-0-exec = firefox
|
||||||
menu-1-1 = Chromium
|
menu-1-1 = Chromium
|
||||||
menu-1-1-exec = chromium &
|
menu-1-1-exec = chromium
|
||||||
|
|
||||||
menu-2-0 = Gimp
|
menu-2-0 = Gimp
|
||||||
menu-2-0-exec = gimp &
|
menu-2-0-exec = gimp
|
||||||
menu-2-1 = Scrot
|
menu-2-1 = Scrot
|
||||||
menu-2-1-exec = scrot &
|
menu-2-1-exec = scrot
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <pulse/pulseaudio.h>
|
#include <pulse/pulseaudio.h>
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
|
||||||
#include "common.hpp"
|
#include "common.hpp"
|
||||||
@ -58,6 +59,11 @@ class pulseaudio {
|
|||||||
|
|
||||||
const logger& m_log;
|
const logger& m_log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Has context_state_callback signalled the mainloop during connection.
|
||||||
|
*/
|
||||||
|
std::atomic_bool m_state_callback_signal{false};
|
||||||
|
|
||||||
// used for temporary callback results
|
// used for temporary callback results
|
||||||
int success{0};
|
int success{0};
|
||||||
pa_cvolume cv{};
|
pa_cvolume cv{};
|
||||||
|
@ -74,7 +74,7 @@ class renderer : public renderer_interface,
|
|||||||
void fill_overline(rgba color, double x, double w);
|
void fill_overline(rgba color, double x, double w);
|
||||||
void fill_underline(rgba color, double x, double w);
|
void fill_underline(rgba color, double x, double w);
|
||||||
void fill_borders();
|
void fill_borders();
|
||||||
void draw_offset(rgba color, double x, double w);
|
void draw_offset(const tags::context& ctxt, rgba color, double x, double w);
|
||||||
|
|
||||||
double block_x(alignment a) const;
|
double block_x(alignment a) const;
|
||||||
double block_y(alignment a) const;
|
double block_y(alignment a) const;
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <uv.h>
|
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
#include "common.hpp"
|
#include "common.hpp"
|
||||||
|
@ -24,6 +24,8 @@ pulseaudio::pulseaudio(const logger& logger, string&& sink_name, bool max_volume
|
|||||||
|
|
||||||
pa_context_set_state_callback(m_context, context_state_callback, this);
|
pa_context_set_state_callback(m_context, context_state_callback, this);
|
||||||
|
|
||||||
|
m_state_callback_signal = false;
|
||||||
|
|
||||||
if (pa_context_connect(m_context, nullptr, PA_CONTEXT_NOFLAGS, nullptr) < 0) {
|
if (pa_context_connect(m_context, nullptr, PA_CONTEXT_NOFLAGS, nullptr) < 0) {
|
||||||
pa_context_disconnect(m_context);
|
pa_context_disconnect(m_context);
|
||||||
pa_context_unref(m_context);
|
pa_context_unref(m_context);
|
||||||
@ -42,7 +44,17 @@ pulseaudio::pulseaudio(const logger& logger, string&& sink_name, bool max_volume
|
|||||||
|
|
||||||
m_log.trace("pulseaudio: started mainloop");
|
m_log.trace("pulseaudio: started mainloop");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Only wait for signal from the context state callback, if it has not
|
||||||
|
* already signalled the mainloop since pa_context_connect was called,
|
||||||
|
* otherwise, we would wait forever.
|
||||||
|
*
|
||||||
|
* The while loop ensures spurious wakeups are handled.
|
||||||
|
*/
|
||||||
|
while (!m_state_callback_signal) {
|
||||||
pa_threaded_mainloop_wait(m_mainloop);
|
pa_threaded_mainloop_wait(m_mainloop);
|
||||||
|
}
|
||||||
|
|
||||||
if (pa_context_get_state(m_context) != PA_CONTEXT_READY) {
|
if (pa_context_get_state(m_context) != PA_CONTEXT_READY) {
|
||||||
pa_threaded_mainloop_unlock(m_mainloop);
|
pa_threaded_mainloop_unlock(m_mainloop);
|
||||||
pa_threaded_mainloop_stop(m_mainloop);
|
pa_threaded_mainloop_stop(m_mainloop);
|
||||||
@ -310,6 +322,7 @@ void pulseaudio::context_state_callback(pa_context* context, void* userdata) {
|
|||||||
case PA_CONTEXT_READY:
|
case PA_CONTEXT_READY:
|
||||||
case PA_CONTEXT_TERMINATED:
|
case PA_CONTEXT_TERMINATED:
|
||||||
case PA_CONTEXT_FAILED:
|
case PA_CONTEXT_FAILED:
|
||||||
|
This->m_state_callback_signal = true;
|
||||||
pa_threaded_mainloop_signal(This->m_mainloop, 0);
|
pa_threaded_mainloop_signal(This->m_mainloop, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -46,7 +46,10 @@ script_runner::interval script_runner::process() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void script_runner::clear_output() {
|
void script_runner::clear_output() {
|
||||||
set_output("");
|
auto changed = set_output("");
|
||||||
|
if (changed) {
|
||||||
|
m_on_update(m_data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void script_runner::stop() {
|
void script_runner::stop() {
|
||||||
|
@ -433,10 +433,11 @@ void bar::hide() {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
m_log.info("Hiding bar window");
|
m_log.info("Hiding bar window");
|
||||||
|
m_visible = false;
|
||||||
|
reconfigure_struts();
|
||||||
m_sig.emit(visibility_change{false});
|
m_sig.emit(visibility_change{false});
|
||||||
m_connection.unmap_window_checked(m_opts.window);
|
m_connection.unmap_window_checked(m_opts.window);
|
||||||
m_connection.flush();
|
m_connection.flush();
|
||||||
m_visible = false;
|
|
||||||
} catch (const exception& err) {
|
} catch (const exception& err) {
|
||||||
m_log.err("Failed to unmap bar window (err=%s", err.what());
|
m_log.err("Failed to unmap bar window (err=%s", err.what());
|
||||||
}
|
}
|
||||||
@ -549,6 +550,8 @@ void bar::reconfigure_pos() {
|
|||||||
* Reconfigure window strut values
|
* Reconfigure window strut values
|
||||||
*/
|
*/
|
||||||
void bar::reconfigure_struts() {
|
void bar::reconfigure_struts() {
|
||||||
|
window win{m_connection, m_opts.window};
|
||||||
|
if (m_visible) {
|
||||||
auto geom = m_connection.get_geometry(m_screen->root());
|
auto geom = m_connection.get_geometry(m_screen->root());
|
||||||
int h = m_opts.size.h + m_opts.offset.y;
|
int h = m_opts.size.h + m_opts.offset.y;
|
||||||
|
|
||||||
@ -582,9 +585,11 @@ void bar::reconfigure_struts() {
|
|||||||
|
|
||||||
correction = std::max(correction, 0);
|
correction = std::max(correction, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
window win{m_connection, m_opts.window};
|
|
||||||
win.reconfigure_struts(m_opts.size.w, h + correction, m_opts.pos.x, m_opts.bottom);
|
win.reconfigure_struts(m_opts.size.w, h + correction, m_opts.pos.x, m_opts.bottom);
|
||||||
|
} else {
|
||||||
|
// Set struts to 0 for invisible bars
|
||||||
|
win.reconfigure_struts(0, 0, 0, m_opts.bottom);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -627,6 +632,8 @@ void bar::broadcast_visibility() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void bar::map_window() {
|
void bar::map_window() {
|
||||||
|
m_visible = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* First reconfigures the window so that WMs that discard some information
|
* First reconfigures the window so that WMs that discard some information
|
||||||
* when unmapping have the correct window properties (geometry etc).
|
* when unmapping have the correct window properties (geometry etc).
|
||||||
@ -641,8 +648,6 @@ void bar::map_window() {
|
|||||||
* mapping. Additionally updating the window position after mapping seems to fix that.
|
* mapping. Additionally updating the window position after mapping seems to fix that.
|
||||||
*/
|
*/
|
||||||
reconfigure_pos();
|
reconfigure_pos();
|
||||||
|
|
||||||
m_visible = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void bar::trigger_click(mousebtn btn, int pos) {
|
void bar::trigger_click(mousebtn btn, int pos) {
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
#include "components/controller.hpp"
|
#include "components/controller.hpp"
|
||||||
|
|
||||||
#include <uv.h>
|
|
||||||
|
|
||||||
#include <csignal>
|
#include <csignal>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
@ -729,8 +729,12 @@ void renderer::render_text(const tags::context& ctxt, const string&& contents) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void renderer::draw_offset(rgba color, double x, double w) {
|
void renderer::draw_offset(const tags::context& ctxt, rgba color, double x, double w) {
|
||||||
if (w > 0 && color != m_bar.background) {
|
if (w <= 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (color != m_bar.background) {
|
||||||
m_log.trace_x("renderer: offset(x=%f, w=%f)", x, w);
|
m_log.trace_x("renderer: offset(x=%f, w=%f)", x, w);
|
||||||
m_context->save();
|
m_context->save();
|
||||||
*m_context << m_comp_bg;
|
*m_context << m_comp_bg;
|
||||||
@ -740,6 +744,14 @@ void renderer::draw_offset(rgba color, double x, double w) {
|
|||||||
m_context->fill();
|
m_context->fill();
|
||||||
m_context->restore();
|
m_context->restore();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ctxt.has_underline()) {
|
||||||
|
fill_underline(ctxt.get_ul(), x, w);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ctxt.has_overline()) {
|
||||||
|
fill_overline(ctxt.get_ol(), x, w);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void renderer::render_offset(const tags::context& ctxt, const extent_val offset) {
|
void renderer::render_offset(const tags::context& ctxt, const extent_val offset) {
|
||||||
@ -748,7 +760,7 @@ void renderer::render_offset(const tags::context& ctxt, const extent_val offset)
|
|||||||
|
|
||||||
int offset_width = units_utils::extent_to_pixel(offset, m_bar.dpi_x);
|
int offset_width = units_utils::extent_to_pixel(offset, m_bar.dpi_x);
|
||||||
rgba bg = ctxt.get_bg();
|
rgba bg = ctxt.get_bg();
|
||||||
draw_offset(bg, m_blocks[m_align].x, offset_width);
|
draw_offset(ctxt, bg, m_blocks[m_align].x, offset_width);
|
||||||
increase_x(offset_width);
|
increase_x(offset_width);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include "ipc/util.hpp"
|
#include "ipc/util.hpp"
|
||||||
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "errors.hpp"
|
#include "errors.hpp"
|
||||||
#include "utils/env.hpp"
|
#include "utils/env.hpp"
|
||||||
@ -12,8 +13,14 @@ POLYBAR_NS
|
|||||||
namespace ipc {
|
namespace ipc {
|
||||||
|
|
||||||
static constexpr auto SUFFIX = ".sock";
|
static constexpr auto SUFFIX = ".sock";
|
||||||
|
static constexpr auto XDG_RUNTIME_DIR = "XDG_RUNTIME_DIR";
|
||||||
|
|
||||||
string get_runtime_path() {
|
string get_runtime_path() {
|
||||||
|
if (env_util::has(XDG_RUNTIME_DIR)) {
|
||||||
|
return env_util::get("XDG_RUNTIME_DIR") + "/polybar";
|
||||||
|
} else {
|
||||||
|
return "/tmp/polybar-" + to_string(getuid());
|
||||||
|
}
|
||||||
return env_util::get("XDG_RUNTIME_DIR", "/tmp") + "/polybar";
|
return env_util::get("XDG_RUNTIME_DIR", "/tmp") + "/polybar";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,7 +199,7 @@ namespace modules {
|
|||||||
if (chrono::duration_cast<decltype(m_interval)>(now - m_lastpoll) > m_interval) {
|
if (chrono::duration_cast<decltype(m_interval)>(now - m_lastpoll) > m_interval) {
|
||||||
m_lastpoll = now;
|
m_lastpoll = now;
|
||||||
m_log.info("%s: Polling values (inotify fallback)", name());
|
m_log.info("%s: Polling values (inotify fallback)", name());
|
||||||
read(*m_capacity_reader);
|
on_event(nullptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,7 +108,8 @@ namespace modules {
|
|||||||
if (evt->atom == m_ewmh->_NET_CLIENT_LIST || evt->atom == m_ewmh->_NET_WM_DESKTOP) {
|
if (evt->atom == m_ewmh->_NET_CLIENT_LIST || evt->atom == m_ewmh->_NET_WM_DESKTOP) {
|
||||||
rebuild_clientlist();
|
rebuild_clientlist();
|
||||||
rebuild_desktop_states();
|
rebuild_desktop_states();
|
||||||
} else if (evt->atom == m_ewmh->_NET_DESKTOP_NAMES || evt->atom == m_ewmh->_NET_NUMBER_OF_DESKTOPS) {
|
} else if (evt->atom == m_ewmh->_NET_DESKTOP_NAMES || evt->atom == m_ewmh->_NET_NUMBER_OF_DESKTOPS ||
|
||||||
|
evt->atom == m_ewmh->_NET_DESKTOP_VIEWPORT) {
|
||||||
m_desktop_names = get_desktop_names();
|
m_desktop_names = get_desktop_names();
|
||||||
rebuild_desktops();
|
rebuild_desktops();
|
||||||
rebuild_clientlist();
|
rebuild_clientlist();
|
||||||
|
@ -57,14 +57,16 @@ window window::reconfigure_pos(short int x, short int y) {
|
|||||||
window window::reconfigure_struts(uint32_t w, uint32_t strut, uint32_t x, bool bottom) {
|
window window::reconfigure_struts(uint32_t w, uint32_t strut, uint32_t x, bool bottom) {
|
||||||
std::array<uint32_t, 12> values{};
|
std::array<uint32_t, 12> values{};
|
||||||
|
|
||||||
|
uint32_t end_x = std::max<int>(0, x + w - 1);
|
||||||
|
|
||||||
if (bottom) {
|
if (bottom) {
|
||||||
values[to_integral(strut::BOTTOM)] = strut;
|
values[to_integral(strut::BOTTOM)] = strut;
|
||||||
values[to_integral(strut::BOTTOM_START_X)] = x;
|
values[to_integral(strut::BOTTOM_START_X)] = x;
|
||||||
values[to_integral(strut::BOTTOM_END_X)] = x + w - 1;
|
values[to_integral(strut::BOTTOM_END_X)] = end_x;
|
||||||
} else {
|
} else {
|
||||||
values[to_integral(strut::TOP)] = strut;
|
values[to_integral(strut::TOP)] = strut;
|
||||||
values[to_integral(strut::TOP_START_X)] = x;
|
values[to_integral(strut::TOP_START_X)] = x;
|
||||||
values[to_integral(strut::TOP_END_X)] = x + w - 1;
|
values[to_integral(strut::TOP_END_X)] = end_x;
|
||||||
}
|
}
|
||||||
|
|
||||||
connection().change_property_checked(
|
connection().change_property_checked(
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# Polybar version information
|
# Polybar version information
|
||||||
# Update this on every release
|
# Update this on every release
|
||||||
# This is used to create the version string if a git repo is not available
|
# This is used to create the version string if a git repo is not available
|
||||||
3.6.2
|
3.6.3
|
||||||
|
Loading…
Reference in New Issue
Block a user