diff options
| -rw-r--r-- | plugins/unityshell/src/BamfLauncherIcon.cpp | 31 | ||||
| -rw-r--r-- | plugins/unityshell/src/PluginAdapter.cpp | 26 | ||||
| -rw-r--r-- | plugins/unityshell/src/PluginAdapter.h | 1 | ||||
| -rw-r--r-- | plugins/unityshell/src/WindowManager.cpp | 5 | ||||
| -rw-r--r-- | plugins/unityshell/src/WindowManager.h | 4 |
5 files changed, 58 insertions, 9 deletions
diff --git a/plugins/unityshell/src/BamfLauncherIcon.cpp b/plugins/unityshell/src/BamfLauncherIcon.cpp index cd71ee3f0..8101ce585 100644 --- a/plugins/unityshell/src/BamfLauncherIcon.cpp +++ b/plugins/unityshell/src/BamfLauncherIcon.cpp @@ -78,6 +78,7 @@ void BamfLauncherIcon::ActivateLauncherIcon(ActionArg arg) if (arg.source != ActionArg::SWITCHER) { + bool any_visible = false; for (l = bamf_view_get_children(BAMF_VIEW(m_App)); l; l = l->next) { view = static_cast <BamfView*> (l->data); @@ -85,13 +86,18 @@ void BamfLauncherIcon::ActivateLauncherIcon(ActionArg arg) if (BAMF_IS_WINDOW(view)) { Window xid = bamf_window_get_xid(BAMF_WINDOW(view)); + + if (WindowManager::Default ()->IsWindowOnCurrentDesktop(xid)) + any_visible = true; if (!WindowManager::Default ()->IsWindowMapped(xid)) { active = false; - break; } } } + + if (!any_visible) + active = false; } /* Behaviour: @@ -566,6 +572,7 @@ void BamfLauncherIcon::Focus(ActionArg arg) GList* children, *l; BamfView* view; bool any_urgent = false; + bool any_visible = false; children = bamf_view_get_children(BAMF_VIEW(m_App)); @@ -581,6 +588,10 @@ void BamfLauncherIcon::Focus(ActionArg arg) Window xid = bamf_window_get_xid(BAMF_WINDOW(view)); bool urgent = bamf_view_is_urgent(view); + if (WindowManager::Default ()->IsWindowOnCurrentDesktop (xid) && + WindowManager::Default ()->IsWindowVisible (xid)) + any_visible = true; + if (any_urgent) { if (urgent) @@ -591,17 +602,29 @@ void BamfLauncherIcon::Focus(ActionArg arg) if (urgent) { windows.clear(); + any_visible = false; any_urgent = true; } - windows.push_back(xid); } + windows.push_back(xid); } } g_list_free(children); if (arg.source != ActionArg::SWITCHER) - WindowManager::Default()->FocusWindowGroup(windows, - WindowManager::FocusVisibility::ForceUnminimizeInvisible); + { + if (any_visible) + { + WindowManager::Default()->FocusWindowGroup(windows, + WindowManager::FocusVisibility::ForceUnminimizeInvisible); + } + else + { + printf ("forcing unminimize\n"); + WindowManager::Default()->FocusWindowGroup(windows, + WindowManager::FocusVisibility::ForceUnminimizeOnCurrentDesktop); + } + } else WindowManager::Default()->FocusWindowGroup(windows, WindowManager::FocusVisibility::OnlyVisible); diff --git a/plugins/unityshell/src/PluginAdapter.cpp b/plugins/unityshell/src/PluginAdapter.cpp index ee95424e1..9be3d0f9d 100644 --- a/plugins/unityshell/src/PluginAdapter.cpp +++ b/plugins/unityshell/src/PluginAdapter.cpp @@ -489,6 +489,19 @@ PluginAdapter::IsWindowMapped(guint32 xid) return true; } +bool +PluginAdapter::IsWindowVisible(guint32 xid) +{ + Window win = (Window) xid; + CompWindow* window; + + window = m_Screen->findWindow(win); + if (window) + return !(window->state () & CompWindowStateHiddenMask); + + return true; +} + void PluginAdapter::Restore(guint32 xid) { @@ -609,13 +622,18 @@ PluginAdapter::FocusWindowGroup(std::vector<Window> window_ids, FocusVisibility * not going to be accessible by either switcher * or scale, so unconditionally unminimize those * windows when the launcher icon is activated */ - if (focus_visibility == WindowManager::FocusVisibility::ForceUnminimizeInvisible && - win->mapNum () == 0) + if ((focus_visibility == WindowManager::FocusVisibility::ForceUnminimizeOnCurrentDesktop && + WindowManager::Default ()->IsWindowOnCurrentDesktop(win->id ())) || + (focus_visibility == WindowManager::FocusVisibility::ForceUnminimizeInvisible && + win->mapNum () == 0)) win->unminimize (); else if ((any_mapped && !win->minimized()) || !any_mapped) { - win->raise(); - top_win = win; + if (WindowManager::Default ()->IsWindowOnCurrentDesktop (win->id ())) + { + win->raise(); + top_win = win; + } } } } diff --git a/plugins/unityshell/src/PluginAdapter.h b/plugins/unityshell/src/PluginAdapter.h index faa3d652c..153fe563c 100644 --- a/plugins/unityshell/src/PluginAdapter.h +++ b/plugins/unityshell/src/PluginAdapter.h @@ -117,6 +117,7 @@ public: bool IsWindowOnCurrentDesktop(guint xid); bool IsWindowObscured(guint xid); bool IsWindowMapped(guint xid); + bool IsWindowVisible(guint32 xid); void Restore(guint32 xid); void Minimize(guint32 xid); void Close(guint32 xid); diff --git a/plugins/unityshell/src/WindowManager.cpp b/plugins/unityshell/src/WindowManager.cpp index d723011b7..a242a78f0 100644 --- a/plugins/unityshell/src/WindowManager.cpp +++ b/plugins/unityshell/src/WindowManager.cpp @@ -68,6 +68,11 @@ class WindowManagerDummy : public WindowManager return true; } + bool IsWindowVisible(guint32 xid) + { + return true; + } + void Restore(guint32 xid) { g_debug("%s", G_STRFUNC); diff --git a/plugins/unityshell/src/WindowManager.h b/plugins/unityshell/src/WindowManager.h index d96ac69b6..6d2a0809d 100644 --- a/plugins/unityshell/src/WindowManager.h +++ b/plugins/unityshell/src/WindowManager.h @@ -48,7 +48,8 @@ public: enum class FocusVisibility { OnlyVisible, - ForceUnminimizeInvisible + ForceUnminimizeInvisible, + ForceUnminimizeOnCurrentDesktop }; static WindowManager* Default(); @@ -59,6 +60,7 @@ public: virtual bool IsWindowOnCurrentDesktop(guint32 xid) = 0; virtual bool IsWindowObscured(guint32 xid) = 0; virtual bool IsWindowMapped(guint32 xid) = 0; + virtual bool IsWindowVisible(guint32 xid) = 0; virtual void ShowDesktop() = 0; |
