mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 21:57:43 +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:
parent
5acee4b4d0
commit
cc707270ae
4 changed files with 40 additions and 1 deletions
|
@ -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));
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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 };
|
||||
};
|
||||
|
|
|
@ -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 };
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue