Merge lp:~smspillaz/compiz-core/compiz-core.fix_929288 into lp:compiz-core/0.9.8

Proposed by Sam Spilsbury
Status: Superseded
Proposed branch: lp:~smspillaz/compiz-core/compiz-core.fix_929288
Merge into: lp:compiz-core/0.9.8
Diff against target: 280 lines (+212/-10)
3 files modified
src/privatescreen.h (+30/-4)
src/privatescreen/tests/test-privatescreen.cpp (+166/-0)
src/screen.cpp (+16/-6)
To merge this branch: bzr merge lp:~smspillaz/compiz-core/compiz-core.fix_929288
Reviewer Review Type Date Requested Status
Compiz Maintainers Pending
Review via email: mp+103244@code.launchpad.net

This proposal has been superseded by a proposal from 2012-04-24.

Description of the change

== Problem ==

See LP#939288 - windows would jump if you had them on screen edges

== Solution ==

Don't return negative values for CompScreen::viewportForGeometry

== Test ==

Included.

To post a comment you must log in.
3112. By Sam Spilsbury

s/class/struct/

3113. By Sam Spilsbury

Merge lp:compiz-core

3114. By Sam Spilsbury

Merge lp:compiz-core

3115. By Sam Spilsbury

Merged lp:compiz-core

3116. By Sam Spilsbury

Revert to the old behaviour with a note about possible bugs

Unmerged revisions

3116. By Sam Spilsbury

Revert to the old behaviour with a note about possible bugs

3115. By Sam Spilsbury

Merged lp:compiz-core

3114. By Sam Spilsbury

Merge lp:compiz-core

3113. By Sam Spilsbury

Merge lp:compiz-core

3112. By Sam Spilsbury

s/class/struct/

3111. By Sam Spilsbury

Don't return a negative value for CompScreen::viewportForGeometry

