Merge lp:~smspillaz/unity/unity.fix_877778 into lp:unity

Proposed by Sam Spilsbury
Status: Superseded
Proposed branch: lp:~smspillaz/unity/unity.fix_877778
Merge into: lp:unity
Diff against target: 1735 lines (+1169/-285) (has conflicts)
8 files modified
plugins/unityshell/src/UnityShowdesktopHandler.cpp (+215/-0)
plugins/unityshell/src/UnityShowdesktopHandler.h (+158/-0)
plugins/unityshell/src/inputremover.cpp (+7/-3)
plugins/unityshell/src/inputremover.h (+27/-5)
plugins/unityshell/src/unityshell.cpp (+179/-229)
plugins/unityshell/src/unityshell.h (+37/-47)
tests/CMakeLists.txt (+7/-1)
tests/test_showdesktop_handler.cpp (+539/-0)
Text conflict in tests/CMakeLists.txt
To merge this branch: bzr merge lp:~smspillaz/unity/unity.fix_877778
Reviewer Review Type Date Requested Status
Gord Allott (community) Needs Fixing
Review via email: mp+99153@code.launchpad.net

This proposal has been superseded by a proposal from 2012-03-30.

Description of the change

Fixes LP #877778 - Introduces tests for UnityShowdesktopHandler

== Problem ==

See LP #877778 - in fact, Show Desktop mode was completely broken, but the bug there is mainly about the fact that showdesktoped windows would be invisible in the spread. That's now fixed

== Solution ==

Fix UnityShowdesktopHandler brokenness, namely the animation going in the wrong direction, damage being applied at the wrong time, handlers not being removed when they should be. Also use PAINT_WINDOW_NO_CORE_INSTANCE_MASK when the window is fully transparent and set the opacity to MAXINT (since the scale plugin uses this to bypass the no paint mask)

== Test Coverage ==

Split UnityShowdesktopHandler out into a separate file, created UnityShowdesktopHandlerWindowInterface, UnityWindow inmplements this, test coverage created in test_showdesktop_handler.cpp using Google Mock and Google Test. Also see AP tests.

To post a comment you must log in.
Revision history for this message
Gord Allott (gordallott) wrote :

Great stuff, but needs to conform to our code style :) namely FooBar() methods and _foo instead of mFoo, quick sed should fix it

review: Needs Fixing
Revision history for this message
Tim Penhey (thumper) wrote :

On Wed 28 Mar 2012 21:47:21 NZDT, Gord Allott wrote:
> Review: Needs Fixing
>
> Great stuff, but needs to conform to our code style :) namely FooBar() methods and _foo instead of mFoo, quick sed should fix it

