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
|
||||
- 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
|
||||
### Fixed
|
||||
- `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
|
||||
- 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.1]: https://github.com/polybar/polybar/releases/tag/3.6.1
|
||||
[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]
|
||||
type = custom/menu
|
||||
|
||||
label-open = Apps
|
||||
|
||||
menu-0-0 = Browsers
|
||||
menu-0-0-exec = menu-open-1
|
||||
menu-0-1 = Multimedia
|
||||
menu-0-1-exec = menu-open-2
|
||||
|
||||
menu-1-0 = Firefox
|
||||
menu-1-0-exec = firefox &
|
||||
menu-1-0-exec = firefox
|
||||
menu-1-1 = Chromium
|
||||
menu-1-1-exec = chromium &
|
||||
menu-1-1-exec = chromium
|
||||
|
||||
menu-2-0 = Gimp
|
||||
menu-2-0-exec = gimp &
|
||||
menu-2-0-exec = gimp
|
||||
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``.
|
||||
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]
|
||||
type = custom/menu
|
||||
|
||||
label-open = Apps
|
||||
|
||||
menu-0-0 = Browsers
|
||||
menu-0-0-exec = #apps.open.1
|
||||
menu-0-1 = Multimedia
|
||||
menu-0-1-exec = #apps.open.2
|
||||
|
||||
menu-1-0 = Firefox
|
||||
menu-1-0-exec = firefox &
|
||||
menu-1-0-exec = firefox
|
||||
menu-1-1 = Chromium
|
||||
menu-1-1-exec = chromium &
|
||||
menu-1-1-exec = chromium
|
||||
|
||||
menu-2-0 = Gimp
|
||||
menu-2-0-exec = gimp &
|
||||
menu-2-0-exec = gimp
|
||||
menu-2-1 = Scrot
|
||||
menu-2-1-exec = scrot &
|
||||
menu-2-1-exec = scrot
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
#include <pulse/pulseaudio.h>
|
||||
|
||||
#include <atomic>
|
||||
#include <queue>
|
||||
|
||||
#include "common.hpp"
|
||||
@ -58,6 +59,11 @@ class pulseaudio {
|
||||
|
||||
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
|
||||
int success{0};
|
||||
pa_cvolume cv{};
|
||||
|
@ -74,7 +74,7 @@ class renderer : public renderer_interface,
|
||||
void fill_overline(rgba color, double x, double w);
|
||||
void fill_underline(rgba color, double x, double w);
|
||||
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_y(alignment a) const;
|
||||
|
@ -1,7 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
#include <uv.h>
|
||||
|
||||
#include <set>
|
||||
|
||||
#include "common.hpp"
|
||||
@ -94,6 +92,6 @@ namespace ipc {
|
||||
void receive_data(string buf);
|
||||
void receive_eof();
|
||||
};
|
||||
} // namespace ipc
|
||||
} // namespace ipc
|
||||
|
||||
POLYBAR_NS_END
|
||||
|
@ -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);
|
||||
|
||||
m_state_callback_signal = false;
|
||||
|
||||
if (pa_context_connect(m_context, nullptr, PA_CONTEXT_NOFLAGS, nullptr) < 0) {
|
||||
pa_context_disconnect(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");
|
||||
|
||||
pa_threaded_mainloop_wait(m_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);
|
||||
}
|
||||
|
||||
if (pa_context_get_state(m_context) != PA_CONTEXT_READY) {
|
||||
pa_threaded_mainloop_unlock(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_TERMINATED:
|
||||
case PA_CONTEXT_FAILED:
|
||||
This->m_state_callback_signal = true;
|
||||
pa_threaded_mainloop_signal(This->m_mainloop, 0);
|
||||
break;
|
||||
|
||||
|
@ -46,7 +46,10 @@ script_runner::interval script_runner::process() {
|
||||
}
|
||||
|
||||
void script_runner::clear_output() {
|
||||
set_output("");
|
||||
auto changed = set_output("");
|
||||
if (changed) {
|
||||
m_on_update(m_data);
|
||||
}
|
||||
}
|
||||
|
||||
void script_runner::stop() {
|
||||
|
@ -433,10 +433,11 @@ void bar::hide() {
|
||||
|
||||
try {
|
||||
m_log.info("Hiding bar window");
|
||||
m_visible = false;
|
||||
reconfigure_struts();
|
||||
m_sig.emit(visibility_change{false});
|
||||
m_connection.unmap_window_checked(m_opts.window);
|
||||
m_connection.flush();
|
||||
m_visible = false;
|
||||
} catch (const exception& err) {
|
||||
m_log.err("Failed to unmap bar window (err=%s", err.what());
|
||||
}
|
||||
@ -549,42 +550,46 @@ void bar::reconfigure_pos() {
|
||||
* Reconfigure window strut values
|
||||
*/
|
||||
void bar::reconfigure_struts() {
|
||||
auto geom = m_connection.get_geometry(m_screen->root());
|
||||
int h = m_opts.size.h + m_opts.offset.y;
|
||||
window win{m_connection, m_opts.window};
|
||||
if (m_visible) {
|
||||
auto geom = m_connection.get_geometry(m_screen->root());
|
||||
int h = m_opts.size.h + m_opts.offset.y;
|
||||
|
||||
// Apply user-defined margins
|
||||
if (m_opts.bottom) {
|
||||
h += m_opts.strut.top;
|
||||
} else {
|
||||
h += m_opts.strut.bottom;
|
||||
}
|
||||
|
||||
h = std::max(h, 0);
|
||||
|
||||
int correction = 0;
|
||||
|
||||
// Only apply correction if any space is requested
|
||||
if (h > 0) {
|
||||
/*
|
||||
* Strut coordinates have to be relative to root window and not any monitor.
|
||||
* If any monitor is not aligned at the top or bottom
|
||||
*/
|
||||
// Apply user-defined margins
|
||||
if (m_opts.bottom) {
|
||||
/*
|
||||
* For bottom-algined bars, the correction is the number of pixels between
|
||||
* the root window's bottom edge and the monitor's bottom edge
|
||||
*/
|
||||
correction = geom->height - (m_opts.monitor->y + m_opts.monitor->h);
|
||||
h += m_opts.strut.top;
|
||||
} else {
|
||||
// For top-aligned bars, we simply add the monitor's y-position
|
||||
correction = m_opts.monitor->y;
|
||||
h += m_opts.strut.bottom;
|
||||
}
|
||||
|
||||
correction = std::max(correction, 0);
|
||||
}
|
||||
h = std::max(h, 0);
|
||||
|
||||
window win{m_connection, m_opts.window};
|
||||
win.reconfigure_struts(m_opts.size.w, h + correction, m_opts.pos.x, m_opts.bottom);
|
||||
int correction = 0;
|
||||
|
||||
// Only apply correction if any space is requested
|
||||
if (h > 0) {
|
||||
/*
|
||||
* Strut coordinates have to be relative to root window and not any monitor.
|
||||
* If any monitor is not aligned at the top or bottom
|
||||
*/
|
||||
if (m_opts.bottom) {
|
||||
/*
|
||||
* For bottom-algined bars, the correction is the number of pixels between
|
||||
* the root window's bottom edge and the monitor's bottom edge
|
||||
*/
|
||||
correction = geom->height - (m_opts.monitor->y + m_opts.monitor->h);
|
||||
} else {
|
||||
// For top-aligned bars, we simply add the monitor's y-position
|
||||
correction = m_opts.monitor->y;
|
||||
}
|
||||
|
||||
correction = std::max(correction, 0);
|
||||
}
|
||||
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() {
|
||||
m_visible = true;
|
||||
|
||||
/**
|
||||
* First reconfigures the window so that WMs that discard some information
|
||||
* 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.
|
||||
*/
|
||||
reconfigure_pos();
|
||||
|
||||
m_visible = true;
|
||||
}
|
||||
|
||||
void bar::trigger_click(mousebtn btn, int pos) {
|
||||
|
@ -1,7 +1,5 @@
|
||||
#include "components/controller.hpp"
|
||||
|
||||
#include <uv.h>
|
||||
|
||||
#include <csignal>
|
||||
#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) {
|
||||
if (w > 0 && color != m_bar.background) {
|
||||
void renderer::draw_offset(const tags::context& ctxt, rgba color, double x, double w) {
|
||||
if (w <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (color != m_bar.background) {
|
||||
m_log.trace_x("renderer: offset(x=%f, w=%f)", x, w);
|
||||
m_context->save();
|
||||
*m_context << m_comp_bg;
|
||||
@ -740,6 +744,14 @@ void renderer::draw_offset(rgba color, double x, double w) {
|
||||
m_context->fill();
|
||||
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) {
|
||||
@ -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);
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
#include "ipc/util.hpp"
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "errors.hpp"
|
||||
#include "utils/env.hpp"
|
||||
@ -12,8 +13,14 @@ POLYBAR_NS
|
||||
namespace ipc {
|
||||
|
||||
static constexpr auto SUFFIX = ".sock";
|
||||
static constexpr auto XDG_RUNTIME_DIR = "XDG_RUNTIME_DIR";
|
||||
|
||||
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";
|
||||
}
|
||||
|
||||
@ -59,6 +66,6 @@ namespace ipc {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
} // namespace ipc
|
||||
} // namespace ipc
|
||||
|
||||
POLYBAR_NS_END
|
||||
|
@ -199,7 +199,7 @@ namespace modules {
|
||||
if (chrono::duration_cast<decltype(m_interval)>(now - m_lastpoll) > m_interval) {
|
||||
m_lastpoll = now;
|
||||
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) {
|
||||
rebuild_clientlist();
|
||||
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();
|
||||
rebuild_desktops();
|
||||
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) {
|
||||
std::array<uint32_t, 12> values{};
|
||||
|
||||
uint32_t end_x = std::max<int>(0, x + w - 1);
|
||||
|
||||
if (bottom) {
|
||||
values[to_integral(strut::BOTTOM)] = strut;
|
||||
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 {
|
||||
values[to_integral(strut::TOP)] = strut;
|
||||
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(
|
||||
|
@ -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.2
|
||||
3.6.3
|
||||
|
Loading…
Reference in New Issue
Block a user