Fix LP#939288 - If a window was partially on a viewport which was the last
one in its row or column, and we were on the viewport on the opposite side
of that row or column, compiz would work backwards to find the position
of the window (which would be negative) and return a negative viewport
position. This caused plugins like wall to behave strangely

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/privatescreen.h'
--- src/privatescreen.h 2012-04-20 09:25:41 +0000
+++ src/privatescreen.h 2012-04-24 09:32:10 +0000
@@ -795,15 +795,41 @@
795 unsigned int activeNum;795 unsigned int activeNum;
796};796};
797797
798class ViewportRetrievalInterface
799{
800 public:
801
802 virtual ~ViewportRetrievalInterface () {}
803
804 virtual const CompPoint & getCurrentViewport () const = 0;
805 virtual const CompSize & viewportDimentions () const = 0;
806};
807
798// Apart from a use by StartupSequence::addSequence this data808// Apart from a use by StartupSequence::addSequence this data
799// is only used by CompScreenImpl - like the OrphanData struct809// is only used by CompScreenImpl - like the OrphanData struct
800struct ViewPort810class ViewPort :
811 public ViewportRetrievalInterface
801{812{
802 ViewPort();813 public:
803 CompPoint vp;814
804 CompSize vpSize;815 ViewPort();
816 CompPoint vp;
817 CompSize vpSize;
818
819 private:
820
821 const CompPoint & getCurrentViewport () const { return vp; }
822 const CompSize & viewportDimentions () const { return vpSize; }
805};823};
806824
825namespace viewports
826{
827 void viewportForGeometry (const CompWindow::Geometry &gm,
828 CompPoint &viewport,
829 ViewportRetrievalInterface *viewports,
830 const CompSize &screenSize);
831}
832
807class StartupSequence : boost::noncopyable,833class StartupSequence : boost::noncopyable,
808 public ViewPort834 public ViewPort
809{835{
810836
=== modified file 'src/privatescreen/tests/test-privatescreen.cpp'
--- src/privatescreen/tests/test-privatescreen.cpp 2012-03-30 03:47:35 +0000
+++ src/privatescreen/tests/test-privatescreen.cpp 2012-04-24 09:32:10 +0000
@@ -10,6 +10,10 @@
1010
11#include <stdlib.h>11#include <stdlib.h>
1212
13using ::testing::Return;
14using ::testing::ReturnRef;
15using ::testing::_;
16
13namespace {17namespace {
1418
15class MockCompScreen : public CompScreen19class MockCompScreen : public CompScreen
@@ -175,6 +179,15 @@
175 MOCK_CONST_METHOD0(createFailed, bool ());179 MOCK_CONST_METHOD0(createFailed, bool ());
176};180};
177181
182class MockViewportRetreival :
183 public compiz::private_screen::ViewportRetrievalInterface
184{
185 public:
186
187 MOCK_CONST_METHOD0(getCurrentViewport, const CompPoint & ());
188 MOCK_CONST_METHOD0(viewportDimentions, const CompSize & ());
189};
190
178class StubActivePluginsOption191class StubActivePluginsOption
179{192{
180public:193public:
@@ -726,3 +739,156 @@
726 em.setPlugins (values);739 em.setPlugins (values);
727 em.init(0);740 em.init(0);
728}741}
742
743TEST(privatescreen_ViewportGeometryTest, PickCurrent)
744{
745 CompPoint vp;
746 compiz::window::Geometry g (250, 250, 500, 500, 0);
747 MockViewportRetreival mvp;
748
749 CompPoint current (0, 0);
750 CompSize dimentions (1, 1);
751
752 EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current));
753 EXPECT_CALL (mvp, viewportDimentions ()).WillOnce (ReturnRef (dimentions));
754
755 compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000));
756
757 EXPECT_EQ (vp, CompPoint (0, 0));
758}
759
760TEST(privatescreen_ViewportGeometryTest, PickRight)
761{
762 CompPoint vp;
763 compiz::window::Geometry g (1250, 0, 500, 500, 0);
764 MockViewportRetreival mvp;
765
766 CompPoint current (0, 0);
767 CompSize dimentions (2, 1);
768
769 EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current));
770 EXPECT_CALL (mvp, viewportDimentions ()).WillOnce (ReturnRef (dimentions));
771
772 compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000));
773
774 EXPECT_EQ (vp, CompPoint (1, 0));
775}
776
777TEST(privatescreen_ViewportGeometryTest, PickLeft)
778{
779 CompPoint vp;
780 compiz::window::Geometry g (-750, 0, 500, 500, 0);
781 MockViewportRetreival mvp;
782
783 CompPoint current (1, 0);
784 CompSize dimentions (2, 1);
785
786 EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current));
787 EXPECT_CALL (mvp, viewportDimentions ()).WillOnce (ReturnRef (dimentions));
788
789 compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000));
790
791 EXPECT_EQ (vp, CompPoint (0, 0));
792}
793
794TEST(privatescreen_ViewportGeometryTest, PickBottom)
795{
796 CompPoint vp;
797 compiz::window::Geometry g (0, 1250, 500, 500, 0);
798 MockViewportRetreival mvp;
799
800 CompPoint current (0, 0);
801 CompSize dimentions (1, 2);
802
803 EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current));
804 EXPECT_CALL (mvp, viewportDimentions ()).WillOnce (ReturnRef (dimentions));
805
806 compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000));
807
808 EXPECT_EQ (vp, CompPoint (0, 1));
809}
810
811TEST(privatescreen_ViewportGeometryTest, PickTop)
812{
813 CompPoint vp;
814 compiz::window::Geometry g (0, -750, 500, 500, 0);
815 MockViewportRetreival mvp;
816
817 CompPoint current (0, 1);
818 CompSize dimentions (1, 2);
819
820 EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current));
821 EXPECT_CALL (mvp, viewportDimentions ()).WillOnce (ReturnRef (dimentions));
822
823 compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000));
824
825 EXPECT_EQ (vp, CompPoint (0, 0));
826}
827
828TEST(privatescreen_ViewportGeometryTest, PickTopWhenJustAbove)
829{
830 CompPoint vp;
831 compiz::window::Geometry g (0, -251, 500, 500, 0);
832 MockViewportRetreival mvp;
833
834 CompPoint current (0, 1);
835 CompSize dimentions (1, 2);
836
837 EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current));
838 EXPECT_CALL (mvp, viewportDimentions ()).WillOnce (ReturnRef (dimentions));
839
840 compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000));
841
842 EXPECT_EQ (vp, CompPoint (0, 0));
843}
844
845TEST(privatescreen_ViewportGeometryTest, PickRightWhenJustRight)
846{
847 CompPoint vp;
848 compiz::window::Geometry g (751, 0, 500, 500, 0);
849 MockViewportRetreival mvp;
850
851 CompPoint current (0, 0);
852 CompSize dimentions (2, 1);
853
854 EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current));
855 EXPECT_CALL (mvp, viewportDimentions ()).WillOnce (ReturnRef (dimentions));
856
857 compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000));
858
859 EXPECT_EQ (vp, CompPoint (1, 0));
860}
861
862TEST(privatescreen_ViewportGeometryTest, PickLeftWhenJustLeft)
863{
864 CompPoint vp;
865 compiz::window::Geometry g (-251, 0, 500, 500, 0);
866 MockViewportRetreival mvp;
867
868 CompPoint current (1, 0);
869 CompSize dimentions (2, 1);
870
871 EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current));
872 EXPECT_CALL (mvp, viewportDimentions ()).WillOnce (ReturnRef (dimentions));
873
874 compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000));
875
876 EXPECT_EQ (vp, CompPoint (0, 0));
877}
878
879TEST(privatescreen_ViewportGeometryTest, PickBottomWhenJustBelow)
880{
881 CompPoint vp;
882 compiz::window::Geometry g (0, 751, 500, 500, 0);
883 MockViewportRetreival mvp;
884
885 CompPoint current (0, 0);
886 CompSize dimentions (1, 2);
887
888 EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current));
889 EXPECT_CALL (mvp, viewportDimentions ()).WillOnce (ReturnRef (dimentions));
890
891 compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000));
892
893 EXPECT_EQ (vp, CompPoint (0, 1));
894}
729895
=== modified file 'src/screen.cpp'
--- src/screen.cpp 2012-04-23 05:36:16 +0000
+++ src/screen.cpp 2012-04-24 09:32:10 +0000
@@ -4065,22 +4065,32 @@
4065 is currently computed as the viewport where the center of the window is4065 is currently computed as the viewport where the center of the window is
4066 located. */4066 located. */
4067void4067void
4068CompScreenImpl::viewportForGeometry (const CompWindow::Geometry& gm,4068compiz::private_screen::viewports::viewportForGeometry (const CompWindow::Geometry &gm,
4069 CompPoint& viewport)4069 CompPoint &viewport,
4070 ViewportRetrievalInterface *viewports,
4071 const CompSize & screenSize)
4070{4072{
4071 CompRect rect (gm);4073 CompRect rect (gm);
4072 int offset;4074 int offset;
40734075
4076 const CompPoint &vp = viewports->getCurrentViewport ();
4077 const CompSize &vpSize = viewports->viewportDimentions ();
4078
4074 rect.setWidth (gm.widthIncBorders ());4079 rect.setWidth (gm.widthIncBorders ());
4075 rect.setHeight (gm.heightIncBorders ());4080 rect.setHeight (gm.heightIncBorders ());
40764081
4077 offset = rect.centerX () < 0 ? -1 : 0;4082 offset = rect.centerX () < 0 ? -1 : 0;
4078 viewport.setX (priv->vp.x () + ((rect.centerX () / width ()) + offset) %4083 viewport.setX (compiz::core::screen::wraparound_mod (vp.x () + ((rect.centerX () / screenSize.width ()) + offset), vpSize.width ()));
4079 priv->vpSize.width ());
40804084
4081 offset = rect.centerY () < 0 ? -1 : 0;4085 offset = rect.centerY () < 0 ? -1 : 0;
4082 viewport.setY (priv->vp.y () + ((rect.centerY () / height ()) + offset ) %4086 viewport.setY (compiz::core::screen::wraparound_mod (vp.y () + ((rect.centerY () / screenSize.height ()) + offset), vpSize.height ()));
4083 priv->vpSize.height ());4087}
4088
4089void
4090CompScreenImpl::viewportForGeometry (const CompWindow::Geometry& gm,
4091 CompPoint& viewport)
4092{
4093 compiz::private_screen::viewports::viewportForGeometry (gm, viewport, priv.get (), *this);
4084}4094}
40854095
4086int4096int

Subscribers

People subscribed via source and target branches