s/_foo/foo_/

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added file 'plugins/unityshell/src/UnityShowdesktopHandler.cpp'
--- plugins/unityshell/src/UnityShowdesktopHandler.cpp 1970-01-01 00:00:00 +0000
+++ plugins/unityshell/src/UnityShowdesktopHandler.cpp 2012-03-30 15:35:31 +0000
@@ -0,0 +1,215 @@
1// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
2/* Compiz unity plugin
3 * unity.h
4 *
5 * Copyright (c) 2010-11 Canonical Ltd.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 3
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * Your own copyright notice would go above. You are free to choose whatever
18 * licence you want, just take note that some compiz code is GPL and you will
19 * not be able to re-use it if you want to use a different licence.
20 */
21
22#include <glib.h>
23#include "UnityShowdesktopHandler.h"
24
25namespace unity
26{
27
28UnityShowdesktopHandlerWindowInterface::~UnityShowdesktopHandlerWindowInterface ()
29{
30}
31
32/* 300 ms */
33const unsigned int UnityShowdesktopHandler::fade_time = 300;
34std::list <UnityShowdesktopHandlerWindowInterface *> UnityShowdesktopHandler::animating_windows (0);
35
36bool UnityShowdesktopHandler::ShouldHide (UnityShowdesktopHandlerWindowInterface *wi)
37{
38 if (wi->OverrideRedirect ())
39 return false;
40
41 if (!wi->Managed ())
42 return false;
43
44 if (wi->Grabbed ())
45 return false;
46
47 if (wi->DesktopOrDock ())
48 return false;
49
50 if (wi->SkipTaskbarOrPager ())
51 return false;
52
53 if (wi->Hidden ())
54 if ((wi->ShowDesktopMode () || wi->Shaded ()))
55 return false;
56
57 return true;
58}
59
60guint32 UnityShowdesktopHandler::inhibiting_xid = 0;
61
62void
63UnityShowdesktopHandler::InhibitLeaveShowdesktopMode (guint32 xid)
64{
65 if (!inhibiting_xid)
66 inhibiting_xid = xid;
67}
68
69void
70UnityShowdesktopHandler::AllowLeaveShowdesktopMode (guint32 xid)
71{
72 if (inhibiting_xid == xid)
73 inhibiting_xid = 0;
74}
75
76guint32
77UnityShowdesktopHandler::InhibitingXid ()
78{
79 return inhibiting_xid;
80}
81
82UnityShowdesktopHandler::UnityShowdesktopHandler (UnityShowdesktopHandlerWindowInterface *wi) :
83 showdesktop_handler_window_interface_ (wi),
84 remover_ (wi->InputRemover ()),
85 state_ (StateVisible),
86 progress_ (0.0f)
87{
88}
89
90UnityShowdesktopHandler::~UnityShowdesktopHandler ()
91{
92}
93
94void UnityShowdesktopHandler::FadeOut ()
95{
96 if (state_ != StateVisible && state_ != StateFadeIn)
97 return;
98
99 state_ = UnityShowdesktopHandler::StateFadeOut;
100 progress_ = 0.0f;
101
102 was_hidden_ = showdesktop_handler_window_interface_->Hidden ();
103
104 if (!was_hidden_)
105 {
106 showdesktop_handler_window_interface_->Hide ();
107 showdesktop_handler_window_interface_->NotifyHidden ();
108 remover_->save ();
109 remover_->remove ();
110
111 if (std::find (animating_windows.begin(),
112 animating_windows.end(),
113 showdesktop_handler_window_interface_) == animating_windows.end())
114 animating_windows.push_back (showdesktop_handler_window_interface_);
115
116 }
117}
118
119void UnityShowdesktopHandler::FadeIn ()
120{
121 if (state_ != StateInvisible && state_ != StateFadeOut)
122 return;
123
124 state_ = UnityShowdesktopHandler::StateFadeIn;
125
126 if (!was_hidden_)
127 {
128 showdesktop_handler_window_interface_->Show ();
129 showdesktop_handler_window_interface_->NotifyShown ();
130 remover_->restore ();
131
132 if (std::find (animating_windows.begin(),
133 animating_windows.end(),
134 showdesktop_handler_window_interface_) == animating_windows.end())
135 animating_windows.push_back(showdesktop_handler_window_interface_);
136 }
137}
138
139UnityShowdesktopHandlerWindowInterface::PostPaintAction UnityShowdesktopHandler::Animate (unsigned int ms)
140{
141 float inc = ms / static_cast <float> (fade_time);
142
143 if (state_ == UnityShowdesktopHandler::StateFadeOut)
144 {
145 progress_ += inc;
146 if (progress_ >= 1.0f)
147 {
148 progress_ = 1.0f;
149 state_ = StateInvisible;
150 }
151 }
152 else if (state_ == StateFadeIn)
153 {
154 progress_ -= inc;
155 if (progress_ <= 0.0f)
156 {
157 progress_ = 0.0f;
158 state_ = StateVisible;
159 }
160 }
161 else if (state_ == StateVisible)
162 return UnityShowdesktopHandlerWindowInterface::PostPaintAction::Remove;
163 else if (state_ == StateInvisible)
164 return UnityShowdesktopHandlerWindowInterface::PostPaintAction::Wait;
165
166 return UnityShowdesktopHandlerWindowInterface::PostPaintAction::Damage;
167}
168
169void UnityShowdesktopHandler::PaintOpacity (unsigned short &opacity)
170{
171 if (progress_ == 1.0f || progress_ == 0.0f)
172 opacity = std::numeric_limits <unsigned short>::max ();
173 else
174 opacity *= (1.0f - progress_);
175}
176
177unsigned int UnityShowdesktopHandler::GetPaintMask ()
178{
179 return (progress_ == 1.0f) ? showdesktop_handler_window_interface_->NoCoreInstanceMask () : 0;
180}
181
182void UnityShowdesktopHandler::HandleShapeEvent ()
183{
184 /* Ignore sent events from the InputRemover */
185 if (remover_)
186 {
187 remover_->save ();
188 remover_->remove ();
189 }
190}
191
192void UnityShowdesktopHandler::WindowFocusChangeNotify ()
193{
194 if (showdesktop_handler_window_interface_->Minimized ())
195 {
196 for (UnityShowdesktopHandlerWindowInterface *w : animating_windows)
197 w->DisableFocus ();
198
199 showdesktop_handler_window_interface_->MoveFocusAway ();
200
201 for (UnityShowdesktopHandlerWindowInterface *w : animating_windows)
202 w->EnableFocus ();
203 }
204}
205
206void UnityShowdesktopHandler::UpdateFrameRegion (CompRegion &r)
207{
208 r = CompRegion ();
209
210 /* Ensure no other plugins can touch this frame region */
211 showdesktop_handler_window_interface_->OverrideFrameRegion (r);
212}
213
214}
215
0216
=== added file 'plugins/unityshell/src/UnityShowdesktopHandler.h'
--- plugins/unityshell/src/UnityShowdesktopHandler.h 1970-01-01 00:00:00 +0000
+++ plugins/unityshell/src/UnityShowdesktopHandler.h 2012-03-30 15:35:31 +0000
@@ -0,0 +1,158 @@
1// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
2/* Compiz unity plugin
3 * unity.h
4 *
5 * Copyright (c) 2010-11 Canonical Ltd.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 3
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * Your own copyright notice would go above. You are free to choose whatever
18 * licence you want, just take note that some compiz code is GPL and you will
19 * not be able to re-use it if you want to use a different licence.
20 */
21#ifndef UNITY_SHOWDESKTOP_HANDLER_H
22#define UNITY_SHOWDESKTOP_HANDLER_H
23
24#include <list>
25#include <algorithm>
26#include <core/region.h>
27
28#include <gio/gio.h>
29
30#include "inputremover.h"
31
32namespace unity
33{
34
35class UnityShowdesktopHandlerWindowInterface
36{
37 public:
38
39 enum class PostPaintAction {
40 Wait = 0,
41 Damage = 1,
42 Remove = 2
43 };
44
45 virtual ~UnityShowdesktopHandlerWindowInterface ();
46
47 void EnableFocus () { DoEnableFocus (); }
48 void DisableFocus () { DoDisableFocus (); }
49
50 bool OverrideRedirect () { return IsOverrideRedirect (); }
51 bool Managed () { return IsManaged (); }
52 bool Grabbed () { return IsGrabbed (); }
53 bool DesktopOrDock () { return IsDesktopOrDock (); }
54 bool SkipTaskbarOrPager () { return IsSkipTaskbarOrPager (); }
55 bool Hidden () { return IsHidden (); }
56 bool Shaded () { return IsShaded (); }
57 bool Minimized () { return IsMinimized (); }
58 bool ShowDesktopMode () { return IsInShowdesktopMode (); }
59 void OverrideFrameRegion (CompRegion &r) { return DoOverrideFrameRegion (r); }
60
61 void Hide () { DoHide (); }
62 void NotifyHidden () { DoNotifyHidden (); }
63 void Show () { DoShow (); }
64 void NotifyShown () { DoNotifyShown (); }
65 void MoveFocusAway () { DoMoveFocusAway (); }
66
67 PostPaintAction HandleAnimations (unsigned int ms) { return DoHandleAnimations (ms); }
68 void AddDamage () { DoAddDamage (); }
69
70 void DeleteHandler () { DoDeleteHandler (); }
71
72 unsigned int NoCoreInstanceMask () { return GetNoCoreInstanceMask (); }
73
74 compiz::WindowInputRemoverInterface::Ptr InputRemover () { return GetInputRemover (); }
75
76 protected:
77
78 virtual void DoEnableFocus () = 0;
79 virtual void DoDisableFocus () = 0;
80
81 virtual bool IsOverrideRedirect () = 0;
82 virtual bool IsManaged () = 0;
83 virtual bool IsGrabbed () = 0;
84 virtual bool IsDesktopOrDock () = 0;
85
86 virtual bool IsSkipTaskbarOrPager () = 0;
87 virtual bool IsHidden () = 0;
88 virtual bool IsInShowdesktopMode () = 0;
89 virtual bool IsShaded () = 0;
90
91 virtual bool IsMinimized () = 0;
92
93 virtual void DoOverrideFrameRegion (CompRegion &) = 0;
94
95 virtual void DoHide () = 0;
96 virtual void DoNotifyHidden () = 0;
97 virtual void DoShow () = 0;
98 virtual void DoNotifyShown () = 0;
99
100 virtual void DoMoveFocusAway () = 0;
101 virtual PostPaintAction DoHandleAnimations (unsigned int ms) = 0;
102 virtual void DoAddDamage () = 0;
103
104 virtual void DoDeleteHandler () = 0;
105
106 virtual unsigned int GetNoCoreInstanceMask () = 0;
107
108 virtual compiz::WindowInputRemoverInterface::Ptr GetInputRemover () = 0;
109};
110
111class UnityShowdesktopHandler
112{
113 public:
114
115 UnityShowdesktopHandler (UnityShowdesktopHandlerWindowInterface *uwi);
116 ~UnityShowdesktopHandler ();
117
118 typedef enum {
119 StateVisible = 0,
120 StateFadeOut = 1,
121 StateFadeIn = 2,
122 StateInvisible = 3
123 } State;
124
125public:
126
127 void FadeOut ();
128 void FadeIn ();
129 UnityShowdesktopHandlerWindowInterface::PostPaintAction Animate (unsigned int ms);
130 void PaintOpacity (unsigned short &opacity);
131 unsigned int GetPaintMask ();
132 void HandleShapeEvent ();
133 void WindowFocusChangeNotify ();
134 void UpdateFrameRegion (CompRegion &r);
135
136 UnityShowdesktopHandler::State GetState ();
137
138 static const unsigned int fade_time;
139 static std::list <UnityShowdesktopHandlerWindowInterface *> animating_windows;
140 static bool ShouldHide (UnityShowdesktopHandlerWindowInterface *);
141 static void InhibitLeaveShowdesktopMode (guint32 xid);
142 static void AllowLeaveShowdesktopMode (guint32 xid);
143 static guint32 InhibitingXid ();
144
145private:
146
147 UnityShowdesktopHandlerWindowInterface *showdesktop_handler_window_interface_;
148 compiz::WindowInputRemoverInterface::Ptr remover_;
149 UnityShowdesktopHandler::State state_;
150 float progress_;
151 bool was_hidden_;
152 static guint32 inhibiting_xid;
153};
154
155}
156
157
158#endif
0159
=== modified file 'plugins/unityshell/src/inputremover.cpp'
--- plugins/unityshell/src/inputremover.cpp 2011-09-28 16:25:42 +0000
+++ plugins/unityshell/src/inputremover.cpp 2012-03-30 15:35:31 +0000
@@ -24,6 +24,10 @@
24#include <cstdio>24#include <cstdio>
25#include <cstring>25#include <cstring>
2626
27compiz::WindowInputRemoverInterface::~WindowInputRemoverInterface ()
28{
29}
30
27compiz::WindowInputRemover::WindowInputRemover (Display *dpy,31compiz::WindowInputRemover::WindowInputRemover (Display *dpy,
28 Window xid) :32 Window xid) :
29 mDpy (dpy),33 mDpy (dpy),
@@ -203,7 +207,7 @@
203}207}
204208
205bool209bool
206compiz::WindowInputRemover::save ()210compiz::WindowInputRemover::saveInput ()
207{211{
208 XRectangle *rects;212 XRectangle *rects;
209 int count = 0, ordering;213 int count = 0, ordering;
@@ -267,7 +271,7 @@
267}271}
268272
269bool273bool
270compiz::WindowInputRemover::remove ()274compiz::WindowInputRemover::removeInput ()
271{275{
272 if (!mNInputRects)276 if (!mNInputRects)
273 if (!save ())277 if (!save ())
@@ -290,7 +294,7 @@
290}294}
291295
292bool296bool
293compiz::WindowInputRemover::restore ()297compiz::WindowInputRemover::restoreInput ()
294{298{
295 XShapeSelectInput (mDpy, mShapeWindow, NoEventMask);299 XShapeSelectInput (mDpy, mShapeWindow, NoEventMask);
296300
297301
=== modified file 'plugins/unityshell/src/inputremover.h'
--- plugins/unityshell/src/inputremover.h 2011-09-13 12:52:31 +0000
+++ plugins/unityshell/src/inputremover.h 2012-03-30 15:35:31 +0000
@@ -22,6 +22,8 @@
22#ifndef _COMPIZ_INPUTREMOVER_H22#ifndef _COMPIZ_INPUTREMOVER_H
23#define _COMPIZ_INPUTREMOVER_H23#define _COMPIZ_INPUTREMOVER_H
2424
25#include <memory>
26
25#include <X11/Xlib.h>27#include <X11/Xlib.h>
26#include <X11/Xatom.h>28#include <X11/Xatom.h>
27#include <X11/extensions/shape.h>29#include <X11/extensions/shape.h>
@@ -29,19 +31,39 @@
29// Will be merged back into compiz31// Will be merged back into compiz
30namespace compiz {32namespace compiz {
3133
32class WindowInputRemover34class WindowInputRemoverInterface
35{
36 public:
37
38 typedef std::shared_ptr <WindowInputRemoverInterface> Ptr;
39
40 bool save () { return saveInput (); }
41 bool remove () { return removeInput (); }
42 bool restore () { return restoreInput (); }
43
44 virtual ~WindowInputRemoverInterface ();
45
46 protected:
47
48 virtual bool saveInput () = 0;
49 virtual bool removeInput () = 0;
50 virtual bool restoreInput () = 0;
51};
52
53class WindowInputRemover :
54 public WindowInputRemoverInterface
33{55{
34public:56public:
3557
36 WindowInputRemover (Display *, Window xid);58 WindowInputRemover (Display *, Window xid);
37 ~WindowInputRemover ();59 ~WindowInputRemover ();
3860
39 bool save ();
40 bool remove ();
41 bool restore ();
42
43private:61private:
4462
63 bool saveInput ();
64 bool removeInput ();
65 bool restoreInput ();
66
45 void sendShapeNotify ();67 void sendShapeNotify ();
4668
47 Display *mDpy;69 Display *mDpy;
4870
=== modified file 'plugins/unityshell/src/unityshell.cpp'
--- plugins/unityshell/src/unityshell.cpp 2012-03-30 04:00:05 +0000
+++ plugins/unityshell/src/unityshell.cpp 2012-03-30 15:35:31 +0000
@@ -904,7 +904,9 @@
904{904{
905 for (CompWindow *w : screen->windows ())905 for (CompWindow *w : screen->windows ())
906 {906 {
907 if (UnityShowdesktopHandler::shouldHide (w))907 UnityWindow *uw = UnityWindow::get (w);
908
909 if (UnityShowdesktopHandler::ShouldHide (static_cast <UnityShowdesktopHandlerWindowInterface *> (uw)))
908 {910 {
909 UnityWindow::get (w)->enterShowDesktop ();911 UnityWindow::get (w)->enterShowDesktop ();
910 // the animation plugin does strange things here ...912 // the animation plugin does strange things here ...
@@ -941,16 +943,16 @@
941 /* Where a window is inhibiting, only allow the window943 /* Where a window is inhibiting, only allow the window
942 * that is inhibiting the leave show desktop to actually944 * that is inhibiting the leave show desktop to actually
943 * fade in again - all other windows should remain faded out */945 * fade in again - all other windows should remain faded out */
944 if (!UnityShowdesktopHandler::inhibitingXid ())946 if (!UnityShowdesktopHandler::InhibitingXid ())
945 {947 {
946 for (CompWindow *cw : screen->windows ())948 for (CompWindow *cw : screen->windows ())
947 {949 {
948 if (cw->inShowDesktopMode ())950 if (cw->inShowDesktopMode ())
949 {951 {
950 UnityWindow::get (cw)->leaveShowDesktop ();952 UnityWindow::get (cw)->leaveShowDesktop ();
951 // the animation plugin does strange things here ...953 // the animation plugin does strange things here ...
952 // if this notification is sent954 // if this notification is sent
953 //cw->windowNotify (CompWindowNotifyLeaveShowDesktopMode);955 //cw->windowNotify (CompWindowNotifyLeaveShowDesktopMode);
954 }956 }
955 }957 }
956958
@@ -960,12 +962,12 @@
960 }962 }
961 else963 else
962 {964 {
963 CompWindow *cw = screen->findWindow (UnityShowdesktopHandler::inhibitingXid ());965 CompWindow *cw = screen->findWindow (UnityShowdesktopHandler::InhibitingXid ());
964 if (cw)966 if (cw)
965 {967 {
966 if (cw->inShowDesktopMode ())968 if (cw->inShowDesktopMode ())
967 {969 {
968 UnityWindow::get (cw)->leaveShowDesktop ();970 UnityWindow::get (cw)->leaveShowDesktop ();
969 }971 }
970 }972 }
971 }973 }
@@ -974,227 +976,159 @@
974void UnityWindow::enterShowDesktop ()976void UnityWindow::enterShowDesktop ()
975{977{
976 if (!mShowdesktopHandler)978 if (!mShowdesktopHandler)
977 mShowdesktopHandler = new UnityShowdesktopHandler (window);979 mShowdesktopHandler = new UnityShowdesktopHandler (static_cast <UnityShowdesktopHandlerWindowInterface *> (this));
978980
979 window->setShowDesktopMode (true);981 window->setShowDesktopMode (true);
980 mShowdesktopHandler->fadeOut ();982 mShowdesktopHandler->FadeOut ();
981}983}
982984
983void UnityWindow::leaveShowDesktop ()985void UnityWindow::leaveShowDesktop ()
984{986{
985 if (mShowdesktopHandler)987 if (mShowdesktopHandler)
986 {988 {
987 mShowdesktopHandler->fadeIn ();989 mShowdesktopHandler->FadeIn ();
988 window->setShowDesktopMode (false);990 window->setShowDesktopMode (false);
989 delete mShowdesktopHandler;
990 mShowdesktopHandler = NULL;
991 }991 }
992}992}
993993
994void UnityWindow::activate ()994void UnityWindow::activate ()
995{995{
996 UnityShowdesktopHandler::inhibitLeaveShowdesktopMode (window->id ());996 UnityShowdesktopHandler::InhibitLeaveShowdesktopMode (window->id ());
997 window->activate ();997 window->activate ();
998 UnityShowdesktopHandler::allowLeaveShowdesktopMode (window->id ());998 UnityShowdesktopHandler::AllowLeaveShowdesktopMode (window->id ());
999}999}
10001000
1001bool UnityWindow::handleAnimations (unsigned int ms)1001void UnityWindow::DoEnableFocus ()
1002{1002{
1003 window->focusSetEnabled (this, true);
1004}
1005
1006void UnityWindow::DoDisableFocus ()
1007{
1008 window->focusSetEnabled (this, false);
1009}
1010
1011bool UnityWindow::IsOverrideRedirect ()
1012{
1013 return window->overrideRedirect ();
1014}
1015
1016bool UnityWindow::IsManaged ()
1017{
1018 return window->managed ();
1019}
1020
1021bool UnityWindow::IsGrabbed ()
1022{
1023 return window->grabbed ();
1024}
1025
1026bool UnityWindow::IsDesktopOrDock ()
1027{
1028 return (window->type () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask));
1029}
1030
1031bool UnityWindow::IsSkipTaskbarOrPager ()
1032{
1033 return (window->state () & (CompWindowStateSkipTaskbarMask | CompWindowStateSkipPagerMask));
1034}
1035
1036bool UnityWindow::IsInShowdesktopMode ()
1037{
1038 return window->inShowDesktopMode ();
1039}
1040
1041bool UnityWindow::IsHidden ()
1042{
1043 return window->state () & CompWindowStateHiddenMask;
1044}
1045
1046bool UnityWindow::IsShaded ()
1047{
1048 return window->shaded ();
1049}
1050
1051bool UnityWindow::IsMinimized ()
1052{
1053 return window->minimized ();
1054}
1055
1056void UnityWindow::DoOverrideFrameRegion (CompRegion &region)
1057{
1058 unsigned int oldUpdateFrameRegionIndex = window->updateFrameRegionGetCurrentIndex ();
1059
1060 window->updateFrameRegionSetCurrentIndex (MAXSHORT);
1061 window->updateFrameRegion (region);
1062 window->updateFrameRegionSetCurrentIndex (oldUpdateFrameRegionIndex);
1063}
1064
1065void UnityWindow::DoHide ()
1066{
1067 window->changeState (window->state () | CompWindowStateHiddenMask);
1068}
1069
1070void UnityWindow::DoNotifyHidden ()
1071{
1072 window->windowNotify (CompWindowNotifyHide);
1073}
1074
1075void UnityWindow::DoShow ()
1076{
1077 window->changeState (window->state () & ~(CompWindowStateHiddenMask));
1078}
1079
1080void UnityWindow::DoNotifyShown ()
1081{
1082 window->windowNotify (CompWindowNotifyShow);
1083}
1084
1085void UnityWindow::DoMoveFocusAway ()
1086{
1087 window->moveInputFocusToOtherWindow ();
1088}
1089
1090UnityShowdesktopHandlerWindowInterface::PostPaintAction UnityWindow::DoHandleAnimations (unsigned int ms)
1091{
1092 UnityShowdesktopHandlerWindowInterface::PostPaintAction action = UnityShowdesktopHandlerWindowInterface::PostPaintAction::Wait;
1093
1003 if (mShowdesktopHandler)1094 if (mShowdesktopHandler)
1004 if (mShowdesktopHandler->animate (ms))1095 action = mShowdesktopHandler->Animate (ms);
1005 {1096
1006 delete mShowdesktopHandler;1097 return action;
1007 mShowdesktopHandler = NULL;1098}
1008 return true;1099
1009 }1100void UnityWindow::DoAddDamage ()
10101101{
1011 return false;1102 cWindow->addDamage ();
1012}1103}
10131104
1014/* 300 ms */1105void UnityWindow::DoDeleteHandler ()
1015const unsigned int UnityShowdesktopHandler::fade_time = 300;1106{
1016CompWindowList UnityShowdesktopHandler::animating_windows (0);1107 delete mShowdesktopHandler;
10171108 mShowdesktopHandler = NULL;
1018bool UnityShowdesktopHandler::shouldHide (CompWindow *w)1109}
1019{1110
1020 if (w->overrideRedirect ())1111compiz::WindowInputRemoverInterface::Ptr
1021 return false;1112UnityWindow::GetInputRemover ()
10221113{
1023 if (!w->managed ())1114 return compiz::WindowInputRemoverInterface::Ptr (new compiz::WindowInputRemover (screen->dpy (), window->id ()));
1024 return false;1115}
10251116
1026 if (w->grabbed ())1117unsigned int
1027 return false;1118UnityWindow::GetNoCoreInstanceMask ()
10281119{
1029 if (w->wmType () & (CompWindowTypeDesktopMask |1120 return PAINT_WINDOW_NO_CORE_INSTANCE_MASK;
1030 CompWindowTypeDockMask))1121}
1031 return false;1122
10321123void UnityWindow::handleEvent (XEvent *event)
1033 if (w->state () & (CompWindowStateSkipPagerMask |1124{
1034 CompWindowStateSkipTaskbarMask))1125 if (screen->XShape () &&
1035 return false;1126 event->type == screen->shapeEvent () + ShapeNotify &&
1036
1037 if ((w->state () & CompWindowStateHiddenMask))
1038 if (!(w->inShowDesktopMode () || w->shaded ()))
1039 return false;
1040
1041 return true;
1042}
1043
1044guint32 UnityShowdesktopHandler::mInhibitingXid = 0;
1045
1046void
1047UnityShowdesktopHandler::inhibitLeaveShowdesktopMode (guint32 xid)
1048{
1049 if (!mInhibitingXid)
1050 mInhibitingXid = xid;
1051}
1052
1053void
1054UnityShowdesktopHandler::allowLeaveShowdesktopMode (guint32 xid)
1055{
1056 if (mInhibitingXid == xid)
1057 mInhibitingXid = 0;
1058}
1059
1060guint32
1061UnityShowdesktopHandler::inhibitingXid ()
1062{
1063 return mInhibitingXid;
1064}
1065
1066UnityShowdesktopHandler::UnityShowdesktopHandler (CompWindow *w) :
1067 mWindow (w),
1068 mRemover (new compiz::WindowInputRemover (screen->dpy (), w->id ())),
1069 mState (Visible),
1070 mProgress (0.0f)
1071{
1072}
1073
1074UnityShowdesktopHandler::~UnityShowdesktopHandler ()
1075{
1076 if (mRemover)
1077 delete mRemover;
1078}
1079
1080void UnityShowdesktopHandler::fadeOut ()
1081{
1082 mState = UnityShowdesktopHandler::FadeOut;
1083 mProgress = 1.0f;
1084
1085 mWasHidden = mWindow->state () & CompWindowStateHiddenMask;
1086
1087 if (!mWasHidden)
1088 {
1089 mWindow->changeState (mWindow->state () | CompWindowStateHiddenMask);
1090 mWindow->windowNotify (CompWindowNotifyHide);
1091 mRemover->save ();
1092 mRemover->remove ();
1093 }
1094
1095 CompositeWindow::get (mWindow)->addDamage ();
1096
1097 if (std::find (animating_windows.begin(),
1098 animating_windows.end(),
1099 mWindow) == animating_windows.end())
1100 animating_windows.push_back(mWindow);
1101}
1102
1103void UnityShowdesktopHandler::fadeIn ()
1104{
1105 mState = UnityShowdesktopHandler::FadeIn;
1106
1107 if (!mWasHidden)
1108 {
1109 mWindow->changeState (mWindow->state () & ~CompWindowStateHiddenMask);
1110 mWindow->windowNotify (CompWindowNotifyShow);
1111 mRemover->restore ();
1112 }
1113
1114 CompositeWindow::get (mWindow)->addDamage ();
1115}
1116
1117bool UnityShowdesktopHandler::animate (unsigned int ms)
1118{
1119 float inc = fade_time / (float) ms;
1120
1121 if (mState == UnityShowdesktopHandler::FadeOut)
1122 {
1123 mProgress -= inc;
1124 if (mProgress <= 0.0f)
1125 {
1126 mProgress = 0.0f;
1127 mState = Invisible;
1128 }
1129 else
1130 CompositeWindow::get (mWindow)->addDamage ();
1131 }
1132 else if (mState == FadeIn)
1133 {
1134 mProgress += inc;
1135 if (mProgress >= 1.0f)
1136 {
1137 mProgress = 1.0f;
1138 mState = Visible;
1139
1140 return true;
1141 }
1142 else
1143 CompositeWindow::get (mWindow)->addDamage ();
1144 }
1145
1146 return false;
1147}
1148
1149void UnityShowdesktopHandler::paintAttrib (GLWindowPaintAttrib &attrib)
1150{
1151 attrib.opacity = static_cast <int> (static_cast <float> (attrib.opacity) * mProgress);
1152}
1153
1154unsigned int UnityShowdesktopHandler::getPaintMask ()
1155{
1156 return 0;
1157}
1158
1159void UnityShowdesktopHandler::handleEvent (XEvent *event)
1160{
1161 /* Ignore sent events from the InputRemover */
1162 if (screen->XShape () && event->type ==
1163 screen->shapeEvent () + ShapeNotify &&
1164 !event->xany.send_event)1127 !event->xany.send_event)
1165 {1128 {
1166 if (mRemover)1129 if (mShowdesktopHandler)
1167 {1130 mShowdesktopHandler->HandleShapeEvent ();
1168 mRemover->save ();1131 }
1169 mRemover->remove ();
1170 }
1171 }
1172}
1173
1174void UnityShowdesktopHandler::windowNotify (CompWindowNotify n)
1175{
1176 if (n == CompWindowNotifyFocusChange && mWindow->minimized ())
1177 {
1178 for (CompWindow *w : animating_windows)
1179 w->focusSetEnabled (UnityWindow::get (w), false);
1180
1181 mWindow->moveInputFocusToOtherWindow ();
1182
1183 for (CompWindow *w : animating_windows)
1184 w->focusSetEnabled (UnityWindow::get (w), true);
1185 }
1186}
1187
1188void UnityShowdesktopHandler::updateFrameRegion (CompRegion &r)
1189{
1190 unsigned int oldUpdateFrameRegionIndex;
1191 r = CompRegion ();
1192
1193 /* Ensure no other plugins can touch this frame region */
1194 oldUpdateFrameRegionIndex = mWindow->updateFrameRegionGetCurrentIndex ();
1195 mWindow->updateFrameRegionSetCurrentIndex (MAXSHORT);
1196 mWindow->updateFrameRegion (r);
1197 mWindow->updateFrameRegionSetCurrentIndex (oldUpdateFrameRegionIndex);
1198}1132}
11991133
1200/* called whenever we need to repaint parts of the screen */1134/* called whenever we need to repaint parts of the screen */
@@ -1275,16 +1209,10 @@
12751209
1276void UnityScreen::preparePaint(int ms)1210void UnityScreen::preparePaint(int ms)
1277{1211{
1278 CompWindowList remove_windows;
1279
1280 cScreen->preparePaint(ms);1212 cScreen->preparePaint(ms);
12811213
1282 for (CompWindow *w : UnityShowdesktopHandler::animating_windows)1214 for (UnityShowdesktopHandlerWindowInterface *wi : UnityShowdesktopHandler::animating_windows)
1283 if (UnityWindow::get (w)->handleAnimations (ms))1215 wi->HandleAnimations (ms);
1284 remove_windows.push_back(w);
1285
1286 for (CompWindow *w : remove_windows)
1287 UnityShowdesktopHandler::animating_windows.remove (w);
12881216
1289 if (damaged)1217 if (damaged)
1290 {1218 {
@@ -1294,6 +1222,28 @@
12941222
1295}1223}
12961224
1225void UnityScreen::donePaint()
1226{
1227 std::list <UnityShowdesktopHandlerWindowInterface *> remove_windows;
1228
1229 for (UnityShowdesktopHandlerWindowInterface *wi : UnityShowdesktopHandler::animating_windows)
1230 {
1231 UnityShowdesktopHandlerWindowInterface::PostPaintAction action = wi->HandleAnimations (0);
1232 if (action == UnityShowdesktopHandlerWindowInterface::PostPaintAction::Remove)
1233 remove_windows.push_back(wi);
1234 else if (action == UnityShowdesktopHandlerWindowInterface::PostPaintAction::Damage)
1235 wi->AddDamage ();
1236 }
1237
1238 for (UnityShowdesktopHandlerWindowInterface *wi : remove_windows)
1239 {
1240 wi->DeleteHandler ();
1241 UnityShowdesktopHandler::animating_windows.remove (wi);
1242 }
1243
1244 cScreen->donePaint ();
1245}
1246
1297/* Grab changed nux regions and add damage rects for them */1247/* Grab changed nux regions and add damage rects for them */
1298void UnityScreen::damageNuxRegions()1248void UnityScreen::damageNuxRegions()
1299{1249{
@@ -1429,7 +1379,7 @@
1429 break;1379 break;
1430 }1380 }
1431 case MapRequest:1381 case MapRequest:
1432 UnityShowdesktopHandler::inhibitLeaveShowdesktopMode (event->xmaprequest.window);1382 UnityShowdesktopHandler::InhibitLeaveShowdesktopMode (event->xmaprequest.window);
1433 break;1383 break;
1434 default:1384 default:
1435 if (screen->shapeEvent () + ShapeNotify == event->type)1385 if (screen->shapeEvent () + ShapeNotify == event->type)
@@ -1441,8 +1391,7 @@
1441 {1391 {
1442 UnityWindow *uw = UnityWindow::get (w);1392 UnityWindow *uw = UnityWindow::get (w);
14431393
1444 if (uw->mShowdesktopHandler)1394 uw->handleEvent(event);
1445 uw->mShowdesktopHandler->handleEvent(event);
1446 }1395 }
1447 }1396 }
1448 break;1397 break;
@@ -1463,7 +1412,7 @@
1463 }1412 }
1464 break;1413 break;
1465 case MapRequest:1414 case MapRequest:
1466 UnityShowdesktopHandler::allowLeaveShowdesktopMode (event->xmaprequest.window);1415 UnityShowdesktopHandler::AllowLeaveShowdesktopMode (event->xmaprequest.window);
1467 break;1416 break;
1468 }1417 }
14691418
@@ -2149,8 +2098,8 @@
2149 }2098 }
2150 else if (mShowdesktopHandler)2099 else if (mShowdesktopHandler)
2151 {2100 {
2152 mShowdesktopHandler->paintAttrib (wAttrib);2101 mShowdesktopHandler->PaintOpacity (wAttrib.opacity);
2153 mask |= mShowdesktopHandler->getPaintMask ();2102 mask |= mShowdesktopHandler->GetPaintMask ();
2154 }2103 }
21552104
2156 if (uScreen->panel_controller_->GetTrayXid () == window->id () && !uScreen->allowWindowPaint)2105 if (uScreen->panel_controller_->GetTrayXid () == window->id () && !uScreen->allowWindowPaint)
@@ -2280,7 +2229,7 @@
2280}2229}
22812230
2282bool2231bool
2283UnityWindow::minimized ()2232UnityWindow::Minimized ()
2284{2233{
2285 return mMinimizeHandler.get () != nullptr;2234 return mMinimizeHandler.get () != nullptr;
2286}2235}
@@ -2354,7 +2303,8 @@
2354 }2303 }
2355 else if (mShowdesktopHandler)2304 else if (mShowdesktopHandler)
2356 {2305 {
2357 mShowdesktopHandler->windowNotify (n);2306 if (n == CompWindowNotifyFocusChange)
2307 mShowdesktopHandler->WindowFocusChangeNotify ();
2358 }2308 }
23592309
2360 // We do this after the notify to ensure input focus has actually been moved.2310 // We do this after the notify to ensure input focus has actually been moved.
@@ -2393,7 +2343,7 @@
2393 if (mMinimizeHandler)2343 if (mMinimizeHandler)
2394 mMinimizeHandler->updateFrameRegion (region);2344 mMinimizeHandler->updateFrameRegion (region);
2395 else if (mShowdesktopHandler)2345 else if (mShowdesktopHandler)
2396 mShowdesktopHandler->updateFrameRegion (region);2346 mShowdesktopHandler->UpdateFrameRegion (region);
2397 else2347 else
2398 window->updateFrameRegion (region);2348 window->updateFrameRegion (region);
2399}2349}
@@ -2933,7 +2883,7 @@
2933 window->minimize ();2883 window->minimize ();
2934 }2884 }
29352885
2936 UnityShowdesktopHandler::animating_windows.remove (window);2886 UnityShowdesktopHandler::animating_windows.remove (static_cast <UnityShowdesktopHandlerWindowInterface *> (this));
29372887
2938 if (mShowdesktopHandler)2888 if (mShowdesktopHandler)
2939 delete mShowdesktopHandler;2889 delete mShowdesktopHandler;
29402890
=== modified file 'plugins/unityshell/src/unityshell.h'
--- plugins/unityshell/src/unityshell.h 2012-03-30 04:00:05 +0000
+++ plugins/unityshell/src/unityshell.h 2012-03-30 15:35:31 +0000
@@ -50,6 +50,7 @@
50#include "SwitcherController.h"50#include "SwitcherController.h"
51#include "UBusWrapper.h"51#include "UBusWrapper.h"
52#include "UnityshellPrivate.h"52#include "UnityshellPrivate.h"
53#include "UnityShowdesktopHandler.h"
53#ifndef USE_GLES54#ifndef USE_GLES
54#include "ScreenEffectFramebufferObject.h"55#include "ScreenEffectFramebufferObject.h"
55#endif56#endif
@@ -64,51 +65,6 @@
64namespace unity65namespace unity
65{66{
6667
67class UnityShowdesktopHandler
68{
69 public:
70
71 UnityShowdesktopHandler (CompWindow *w);
72 ~UnityShowdesktopHandler ();
73
74 typedef enum {
75 Visible = 0,
76 FadeOut = 1,
77 FadeIn = 2,
78 Invisible = 3
79 } State;
80
81public:
82
83 void fadeOut ();
84 void fadeIn ();
85 bool animate (unsigned int ms);
86 void paintAttrib (GLWindowPaintAttrib &attrib);
87 unsigned int getPaintMask ();
88 void handleEvent (XEvent *);
89 void windowNotify (CompWindowNotify n);
90 void updateFrameRegion (CompRegion &r);
91
92 UnityShowdesktopHandler::State state ();
93
94 static const unsigned int fade_time;
95 static CompWindowList animating_windows;
96 static bool shouldHide (CompWindow *);
97 static void inhibitLeaveShowdesktopMode (guint32 xid);
98 static void allowLeaveShowdesktopMode (guint32 xid);
99 static guint32 inhibitingXid ();
100
101private:
102
103 CompWindow *mWindow;
104 compiz::WindowInputRemover *mRemover;
105 UnityShowdesktopHandler::State mState;
106 float mProgress;
107 bool mWasHidden;
108 static guint32 mInhibitingXid;
109};
110
111
112/* base screen class */68/* base screen class */
113class UnityScreen :69class UnityScreen :
114 public unity::debug::Introspectable,70 public unity::debug::Introspectable,
@@ -145,6 +101,7 @@
145101
146 void preparePaint (int ms);102 void preparePaint (int ms);
147 void paintFboForOutput (CompOutput *output);103 void paintFboForOutput (CompOutput *output);
104 void donePaint ();
148105
149 void RaiseInputWindows();106 void RaiseInputWindows();
150107
@@ -351,6 +308,7 @@
351class UnityWindow :308class UnityWindow :
352 public WindowInterface,309 public WindowInterface,
353 public GLWindowInterface,310 public GLWindowInterface,
311 public UnityShowdesktopHandlerWindowInterface,
354 public BaseSwitchWindow,312 public BaseSwitchWindow,
355 public PluginClassHandler <UnityWindow, CompWindow>313 public PluginClassHandler <UnityWindow, CompWindow>
356{314{
@@ -365,7 +323,7 @@
365323
366 void minimize ();324 void minimize ();
367 void unminimize ();325 void unminimize ();
368 bool minimized ();326 bool Minimized ();
369 bool focus ();327 bool focus ();
370 void activate ();328 void activate ();
371329
@@ -407,7 +365,9 @@
407365
408 void enterShowDesktop ();366 void enterShowDesktop ();
409 void leaveShowDesktop ();367 void leaveShowDesktop ();
410 bool handleAnimations (unsigned int ms);368 bool HandleAnimations (unsigned int ms);
369
370 void handleEvent (XEvent *event);
411371
412 typedef compiz::CompizMinimizedWindowHandler<UnityScreen, UnityWindow>372 typedef compiz::CompizMinimizedWindowHandler<UnityScreen, UnityWindow>
413 UnityMinimizedHandler;373 UnityMinimizedHandler;
@@ -419,6 +379,36 @@
419379
420 guint focusdesktop_handle_;380 guint focusdesktop_handle_;
421 static gboolean FocusDesktopTimeout(gpointer data);381 static gboolean FocusDesktopTimeout(gpointer data);
382
383 void DoEnableFocus ();
384 void DoDisableFocus ();
385
386 bool IsOverrideRedirect ();
387 bool IsManaged ();
388 bool IsGrabbed ();
389 bool IsDesktopOrDock ();
390 bool IsSkipTaskbarOrPager ();
391 bool IsHidden ();
392 bool IsInShowdesktopMode ();
393 bool IsShaded ();
394 bool IsMinimized ();
395 void DoOverrideFrameRegion (CompRegion &r);
396
397 void DoHide ();
398 void DoNotifyHidden ();
399 void DoShow ();
400 void DoNotifyShown ();
401
402 void DoAddDamage ();
403 UnityShowdesktopHandlerWindowInterface::PostPaintAction DoHandleAnimations (unsigned int ms);
404
405 void DoMoveFocusAway ();
406
407 void DoDeleteHandler ();
408
409 unsigned int GetNoCoreInstanceMask ();
410
411 compiz::WindowInputRemoverInterface::Ptr GetInputRemover ();
422};412};
423413
424414
425415
=== modified file 'tests/CMakeLists.txt'
--- tests/CMakeLists.txt 2012-03-29 20:25:35 +0000
+++ tests/CMakeLists.txt 2012-03-30 15:35:31 +0000
@@ -33,7 +33,7 @@
33 )33 )
34add_definitions (${CFLAGS})34add_definitions (${CFLAGS})
3535
36set (LIBS ${TEST_UNIT_DEPS_LIBRARIES} "-lunity-core-${UNITY_API_VERSION} -lm")36set (LIBS ${TEST_UNIT_DEPS_LIBRARIES} "-lunity-core-${UNITY_API_VERSION} -lcompiz_core -lm")
37link_libraries (${LIBS})37link_libraries (${LIBS})
3838
39set (LIB_PATHS ${TEST_UNIT_DEPS_LIBRARY_DIRS})39set (LIB_PATHS ${TEST_UNIT_DEPS_LIBRARY_DIRS})
@@ -138,6 +138,11 @@
138 test_main_xless.cpp138 test_main_xless.cpp
139 test_grabhandle.cpp139 test_grabhandle.cpp
140 test_unityshell_private.cpp140 test_unityshell_private.cpp
141<<<<<<< TREE
142=======
143 test_lensview_impl.cpp
144 test_showdesktop_handler.cpp
145>>>>>>> MERGE-SOURCE
141 ${UNITY_SRC}/AbstractLauncherIcon.cpp146 ${UNITY_SRC}/AbstractLauncherIcon.cpp
142 ${UNITY_SRC}/AbstractShortcutHint.h147 ${UNITY_SRC}/AbstractShortcutHint.h
143 ${UNITY_SRC}/Animator.cpp148 ${UNITY_SRC}/Animator.cpp
@@ -157,6 +162,7 @@
157 ${UNITY_SRC}/Timer.cpp162 ${UNITY_SRC}/Timer.cpp
158 ${UNITY_SRC}/UnityshellPrivate.cpp163 ${UNITY_SRC}/UnityshellPrivate.cpp
159 ${UNITY_SRC}/WindowManager.cpp164 ${UNITY_SRC}/WindowManager.cpp
165 ${UNITY_SRC}/UnityShowdesktopHandler.cpp
160 ${CMAKE_SOURCE_DIR}/plugins/unity-mt-grab-handles/src/unity-mt-grab-handle.cpp166 ${CMAKE_SOURCE_DIR}/plugins/unity-mt-grab-handles/src/unity-mt-grab-handle.cpp
161 ${CMAKE_SOURCE_DIR}/plugins/unity-mt-grab-handles/src/unity-mt-grab-handle-group.cpp167 ${CMAKE_SOURCE_DIR}/plugins/unity-mt-grab-handles/src/unity-mt-grab-handle-group.cpp
162 ${CMAKE_SOURCE_DIR}/plugins/unity-mt-grab-handles/src/unity-mt-grab-handle-impl-factory.cpp168 ${CMAKE_SOURCE_DIR}/plugins/unity-mt-grab-handles/src/unity-mt-grab-handle-impl-factory.cpp
163169
=== added file 'tests/test_showdesktop_handler.cpp'
--- tests/test_showdesktop_handler.cpp 1970-01-01 00:00:00 +0000
+++ tests/test_showdesktop_handler.cpp 2012-03-30 15:35:31 +0000
@@ -0,0 +1,539 @@
1#include <list>
2#include <algorithm>
3#include <gtest/gtest.h>
4#include <gmock/gmock.h>
5#include <UnityShowdesktopHandler.h>
6
7using namespace unity;
8using ::testing::_;
9using ::testing::Return;
10using ::testing::Invoke;
11using ::testing::InSequence;
12
13compiz::WindowInputRemoverInterface::~WindowInputRemoverInterface () {}
14
15class MockWindowInputRemover :
16 public compiz::WindowInputRemoverInterface
17{
18 public:
19
20 MockWindowInputRemover ()
21 {
22 ON_CALL (*this, saveInput ()).WillByDefault (Return (true));
23 ON_CALL (*this, removeInput ()).WillByDefault (Return (true));
24 ON_CALL (*this, restoreInput ()).WillByDefault (Return (true));
25 }
26
27 MOCK_METHOD0 (saveInput, bool ());
28 MOCK_METHOD0 (removeInput, bool ());
29 MOCK_METHOD0 (restoreInput, bool ());
30};
31
32class UnityShowdesktopHandlerTest :
33 public ::testing::Test
34{
35public:
36
37 ~UnityShowdesktopHandlerTest ()
38 {
39 UnityShowdesktopHandler::animating_windows.clear ();
40 }
41
42 template <class T, class U> static typename T::Ptr makeShared () { return typename T::Ptr (new U); }
43
44};
45
46
47class MockUnityShowdesktopHandlerWindow :
48 public UnityShowdesktopHandlerWindowInterface
49{
50 public:
51
52 MockUnityShowdesktopHandlerWindow ()
53 {
54 ON_CALL (*this, IsOverrideRedirect ()).WillByDefault (Return (false));
55 ON_CALL (*this, IsManaged ()).WillByDefault (Return (true));
56 ON_CALL (*this, IsGrabbed ()).WillByDefault (Return (false));
57 ON_CALL (*this, IsDesktopOrDock ()).WillByDefault (Return (false));
58 ON_CALL (*this, IsSkipTaskbarOrPager ()).WillByDefault (Return (false));
59 ON_CALL (*this, IsHidden ()).WillByDefault (Return (false));
60 ON_CALL (*this, IsInShowdesktopMode ()).WillByDefault (Return (false));
61 ON_CALL (*this, IsShaded ()).WillByDefault (Return (false));
62 ON_CALL (*this, IsMinimized ()).WillByDefault (Return (false));
63
64 ON_CALL (*this, DoHandleAnimations (_)).WillByDefault (Return (UnityShowdesktopHandlerWindowInterface::PostPaintAction::Damage));
65 ON_CALL (*this, GetNoCoreInstanceMask ()).WillByDefault (Return (1));
66 ON_CALL (*this, GetInputRemover ()).WillByDefault (Invoke (UnityShowdesktopHandlerTest::makeShared<compiz::WindowInputRemoverInterface, MockWindowInputRemover>));
67 }
68
69 MOCK_METHOD0 (DoEnableFocus, void ());
70 MOCK_METHOD0 (DoDisableFocus, void ());
71 MOCK_METHOD0 (IsOverrideRedirect, bool ());
72 MOCK_METHOD0 (IsManaged, bool ());
73 MOCK_METHOD0 (IsGrabbed, bool ());
74 MOCK_METHOD0 (IsDesktopOrDock, bool ());
75 MOCK_METHOD0 (IsSkipTaskbarOrPager, bool ());
76 MOCK_METHOD0 (IsHidden, bool ());
77 MOCK_METHOD0 (IsInShowdesktopMode, bool ());
78 MOCK_METHOD0 (IsShaded, bool ());
79 MOCK_METHOD0 (IsMinimized, bool ());
80 MOCK_METHOD1 (DoOverrideFrameRegion, void (CompRegion &));
81 MOCK_METHOD0 (DoHide, void ());
82 MOCK_METHOD0 (DoNotifyHidden, void ());
83 MOCK_METHOD0 (DoShow, void ());
84 MOCK_METHOD0 (DoNotifyShown, void ());
85 MOCK_METHOD0 (DoMoveFocusAway, void ());
86 MOCK_METHOD1 (DoHandleAnimations, UnityShowdesktopHandlerWindowInterface::PostPaintAction (unsigned int));
87 MOCK_METHOD0 (DoAddDamage, void ());
88 MOCK_METHOD0 (GetNoCoreInstanceMask, unsigned int ());
89 MOCK_METHOD0 (GetInputRemover, compiz::WindowInputRemoverInterface::Ptr ());
90 MOCK_METHOD0 (DoDeleteHandler, void ());
91};
92
93TEST_F(UnityShowdesktopHandlerTest, TestNoORWindowsSD)
94{
95 MockUnityShowdesktopHandlerWindow mMockWindow;
96
97 EXPECT_CALL (mMockWindow, GetInputRemover ());
98
99 UnityShowdesktopHandler mMockHandler (static_cast <UnityShowdesktopHandlerWindowInterface *> (&mMockWindow));
100
101 EXPECT_CALL (mMockWindow, IsOverrideRedirect ()).WillOnce (Return (true));
102 EXPECT_FALSE (UnityShowdesktopHandler::ShouldHide (&mMockWindow));
103}
104
105TEST_F(UnityShowdesktopHandlerTest, TestNoUnmanagedWindowsSD)
106{
107 MockUnityShowdesktopHandlerWindow mMockWindow;
108
109 EXPECT_CALL (mMockWindow, GetInputRemover ());
110
111 UnityShowdesktopHandler mMockHandler (static_cast <UnityShowdesktopHandlerWindowInterface *> (&mMockWindow));
112
113 EXPECT_CALL (mMockWindow, IsOverrideRedirect ());
114 EXPECT_CALL (mMockWindow, IsManaged ()).WillOnce (Return (false));
115 EXPECT_FALSE (UnityShowdesktopHandler::ShouldHide (&mMockWindow));
116}
117
118TEST_F(UnityShowdesktopHandlerTest, TestNoGrabbedWindowsSD)
119{
120 MockUnityShowdesktopHandlerWindow mMockWindow;
121
122 EXPECT_CALL (mMockWindow, GetInputRemover ());
123
124 UnityShowdesktopHandler mMockHandler (static_cast <UnityShowdesktopHandlerWindowInterface *> (&mMockWindow));
125
126 EXPECT_CALL (mMockWindow, IsOverrideRedirect ());
127 EXPECT_CALL (mMockWindow, IsManaged ());
128 EXPECT_CALL (mMockWindow, IsGrabbed ()).WillOnce (Return (true));
129 EXPECT_FALSE (UnityShowdesktopHandler::ShouldHide (&mMockWindow));
130}
131
132TEST_F(UnityShowdesktopHandlerTest, TestNoDesktopOrDockWindowsSD)
133{
134 MockUnityShowdesktopHandlerWindow mMockWindow;
135
136 EXPECT_CALL (mMockWindow, GetInputRemover ());
137
138 UnityShowdesktopHandler mMockHandler (static_cast <UnityShowdesktopHandlerWindowInterface *> (&mMockWindow));
139
140 EXPECT_CALL (mMockWindow, IsOverrideRedirect ());
141 EXPECT_CALL (mMockWindow, IsManaged ());
142 EXPECT_CALL (mMockWindow, IsGrabbed ());
143 EXPECT_CALL (mMockWindow, IsDesktopOrDock ()).WillOnce (Return (true));
144 EXPECT_FALSE (UnityShowdesktopHandler::ShouldHide (&mMockWindow));
145}
146
147TEST_F(UnityShowdesktopHandlerTest, TestNoSkipTaskbarOrPagerWindowsSD)
148{
149 MockUnityShowdesktopHandlerWindow mMockWindow;
150
151 EXPECT_CALL (mMockWindow, GetInputRemover ());
152
153 UnityShowdesktopHandler mMockHandler (static_cast <UnityShowdesktopHandlerWindowInterface *> (&mMockWindow));
154
155 EXPECT_CALL (mMockWindow, IsOverrideRedirect ());
156 EXPECT_CALL (mMockWindow, IsManaged ());
157 EXPECT_CALL (mMockWindow, IsGrabbed ());
158 EXPECT_CALL (mMockWindow, IsDesktopOrDock ());
159 EXPECT_CALL (mMockWindow, IsSkipTaskbarOrPager ()).WillOnce (Return (true));
160 EXPECT_FALSE (UnityShowdesktopHandler::ShouldHide (&mMockWindow));
161}
162
163TEST_F(UnityShowdesktopHandlerTest, TestHiddenNotSDAndShadedWindowsNoSD)
164{
165 MockUnityShowdesktopHandlerWindow mMockWindow;
166
167 EXPECT_CALL (mMockWindow, GetInputRemover ());
168
169 UnityShowdesktopHandler mMockHandler (static_cast <UnityShowdesktopHandlerWindowInterface *> (&mMockWindow));
170
171 EXPECT_CALL (mMockWindow, IsOverrideRedirect ());
172 EXPECT_CALL (mMockWindow, IsManaged ());
173 EXPECT_CALL (mMockWindow, IsGrabbed ());
174 EXPECT_CALL (mMockWindow, IsDesktopOrDock ());
175 EXPECT_CALL (mMockWindow, IsSkipTaskbarOrPager ());
176 EXPECT_CALL (mMockWindow, IsHidden ()).WillOnce (Return (true));
177 EXPECT_CALL (mMockWindow, IsInShowdesktopMode ()).WillOnce (Return (false));
178 EXPECT_CALL (mMockWindow, IsShaded ()).WillOnce (Return (true));
179 EXPECT_FALSE (UnityShowdesktopHandler::ShouldHide (&mMockWindow));
180}
181
182TEST_F(UnityShowdesktopHandlerTest, TestHiddenSDAndShadedWindowsNoSD)
183{
184 MockUnityShowdesktopHandlerWindow mMockWindow;
185
186 EXPECT_CALL (mMockWindow, GetInputRemover ());
187
188 UnityShowdesktopHandler mMockHandler (static_cast <UnityShowdesktopHandlerWindowInterface *> (&mMockWindow));
189
190 EXPECT_CALL (mMockWindow, IsOverrideRedirect ());
191 EXPECT_CALL (mMockWindow, IsManaged ());
192 EXPECT_CALL (mMockWindow, IsGrabbed ());
193 EXPECT_CALL (mMockWindow, IsDesktopOrDock ());
194 EXPECT_CALL (mMockWindow, IsSkipTaskbarOrPager ());
195 EXPECT_CALL (mMockWindow, IsHidden ()).WillOnce (Return (true));
196 EXPECT_CALL (mMockWindow, IsInShowdesktopMode ()).WillOnce (Return (true));
197 EXPECT_FALSE (UnityShowdesktopHandler::ShouldHide (&mMockWindow));
198}
199
200TEST_F(UnityShowdesktopHandlerTest, TestHiddenNotSDAndNotShadedWindowsSD)
201{
202 MockUnityShowdesktopHandlerWindow mMockWindow;
203
204 EXPECT_CALL (mMockWindow, GetInputRemover ());
205
206 UnityShowdesktopHandler mMockHandler (static_cast <UnityShowdesktopHandlerWindowInterface *> (&mMockWindow));
207
208 EXPECT_CALL (mMockWindow, IsOverrideRedirect ());
209 EXPECT_CALL (mMockWindow, IsManaged ());
210 EXPECT_CALL (mMockWindow, IsGrabbed ());
211 EXPECT_CALL (mMockWindow, IsDesktopOrDock ());
212 EXPECT_CALL (mMockWindow, IsSkipTaskbarOrPager ());
213 EXPECT_CALL (mMockWindow, IsHidden ()).WillOnce (Return (true));
214 EXPECT_CALL (mMockWindow, IsInShowdesktopMode ()).WillOnce (Return (false));
215 EXPECT_CALL (mMockWindow, IsShaded ()).WillOnce (Return (false));
216 EXPECT_TRUE (UnityShowdesktopHandler::ShouldHide (&mMockWindow));
217}
218
219class MockWindowInputRemoverTestFadeOut :
220 public compiz::WindowInputRemoverInterface
221{
222 public:
223
224 MockWindowInputRemoverTestFadeOut ()
225 {
226 ON_CALL (*this, saveInput ()).WillByDefault (Return (true));
227 ON_CALL (*this, removeInput ()).WillByDefault (Return (true));
228 ON_CALL (*this, restoreInput ()).WillByDefault (Return (true));
229
230 EXPECT_CALL (*this, saveInput ()).WillOnce (Return (true));
231 EXPECT_CALL (*this, removeInput ()).WillOnce (Return (true));
232 }
233
234 MOCK_METHOD0 (saveInput, bool ());
235 MOCK_METHOD0 (removeInput, bool ());
236 MOCK_METHOD0 (restoreInput, bool ());
237};
238
239TEST_F(UnityShowdesktopHandlerTest, TestFadeOutHidesWindow)
240{
241 MockUnityShowdesktopHandlerWindow mMockWindow;
242
243 EXPECT_CALL (mMockWindow, GetInputRemover ()).WillOnce (Invoke (UnityShowdesktopHandlerTest::makeShared<compiz::WindowInputRemoverInterface, MockWindowInputRemoverTestFadeOut>));
244
245 UnityShowdesktopHandler mMockHandler (static_cast <UnityShowdesktopHandlerWindowInterface *> (&mMockWindow));
246
247 EXPECT_CALL (mMockWindow, IsHidden ());
248 EXPECT_CALL (mMockWindow, DoHide ());
249 EXPECT_CALL (mMockWindow, DoNotifyHidden ());
250
251 mMockHandler.FadeOut ();
252
253 EXPECT_EQ (UnityShowdesktopHandler::animating_windows.size (), 1);
254}
255
256class MockWindowInputRemoverTestFadeOutAlready :
257 public compiz::WindowInputRemoverInterface
258{
259 public:
260
261 MockWindowInputRemoverTestFadeOutAlready ()
262 {
263 ON_CALL (*this, saveInput ()).WillByDefault (Return (true));
264 ON_CALL (*this, removeInput ()).WillByDefault (Return (true));
265 ON_CALL (*this, restoreInput ()).WillByDefault (Return (true));
266 }
267
268 MOCK_METHOD0 (saveInput, bool ());
269 MOCK_METHOD0 (removeInput, bool ());
270 MOCK_METHOD0 (restoreInput, bool ());
271};
272
273TEST_F(UnityShowdesktopHandlerTest, TestFadeOutOnHiddenDoesntHideWindow)
274{
275 MockUnityShowdesktopHandlerWindow mMockWindow;
276
277 EXPECT_CALL (mMockWindow, GetInputRemover ()).WillOnce (Invoke (UnityShowdesktopHandlerTest::makeShared<compiz::WindowInputRemoverInterface, MockWindowInputRemoverTestFadeOutAlready>));
278
279 UnityShowdesktopHandler mMockHandler (static_cast <UnityShowdesktopHandlerWindowInterface *> (&mMockWindow));
280
281 EXPECT_CALL (mMockWindow, IsHidden ()).WillOnce (Return (true));
282
283 mMockHandler.FadeOut ();
284
285 EXPECT_EQ (UnityShowdesktopHandler::animating_windows.size (), 0);
286}
287
288TEST_F(UnityShowdesktopHandlerTest, TestFadeOutAlreadyFadedDoesntHideWindow)
289{
290 MockUnityShowdesktopHandlerWindow mMockWindow;
291
292 EXPECT_CALL (mMockWindow, GetInputRemover ()).WillOnce (Invoke (UnityShowdesktopHandlerTest::makeShared<compiz::WindowInputRemoverInterface, MockWindowInputRemoverTestFadeOut>));
293
294 UnityShowdesktopHandler mMockHandler (static_cast <UnityShowdesktopHandlerWindowInterface *> (&mMockWindow));
295
296 EXPECT_CALL (mMockWindow, IsHidden ());
297 EXPECT_CALL (mMockWindow, DoHide ());
298 EXPECT_CALL (mMockWindow, DoNotifyHidden ());
299
300 mMockHandler.FadeOut ();
301 mMockHandler.FadeOut ();
302
303 EXPECT_EQ (UnityShowdesktopHandler::animating_windows.size (), 1);
304}
305
306TEST_F(UnityShowdesktopHandlerTest, TestFadeInNonFadedDoesntShowWindow)
307{
308 MockUnityShowdesktopHandlerWindow mMockWindow;
309
310 EXPECT_CALL (mMockWindow, GetInputRemover ()).WillOnce (Invoke (UnityShowdesktopHandlerTest::makeShared<compiz::WindowInputRemoverInterface, MockWindowInputRemoverTestFadeOutAlready>));
311
312 UnityShowdesktopHandler mMockHandler (static_cast <UnityShowdesktopHandlerWindowInterface *> (&mMockWindow));
313
314 mMockHandler.FadeIn ();
315
316 EXPECT_EQ (UnityShowdesktopHandler::animating_windows.size (), 0);
317}
318
319class MockWindowInputRemoverTestFadeOutFadeIn :
320 public compiz::WindowInputRemoverInterface
321{
322 public:
323
324 MockWindowInputRemoverTestFadeOutFadeIn ()
325 {
326 ON_CALL (*this, saveInput ()).WillByDefault (Return (true));
327 ON_CALL (*this, removeInput ()).WillByDefault (Return (true));
328 ON_CALL (*this, restoreInput ()).WillByDefault (Return (true));
329
330 EXPECT_CALL (*this, saveInput ()).WillOnce (Return (true));
331 EXPECT_CALL (*this, removeInput ()).WillOnce (Return (true));
332 EXPECT_CALL (*this, restoreInput ()).WillOnce (Return (true));
333 }
334
335 MOCK_METHOD0 (saveInput, bool ());
336 MOCK_METHOD0 (removeInput, bool ());
337 MOCK_METHOD0 (restoreInput, bool ());
338};
339
340TEST_F(UnityShowdesktopHandlerTest, TestFadeOutHidesWindowFadeInShowsWindow)
341{
342 MockUnityShowdesktopHandlerWindow mMockWindow;
343
344 EXPECT_CALL (mMockWindow, GetInputRemover ()).WillOnce (Invoke (UnityShowdesktopHandlerTest::makeShared<compiz::WindowInputRemoverInterface, MockWindowInputRemoverTestFadeOutFadeIn>));
345
346 UnityShowdesktopHandler mMockHandler (static_cast <UnityShowdesktopHandlerWindowInterface *> (&mMockWindow));
347
348 EXPECT_CALL (mMockWindow, IsHidden ());
349 EXPECT_CALL (mMockWindow, DoHide ());
350 EXPECT_CALL (mMockWindow, DoNotifyHidden ());
351
352 mMockHandler.FadeOut ();
353
354 EXPECT_CALL (mMockWindow, DoShow ());
355 EXPECT_CALL (mMockWindow, DoNotifyShown ());
356
357 mMockHandler.FadeIn ();
358
359 EXPECT_EQ (UnityShowdesktopHandler::animating_windows.size (), 1);
360}
361
362TEST_F(UnityShowdesktopHandlerTest, TestAnimationPostPaintActions)
363{
364 MockUnityShowdesktopHandlerWindow mMockWindow;
365
366 EXPECT_CALL (mMockWindow, GetInputRemover ()).WillOnce (Invoke (UnityShowdesktopHandlerTest::makeShared<compiz::WindowInputRemoverInterface, MockWindowInputRemoverTestFadeOutFadeIn>));
367
368 UnityShowdesktopHandler mMockHandler (static_cast <UnityShowdesktopHandlerWindowInterface *> (&mMockWindow));
369
370 EXPECT_CALL (mMockWindow, IsHidden ());
371 EXPECT_CALL (mMockWindow, DoHide ());
372 EXPECT_CALL (mMockWindow, DoNotifyHidden ());
373
374 mMockHandler.FadeOut ();
375
376 EXPECT_CALL (mMockWindow, DoShow ());
377 EXPECT_CALL (mMockWindow, DoNotifyShown ());
378
379 for (unsigned int i = 0; i < UnityShowdesktopHandler::fade_time; i++)
380 {
381 UnityShowdesktopHandlerWindowInterface::PostPaintAction action = mMockHandler.Animate (1);
382
383 if (i == 300)
384 EXPECT_EQ (action, UnityShowdesktopHandlerWindowInterface::PostPaintAction::Wait);
385 else
386 EXPECT_EQ (action, UnityShowdesktopHandlerWindowInterface::PostPaintAction::Damage);
387 }
388
389 mMockHandler.FadeIn ();
390
391 for (unsigned int i = 0; i < UnityShowdesktopHandler::fade_time; i++)
392 {
393 UnityShowdesktopHandlerWindowInterface::PostPaintAction action = mMockHandler.Animate (1);
394
395 if (i == 300)
396 EXPECT_EQ (action, UnityShowdesktopHandlerWindowInterface::PostPaintAction::Remove);
397 else
398 EXPECT_EQ (action, UnityShowdesktopHandlerWindowInterface::PostPaintAction::Damage);
399 }
400
401 EXPECT_EQ (UnityShowdesktopHandler::animating_windows.size (), 1);
402}
403
404TEST_F(UnityShowdesktopHandlerTest, TestAnimationOpacity)
405{
406 MockUnityShowdesktopHandlerWindow mMockWindow;
407
408 EXPECT_CALL (mMockWindow, GetInputRemover ()).WillOnce (Invoke (UnityShowdesktopHandlerTest::makeShared<compiz::WindowInputRemoverInterface, MockWindowInputRemoverTestFadeOutFadeIn>));
409
410 UnityShowdesktopHandler mMockHandler (static_cast <UnityShowdesktopHandlerWindowInterface *> (&mMockWindow));
411
412 EXPECT_CALL (mMockWindow, IsHidden ());
413 EXPECT_CALL (mMockWindow, DoHide ());
414 EXPECT_CALL (mMockWindow, DoNotifyHidden ());
415
416 mMockHandler.FadeOut ();
417
418 EXPECT_CALL (mMockWindow, DoShow ());
419 EXPECT_CALL (mMockWindow, DoNotifyShown ());
420
421 /* The funny expectations here are to account for rounding errors that would
422 * otherwise make testing the code painful */
423
424 for (unsigned int i = 0; i < UnityShowdesktopHandler::fade_time; i++)
425 {
426 unsigned short opacity = std::numeric_limits <unsigned short>::max ();
427 mMockHandler.PaintOpacity (opacity);
428
429 mMockHandler.Animate (1);
430
431 if (i == 300)
432 EXPECT_EQ (opacity, std::numeric_limits <unsigned short>::max ());
433 else
434 {
435 float rem = opacity - std::numeric_limits <unsigned short>::max () * (1.0f - i / static_cast <float> (UnityShowdesktopHandler::fade_time));
436 EXPECT_TRUE (rem <= 1.0f && rem >= -1.0f);
437 }
438 }
439
440 mMockHandler.FadeIn ();
441
442 for (unsigned int i = 0; i < UnityShowdesktopHandler::fade_time; i++)
443 {
444 unsigned short opacity = std::numeric_limits <unsigned short>::max ();
445 mMockHandler.PaintOpacity (opacity);
446
447 mMockHandler.Animate (1);
448
449 if (i == 300)
450 EXPECT_EQ (opacity, std::numeric_limits <unsigned short>::max ());
451 else
452 {
453 float rem = opacity - std::numeric_limits <unsigned short>::max () * (i / static_cast <float> (UnityShowdesktopHandler::fade_time));
454 EXPECT_TRUE (rem <= 1.0f && rem >= -1.0f);
455 }
456 }
457
458 EXPECT_EQ (UnityShowdesktopHandler::animating_windows.size (), 1);
459}
460
461TEST_F(UnityShowdesktopHandlerTest, TestAnimationPaintMasks)
462{
463 MockUnityShowdesktopHandlerWindow mMockWindow;
464
465 EXPECT_CALL (mMockWindow, GetInputRemover ()).WillOnce (Invoke (UnityShowdesktopHandlerTest::makeShared<compiz::WindowInputRemoverInterface, MockWindowInputRemoverTestFadeOutFadeIn>));
466
467 UnityShowdesktopHandler mMockHandler (static_cast <UnityShowdesktopHandlerWindowInterface *> (&mMockWindow));
468
469 EXPECT_CALL (mMockWindow, IsHidden ());
470 EXPECT_CALL (mMockWindow, DoHide ());
471 EXPECT_CALL (mMockWindow, DoNotifyHidden ());
472
473 mMockHandler.FadeOut ();
474
475 EXPECT_CALL (mMockWindow, DoShow ());
476 EXPECT_CALL (mMockWindow, DoNotifyShown ());
477 EXPECT_CALL (mMockWindow, GetNoCoreInstanceMask ());
478
479 mMockHandler.Animate (UnityShowdesktopHandler::fade_time);
480
481 EXPECT_EQ (mMockHandler.GetPaintMask (), 1);
482
483 mMockHandler.FadeIn ();
484
485 mMockHandler.Animate (UnityShowdesktopHandler::fade_time);
486
487 EXPECT_EQ (mMockHandler.GetPaintMask (), 0);
488
489 EXPECT_EQ (UnityShowdesktopHandler::animating_windows.size (), 1);
490}
491
492class MockWindowInputRemoverTestFadeOutFadeInWithShapeEvent :
493 public compiz::WindowInputRemoverInterface
494{
495 public:
496
497 MockWindowInputRemoverTestFadeOutFadeInWithShapeEvent ()
498 {
499 ON_CALL (*this, saveInput ()).WillByDefault (Return (true));
500 ON_CALL (*this, removeInput ()).WillByDefault (Return (true));
501 ON_CALL (*this, restoreInput ()).WillByDefault (Return (true));
502
503 InSequence s;
504
505 EXPECT_CALL (*this, saveInput ()).WillOnce (Return (true));
506 EXPECT_CALL (*this, removeInput ()).WillOnce (Return (true));
507 EXPECT_CALL (*this, saveInput ()).WillOnce (Return (true));
508 EXPECT_CALL (*this, removeInput ()).WillOnce (Return (true));
509 EXPECT_CALL (*this, restoreInput ()).WillOnce (Return (true));
510 }
511
512 MOCK_METHOD0 (saveInput, bool ());
513 MOCK_METHOD0 (removeInput, bool ());
514 MOCK_METHOD0 (restoreInput, bool ());
515};
516
517TEST_F(UnityShowdesktopHandlerTest, TestShapeEvent)
518{
519 MockUnityShowdesktopHandlerWindow mMockWindow;
520
521 EXPECT_CALL (mMockWindow, GetInputRemover ()).WillOnce (Invoke (UnityShowdesktopHandlerTest::makeShared<compiz::WindowInputRemoverInterface, MockWindowInputRemoverTestFadeOutFadeInWithShapeEvent>));
522
523 UnityShowdesktopHandler mMockHandler (static_cast <UnityShowdesktopHandlerWindowInterface *> (&mMockWindow));
524
525 EXPECT_CALL (mMockWindow, IsHidden ());
526 EXPECT_CALL (mMockWindow, DoHide ());
527 EXPECT_CALL (mMockWindow, DoNotifyHidden ());
528
529 mMockHandler.FadeOut ();
530
531 EXPECT_CALL (mMockWindow, DoShow ());
532 EXPECT_CALL (mMockWindow, DoNotifyShown ());
533
534 mMockHandler.HandleShapeEvent ();
535
536 mMockHandler.FadeIn ();
537
538 EXPECT_EQ (UnityShowdesktopHandler::animating_windows.size (), 1);
539}