fix(xworkspace): Fully support _NET_DESKTOP_NAMES spec (#1579)

Ref https://specifications.freedesktop.org/wm-spec/wm-spec-latest.html#idm140200472706208

Fixes #1491
Fixes #248
Closes #904
This commit is contained in:
striker.sh 2019-02-08 13:32:31 +01:00 committed by Patrick Ziegler
parent 6d3b323f16
commit ca4426a962
4 changed files with 28 additions and 3 deletions

View File

@ -69,6 +69,7 @@ namespace modules {
void set_desktop_urgent(xcb_window_t window); void set_desktop_urgent(xcb_window_t window);
bool input(string&& cmd); bool input(string&& cmd);
vector<string> get_desktop_names();
private: private:
static constexpr const char* DEFAULT_ICON{"icon-default"}; static constexpr const char* DEFAULT_ICON{"icon-default"};

View File

@ -24,6 +24,7 @@ namespace ewmh_util {
vector<position> get_desktop_viewports(int screen = 0); vector<position> get_desktop_viewports(int screen = 0);
vector<string> get_desktop_names(int screen = 0); vector<string> get_desktop_names(int screen = 0);
unsigned int get_current_desktop(int screen = 0); unsigned int get_current_desktop(int screen = 0);
unsigned int get_number_of_desktops(int screen = 0);
xcb_window_t get_active_window(int screen = 0); xcb_window_t get_active_window(int screen = 0);
void change_current_desktop(unsigned int desktop); void change_current_desktop(unsigned int desktop);

View File

@ -81,7 +81,7 @@ namespace modules {
m_monitors = randr_util::get_monitors(m_connection, m_connection.root(), false); m_monitors = randr_util::get_monitors(m_connection, m_connection.root(), false);
// Get desktop details // Get desktop details
m_desktop_names = ewmh_util::get_desktop_names(); m_desktop_names = get_desktop_names();
m_current_desktop = ewmh_util::get_current_desktop(); m_current_desktop = ewmh_util::get_current_desktop();
rebuild_desktops(); rebuild_desktops();
@ -97,8 +97,8 @@ namespace modules {
void xworkspaces_module::handle(const evt::property_notify& evt) { void xworkspaces_module::handle(const evt::property_notify& evt) {
if (evt->atom == m_ewmh->_NET_CLIENT_LIST) { if (evt->atom == m_ewmh->_NET_CLIENT_LIST) {
rebuild_clientlist(); rebuild_clientlist();
} else if (evt->atom == m_ewmh->_NET_DESKTOP_NAMES) { } else if (evt->atom == m_ewmh->_NET_DESKTOP_NAMES || evt->atom == m_ewmh->_NET_NUMBER_OF_DESKTOPS) {
m_desktop_names = ewmh_util::get_desktop_names(); m_desktop_names = get_desktop_names();
rebuild_desktops(); rebuild_desktops();
rebuild_desktop_states(); rebuild_desktop_states();
} else if (evt->atom == m_ewmh->_NET_CURRENT_DESKTOP) { } else if (evt->atom == m_ewmh->_NET_CURRENT_DESKTOP) {
@ -224,6 +224,22 @@ namespace modules {
} }
} }
vector<string> xworkspaces_module::get_desktop_names(){
vector<string> names = ewmh_util::get_desktop_names();
unsigned int desktops_number = ewmh_util::get_number_of_desktops();
if(desktops_number == names.size()) {
return names;
}
else if(desktops_number < names.size()) {
names.erase(names.begin()+desktops_number, names.end());
return names;
}
for (unsigned int i = names.size(); i < desktops_number + 1; i++) {
names.insert(names.end(), to_string(i));
}
return names;
}
/** /**
* Find window and set corresponding desktop to urgent * Find window and set corresponding desktop to urgent
*/ */

View File

@ -77,6 +77,13 @@ namespace ewmh_util {
return desktop; return desktop;
} }
unsigned int get_number_of_desktops(int screen) {
auto conn = initialize().get();
unsigned int desktops = XCB_NONE;
xcb_ewmh_get_number_of_desktops_reply(conn, xcb_ewmh_get_number_of_desktops(conn, screen), &desktops, nullptr);
return desktops;
}
vector<position> get_desktop_viewports(int screen) { vector<position> get_desktop_viewports(int screen) {
auto conn = initialize().get(); auto conn = initialize().get();
vector<position> viewports; vector<position> viewports;