1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 12:17:44 +00:00

Taskbar: Only show the current desktop's window buttons

By tracking what virtual desktop a window is on, and what desktop is
being viewed we can show or hide the window buttons accordingly.
This commit is contained in:
Tom 2021-06-30 20:16:19 -06:00 committed by Andreas Kling
parent 5acee4b4d0
commit cc707270ae
4 changed files with 40 additions and 1 deletions

View file

@ -221,6 +221,7 @@ void TaskbarWindow::update_window_button(::Window& window, bool show_as_active)
button->set_text(window.title());
button->set_tooltip(window.title());
button->set_checked(show_as_active);
button->set_visible(is_window_on_current_virtual_desktop(window));
}
::Window* TaskbarWindow::find_window_owner(::Window& window) const
@ -304,6 +305,7 @@ void TaskbarWindow::wm_event(GUI::WMEvent& event)
window.set_active(changed_event.is_active());
window.set_minimized(changed_event.is_minimized());
window.set_progress(changed_event.progress());
window.set_virtual_desktop(changed_event.virtual_desktop_row(), changed_event.virtual_desktop_column());
auto* window_owner = find_window_owner(window);
if (window_owner == &window) {
@ -336,6 +338,10 @@ void TaskbarWindow::wm_event(GUI::WMEvent& event)
warnln("failed to spawn 'Assistant' when requested via Super+Space");
break;
}
case GUI::Event::WM_VirtualDesktopChanged: {
auto& changed_event = static_cast<GUI::WMVirtualDesktopChangedEvent&>(event);
virtual_desktop_change_event(changed_event.current_row(), changed_event.current_column());
}
default:
break;
}
@ -345,3 +351,19 @@ void TaskbarWindow::screen_rects_change_event(GUI::ScreenRectsChangeEvent& event
{
on_screen_rects_change(event.rects(), event.main_screen_index());
}
bool TaskbarWindow::is_window_on_current_virtual_desktop(::Window& window) const
{
return window.virtual_desktop_row() == m_current_virtual_desktop_row && window.virtual_desktop_column() == m_current_virtual_desktop_column;
}
void TaskbarWindow::virtual_desktop_change_event(unsigned current_row, unsigned current_column)
{
m_current_virtual_desktop_row = current_row;
m_current_virtual_desktop_column = current_column;
WindowList::the().for_each_window([&](auto& window) {
if (auto* button = window.button())
button->set_visible(is_window_on_current_virtual_desktop(window));
});
}

View file

@ -34,6 +34,9 @@ private:
void update_applet_area();
bool is_window_on_current_virtual_desktop(::Window&) const;
void virtual_desktop_change_event(unsigned, unsigned);
NonnullRefPtr<GUI::Menu> m_start_menu;
RefPtr<GUI::Widget> m_task_button_container;
RefPtr<Gfx::Bitmap> m_default_icon;
@ -43,4 +46,7 @@ private:
RefPtr<GUI::Button> m_start_button;
RefPtr<Desktop::AppFile> m_assistant_app_file;
unsigned m_current_virtual_desktop_row { 0 };
unsigned m_current_virtual_desktop_column { 0 };
};

View file

@ -48,6 +48,14 @@ public:
void set_modal(bool modal) { m_modal = modal; }
bool is_modal() const { return m_modal; }
void set_virtual_desktop(unsigned row, unsigned column)
{
m_virtual_desktop_row = row;
m_virtual_desktop_column = column;
}
unsigned virtual_desktop_row() const { return m_virtual_desktop_row; }
unsigned virtual_desktop_column() const { return m_virtual_desktop_column; }
void set_progress(Optional<int> progress)
{
if (m_progress == progress)
@ -68,6 +76,8 @@ private:
Gfx::IntRect m_rect;
RefPtr<GUI::Button> m_button;
RefPtr<Gfx::Bitmap> m_icon;
unsigned m_virtual_desktop_row { 0 };
unsigned m_virtual_desktop_column { 0 };
bool m_active { false };
bool m_minimized { false };
bool m_modal { false };

View file

@ -60,7 +60,8 @@ int main(int argc, char** argv)
window->make_window_manager(
WindowServer::WMEventMask::WindowStateChanges
| WindowServer::WMEventMask::WindowRemovals
| WindowServer::WMEventMask::WindowIconChanges);
| WindowServer::WMEventMask::WindowIconChanges
| WindowServer::WMEventMask::VirtualDesktopChanges);
return app->exec();
}