mirror of
https://github.com/polybar/polybar.git
synced 2024-11-18 13:55:11 -05:00
feat(ipc): Add visibility commands
This commit is contained in:
parent
23a7717120
commit
b6c5563b0b
4 changed files with 70 additions and 4 deletions
|
@ -16,7 +16,7 @@ _polybar_msg() {
|
||||||
case $words[1] in
|
case $words[1] in
|
||||||
hook) _arguments ':module name:' ':hook index:'; ret=0 ;;
|
hook) _arguments ':module name:' ':hook index:'; ret=0 ;;
|
||||||
action) _arguments ':action payload:'; ret=0 ;;
|
action) _arguments ':action payload:'; ret=0 ;;
|
||||||
cmd) _arguments ':command payload:'; ret=0 ;;
|
cmd) _arguments ':command payload:(show hide toggle restart quit)'; ret=0 ;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
|
@ -41,6 +41,10 @@ class bar : public xpp::event::sink<evt::button_press, evt::expose, evt::propert
|
||||||
|
|
||||||
void parse(string&& data, bool force = false);
|
void parse(string&& data, bool force = false);
|
||||||
|
|
||||||
|
void hide();
|
||||||
|
void show();
|
||||||
|
void toggle();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void restack_window();
|
void restack_window();
|
||||||
void reconfigure_pos();
|
void reconfigure_pos();
|
||||||
|
@ -86,6 +90,8 @@ class bar : public xpp::event::sink<evt::button_press, evt::expose, evt::propert
|
||||||
event_timer m_doubleclick{0L, 150L};
|
event_timer m_doubleclick{0L, 150L};
|
||||||
|
|
||||||
double m_anim_step{0.0};
|
double m_anim_step{0.0};
|
||||||
|
|
||||||
|
bool m_visible{true};
|
||||||
};
|
};
|
||||||
|
|
||||||
POLYBAR_NS_END
|
POLYBAR_NS_END
|
||||||
|
|
|
@ -313,9 +313,12 @@ void bar::parse(string&& data, bool force) {
|
||||||
|
|
||||||
if (force) {
|
if (force) {
|
||||||
m_log.trace("bar: Force update");
|
m_log.trace("bar: Force update");
|
||||||
|
} else if (!m_visible) {
|
||||||
|
return m_log.trace("bar: Ignoring update (invisible)");
|
||||||
} else if (m_opts.shaded) {
|
} else if (m_opts.shaded) {
|
||||||
return m_log.trace("bar: Ignoring update (shaded)");
|
return m_log.trace("bar: Ignoring update (shaded)");
|
||||||
} else if (data == m_lastinput) {
|
} else if (data == m_lastinput) {
|
||||||
|
return m_log.trace("bar: Ignoring update (unchanged)");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -361,6 +364,57 @@ void bar::parse(string&& data, bool force) {
|
||||||
m_dblclicks = check_dblclicks();
|
m_dblclicks = check_dblclicks();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hide the bar by unmapping its X window
|
||||||
|
*/
|
||||||
|
void bar::hide() {
|
||||||
|
if (!m_visible) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
m_log.info("Hiding bar window");
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the bar by mapping its X window and
|
||||||
|
* trigger a redraw of previous content
|
||||||
|
*/
|
||||||
|
void bar::show() {
|
||||||
|
if (m_visible) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
m_log.info("Showing bar window");
|
||||||
|
m_sig.emit(visibility_change{true});
|
||||||
|
m_connection.map_window_checked(m_opts.window);
|
||||||
|
m_connection.flush();
|
||||||
|
m_visible = true;
|
||||||
|
parse(string{m_lastinput}, true);
|
||||||
|
} catch (const exception& err) {
|
||||||
|
m_log.err("Failed to map bar window (err=%s", err.what());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Toggle the bar's visibility state
|
||||||
|
*/
|
||||||
|
void bar::toggle() {
|
||||||
|
if (m_visible) {
|
||||||
|
hide();
|
||||||
|
} else {
|
||||||
|
show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Move the bar window above defined sibling
|
* Move the bar window above defined sibling
|
||||||
* in the X window stack
|
* in the X window stack
|
||||||
|
@ -458,11 +512,11 @@ void bar::broadcast_visibility() {
|
||||||
auto attr = m_connection.get_window_attributes(m_opts.window);
|
auto attr = m_connection.get_window_attributes(m_opts.window);
|
||||||
|
|
||||||
if (attr->map_state == XCB_MAP_STATE_UNVIEWABLE) {
|
if (attr->map_state == XCB_MAP_STATE_UNVIEWABLE) {
|
||||||
m_sig.emit(visibility_change{move(false)});
|
m_sig.emit(visibility_change{false});
|
||||||
} else if (attr->map_state == XCB_MAP_STATE_UNMAPPED) {
|
} else if (attr->map_state == XCB_MAP_STATE_UNMAPPED) {
|
||||||
m_sig.emit(visibility_change{move(false)});
|
m_sig.emit(visibility_change{false});
|
||||||
} else {
|
} else {
|
||||||
m_sig.emit(visibility_change{move(true)});
|
m_sig.emit(visibility_change{true});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -636,6 +636,12 @@ bool controller::on(const signals::ipc::command& evt) {
|
||||||
enqueue(make_quit_evt(false));
|
enqueue(make_quit_evt(false));
|
||||||
} else if (command == "restart") {
|
} else if (command == "restart") {
|
||||||
enqueue(make_quit_evt(true));
|
enqueue(make_quit_evt(true));
|
||||||
|
} else if (command == "hide") {
|
||||||
|
m_bar->hide();
|
||||||
|
} else if (command == "show") {
|
||||||
|
m_bar->show();
|
||||||
|
} else if (command == "toggle") {
|
||||||
|
m_bar->toggle();
|
||||||
} else {
|
} else {
|
||||||
m_log.warn("\"%s\" is not a valid ipc command", command);
|
m_log.warn("\"%s\" is not a valid ipc command", command);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue