summaryrefslogtreecommitdiff
path: root/plugins
diff options
authorSam Spilsbury <sam.spilsbury@canonical.com>2011-10-14 17:18:55 +0800
committerSam Spilsbury <sam.spilsbury@canonical.com>2011-10-14 17:18:55 +0800
commit6a22e0e1c272047a02077fa47426fdcf8eb866c3 (patch)
tree85eeae109feb084e28db1f629884502a95c7e041 /plugins
parent6a5bde18fd7b09a5e7f46cec7f54c72e1fd3a61a (diff)
Always unminimize the windows on the current workspace if none of the windows
of the activated launcher icon's application are visible on the current desktop when it is activated in the case that there are windows open on other desktops as well. Fixes LP#863114 Fixes LP: #863114 (bzr r1719.1.2)
Diffstat (limited to 'plugins')
-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;