summaryrefslogtreecommitdiff
diff options
-rw-r--r--plugins/unityshell/src/BamfLauncherIcon.cpp31
-rw-r--r--plugins/unityshell/src/PluginAdapter.cpp26
-rw-r--r--plugins/unityshell/src/PluginAdapter.h1
-rw-r--r--plugins/unityshell/src/WindowManager.cpp5
-rw-r--r--plugins/unityshell/src/WindowManager.h4
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;