Mir

Merge lp:~cemil-azizoglu/mir/fix-1590959 into lp:mir

Proposed by Cemil Azizoglu
Status: Merged
Approved by: Daniel van Vugt
Approved revision: no longer in the source branch.
Merged at revision: 3733
Proposed branch: lp:~cemil-azizoglu/mir/fix-1590959
Merge into: lp:mir
Prerequisite: lp:~cemil-azizoglu/mir/x11-better-display-handling
Diff against target: 222 lines (+81/-12)
5 files modified
src/platforms/mesa/server/x11/graphics/display.cpp (+30/-5)
src/platforms/mesa/server/x11/graphics/display.h (+2/-2)
tests/include/mir/test/doubles/mock_x11.h (+2/-1)
tests/mir_test_doubles/mock_x11.cpp (+19/-2)
tests/unit-tests/platforms/mesa/x11/test_display.cpp (+28/-2)
To merge this branch: bzr merge lp:~cemil-azizoglu/mir/fix-1590959
Reviewer Review Type Date Requested Status
Kevin DuBois (community) Approve
Alan Griffiths Approve
Alexandros Frantzis (community) Approve
Mir CI Bot continuous-integration Approve
Review via email: mp+306961@code.launchpad.net

Commit message

Readjust requested size to that of the actual display if it's larger in either dimension.

Description of the change

Readjust requested size to that of the actual display if it's larger in either dimension. Also, a border margin of 150 pixels is allowed to account for the launcher icons menu, title bar, etc. so it can still fit in the display.

To post a comment you must log in.
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Continuous integration, rev:3717
https://mir-jenkins.ubuntu.com/job/mir-ci/1832/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/2305/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/2368
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/2359
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/2359
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/2359
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/2333/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/2333
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/2333/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/2333
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/2333/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/2333
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/2333/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/2333
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/2333/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/1832/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Continuous integration, rev:3719
https://mir-jenkins.ubuntu.com/job/mir-ci/1837/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/2314/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/2377
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/2368
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/2368
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/2368
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/2342
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/2342/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/2342
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/2342/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/2342/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/2342
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/2342/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/2342
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/2342/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/1837/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

PASSED: Continuous integration, rev:3719
https://mir-jenkins.ubuntu.com/job/mir-ci/1842/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/2323
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/2386
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/2378
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/2378
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/2378
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/2351
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/2351/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/2351
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/2351/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/2351
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/2351/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/2351
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/2351/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/2351
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/2351/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/1842/rebuild

review: Approve (continuous-integration)
Revision history for this message
Alexandros Frantzis (afrantzis) wrote :

Looks good.

review: Approve
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

OK I suppose.

I'd prefer clipping to only apply to the default (so that I can set what I like) and for clipping to apply independently to width and height. E.g.

$ bin/mir_demo_server --x11-displays 10000x10

Ends up with a height greater than requested

review: Approve
Revision history for this message
Kevin DuBois (kdub) wrote :

+ auto const border = 150; //must match the border value in clip_to_display()
Redundant comment? If the production code changes, the test will tell us when run.

nit:
+ if ((screen_width < requested_size.width.as_uint32_t()+border) ||
+ (screen_height < requested_size.height.as_uint32_t()+border))
spaces between +

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/platforms/mesa/server/x11/graphics/display.cpp'
--- src/platforms/mesa/server/x11/graphics/display.cpp 2016-09-28 04:31:08 +0000
+++ src/platforms/mesa/server/x11/graphics/display.cpp 2016-09-28 04:31:09 +0000
@@ -39,6 +39,30 @@
3939
40namespace40namespace
41{41{
42geom::Size clip_to_display(Display *dpy, geom::Size requested_size)
43{
44 unsigned int screen_width, screen_height, uint_dummy;
45 int int_dummy;
46 Window window_dummy;
47 int const border = 150;
48
49 XGetGeometry(dpy, XDefaultRootWindow(dpy), &window_dummy, &int_dummy, &int_dummy,
50 &screen_width, &screen_height, &uint_dummy, &uint_dummy);
51
52 mir::log_info("Screen resolution = %dx%d", screen_width, screen_height);
53
54 if ((screen_width < requested_size.width.as_uint32_t()+border) ||
55 (screen_height < requested_size.height.as_uint32_t()+border))
56 {
57 mir::log_info(" ... is smaller than the requested size (%dx%d) plus border (%d). Clipping to (%dx%d).",
58 requested_size.width.as_uint32_t(), requested_size.height.as_uint32_t(), border,
59 screen_width-border, screen_height-border);
60 return geom::Size{screen_width-border, screen_height-border};
61 }
62
63 return requested_size;
64}
65
42auto get_pixel_width(Display *dpy)66auto get_pixel_width(Display *dpy)
43{67{
44 auto screen = XDefaultScreenOfDisplay(dpy);68 auto screen = XDefaultScreenOfDisplay(dpy);
@@ -114,6 +138,7 @@
114 r_mask = visInfo->red_mask;138 r_mask = visInfo->red_mask;
115139
116 XSetWindowAttributes attr;140 XSetWindowAttributes attr;
141 std::memset(&attr, 0, sizeof(attr));
117 attr.background_pixel = 0;142 attr.background_pixel = 0;
118 attr.border_pixel = 0;143 attr.border_pixel = 0;
119 attr.colormap = XCreateColormap(x_dpy, root, visInfo->visual, AllocNone);144 attr.colormap = XCreateColormap(x_dpy, root, visInfo->visual, AllocNone);
@@ -200,12 +225,12 @@
200}225}
201226
202mgx::Display::Display(::Display* x_dpy,227mgx::Display::Display(::Display* x_dpy,
203 geom::Size const size,228 geom::Size const requested_size,
204 std::shared_ptr<GLConfig> const& gl_config,229 std::shared_ptr<GLConfig> const& gl_config,
205 std::shared_ptr<DisplayReport> const& report)230 std::shared_ptr<DisplayReport> const& report)
206 : shared_egl{*gl_config},231 : shared_egl{*gl_config},
207 x_dpy{x_dpy},232 x_dpy{x_dpy},
208 size{size},233 actual_size{clip_to_display(x_dpy, requested_size)},
209 gl_config{gl_config},234 gl_config{gl_config},
210 pixel_width{get_pixel_width(x_dpy)},235 pixel_width{get_pixel_width(x_dpy)},
211 pixel_height{get_pixel_height(x_dpy)},236 pixel_height{get_pixel_height(x_dpy)},
@@ -216,7 +241,7 @@
216241
217 win = std::make_unique<X11Window>(x_dpy,242 win = std::make_unique<X11Window>(x_dpy,
218 shared_egl.display(),243 shared_egl.display(),
219 size,244 actual_size,
220 shared_egl.config());245 shared_egl.config());
221246
222 auto red_mask = win->red_mask();247 auto red_mask = win->red_mask();
@@ -226,7 +251,7 @@
226 display_buffer = std::make_unique<mgx::DisplayBuffer>(251 display_buffer = std::make_unique<mgx::DisplayBuffer>(
227 x_dpy,252 x_dpy,
228 *win,253 *win,
229 size,254 actual_size,
230 shared_egl.context(),255 shared_egl.context(),
231 report,256 report,
232 orientation,257 orientation,
@@ -249,7 +274,7 @@
249std::unique_ptr<mg::DisplayConfiguration> mgx::Display::configuration() const274std::unique_ptr<mg::DisplayConfiguration> mgx::Display::configuration() const
250{275{
251 return std::make_unique<mgx::DisplayConfiguration>(276 return std::make_unique<mgx::DisplayConfiguration>(
252 pf, size, geom::Size{size.width * pixel_width, size.height * pixel_height}, orientation);277 pf, actual_size, geom::Size{actual_size.width * pixel_width, actual_size.height * pixel_height}, orientation);
253}278}
254279
255void mgx::Display::configure(mg::DisplayConfiguration const& new_configuration)280void mgx::Display::configure(mg::DisplayConfiguration const& new_configuration)
256281
=== modified file 'src/platforms/mesa/server/x11/graphics/display.h'
--- src/platforms/mesa/server/x11/graphics/display.h 2016-09-28 04:31:08 +0000
+++ src/platforms/mesa/server/x11/graphics/display.h 2016-09-28 04:31:09 +0000
@@ -66,7 +66,7 @@
66{66{
67public:67public:
68 explicit Display(::Display* x_dpy,68 explicit Display(::Display* x_dpy,
69 geometry::Size const size,69 geometry::Size const requested_size,
70 std::shared_ptr<GLConfig> const& gl_config,70 std::shared_ptr<GLConfig> const& gl_config,
71 std::shared_ptr<DisplayReport> const& report);71 std::shared_ptr<DisplayReport> const& report);
72 ~Display() noexcept;72 ~Display() noexcept;
@@ -101,7 +101,7 @@
101private:101private:
102 helpers::EGLHelper shared_egl;102 helpers::EGLHelper shared_egl;
103 ::Display* const x_dpy;103 ::Display* const x_dpy;
104 mir::geometry::Size const size;104 mir::geometry::Size const actual_size;
105 std::shared_ptr<GLConfig> const gl_config;105 std::shared_ptr<GLConfig> const gl_config;
106 float pixel_width;106 float pixel_width;
107 float pixel_height;107 float pixel_height;
108108
=== modified file 'tests/include/mir/test/doubles/mock_x11.h'
--- tests/include/mir/test/doubles/mock_x11.h 2016-06-28 08:24:02 +0000
+++ tests/include/mir/test/doubles/mock_x11.h 2016-09-28 04:31:09 +0000
@@ -88,7 +88,8 @@
88 MOCK_METHOD9(XGrabPointer, int(Display*, Window, Bool, unsigned int, int, int, Window, Cursor, Time));88 MOCK_METHOD9(XGrabPointer, int(Display*, Window, Bool, unsigned int, int, int, Window, Cursor, Time));
89 MOCK_METHOD2(XUngrabPointer, int(Display*, Time));89 MOCK_METHOD2(XUngrabPointer, int(Display*, Time));
90 MOCK_METHOD3(XInternAtom, Atom(Display*, const char*, Bool));90 MOCK_METHOD3(XInternAtom, Atom(Display*, const char*, Bool));
91 MOCK_METHOD4(XSetWMProtocols, Status(Display *, Window, Atom*, int));91 MOCK_METHOD4(XSetWMProtocols, Status(Display*, Window, Atom*, int));
92 MOCK_METHOD9(XGetGeometry, Status(Display*, Drawable, Window*, int*, int*, unsigned int*, unsigned int*, unsigned int*, unsigned int*));
9293
93 FakeX11Resources fake_x11;94 FakeX11Resources fake_x11;
94};95};
9596
=== modified file 'tests/mir_test_doubles/mock_x11.cpp'
--- tests/mir_test_doubles/mock_x11.cpp 2016-06-28 08:24:02 +0000
+++ tests/mir_test_doubles/mock_x11.cpp 2016-09-28 04:31:09 +0000
@@ -57,8 +57,8 @@
57 motion_event_return.type = MotionNotify;57 motion_event_return.type = MotionNotify;
58 enter_notify_event_return.type = EnterNotify;58 enter_notify_event_return.type = EnterNotify;
59 leave_notify_event_return.type = LeaveNotify;59 leave_notify_event_return.type = LeaveNotify;
60 screen.width = 1024;60 screen.width = 2880;
61 screen.height = 768;61 screen.height = 1800;
62 screen.mwidth = 338;62 screen.mwidth = 338;
63 screen.mwidth = 270;63 screen.mwidth = 270;
64}64}
@@ -91,6 +91,11 @@
91 {91 {
92 return fake_x11.pending_events;92 return fake_x11.pending_events;
93 }));93 }));
94
95 ON_CALL(*this, XGetGeometry(fake_x11.display,_,_,_,_,_,_,_,_))
96 .WillByDefault(DoAll(SetArgPointee<5>(fake_x11.screen.width),
97 SetArgPointee<6>(fake_x11.screen.height),
98 Return(1)));
94}99}
95100
96mtd::MockX11::~MockX11()101mtd::MockX11::~MockX11()
@@ -237,3 +242,15 @@
237{242{
238 return global_mock->XDefaultScreenOfDisplay(display);243 return global_mock->XDefaultScreenOfDisplay(display);
239}244}
245
246Status XGetGeometry(Display* display, Drawable d,
247 Window* root_return,
248 int* x_return, int* y_return,
249 unsigned int* width_return, unsigned int* height_return,
250 unsigned int* border_width_return, unsigned int* depth_return)
251{
252 return global_mock->XGetGeometry(display, d, root_return,
253 x_return, y_return,
254 width_return, height_return,
255 border_width_return, depth_return);
256}
240257
=== modified file 'tests/unit-tests/platforms/mesa/x11/test_display.cpp'
--- tests/unit-tests/platforms/mesa/x11/test_display.cpp 2016-09-28 04:31:08 +0000
+++ tests/unit-tests/platforms/mesa/x11/test_display.cpp 2016-09-28 04:31:09 +0000
@@ -93,6 +93,11 @@
93 mock_x11.fake_x11.screen.mwidth = mm.width.as_int();93 mock_x11.fake_x11.screen.mwidth = mm.width.as_int();
94 mock_x11.fake_x11.screen.mheight = mm.height.as_int();94 mock_x11.fake_x11.screen.mheight = mm.height.as_int();
95 size = window;95 size = window;
96
97 ON_CALL(mock_x11, XGetGeometry(mock_x11.fake_x11.display,_,_,_,_,_,_,_,_))
98 .WillByDefault(DoAll(SetArgPointee<5>(mock_x11.fake_x11.screen.width),
99 SetArgPointee<6>(mock_x11.fake_x11.screen.height),
100 Return(1)));
96 }101 }
97 std::shared_ptr<mgx::Display> create_display()102 std::shared_ptr<mgx::Display> create_display()
98 {103 {
@@ -151,7 +156,7 @@
151156
152TEST_F(X11DisplayTest, calculates_physical_size_of_display_based_on_default_screen)157TEST_F(X11DisplayTest, calculates_physical_size_of_display_based_on_default_screen)
153{158{
154 auto const pixel = geom::Size{2560, 1080};159 auto const pixel = geom::Size{2880, 1800};
155 auto const mm = geom::Size{677, 290};160 auto const mm = geom::Size{677, 290};
156 auto const window = geom::Size{1280, 1024};161 auto const window = geom::Size{1280, 1024};
157 auto const pixel_width = float(mm.width.as_int()) / float(pixel.width.as_int());162 auto const pixel_width = float(mm.width.as_int()) / float(pixel.width.as_int());
@@ -175,7 +180,7 @@
175180
176TEST_F(X11DisplayTest, reports_a_resolution_that_matches_the_window_size)181TEST_F(X11DisplayTest, reports_a_resolution_that_matches_the_window_size)
177{182{
178 auto const pixel = geom::Size{2560, 1080};183 auto const pixel = geom::Size{2880, 1800};
179 auto const mm = geom::Size{677, 290};184 auto const mm = geom::Size{677, 290};
180 auto const window = geom::Size{1280, 1024};185 auto const window = geom::Size{1280, 1024};
181186
@@ -193,3 +198,24 @@
193198
194 EXPECT_THAT(reported_resolution, Eq(window));199 EXPECT_THAT(reported_resolution, Eq(window));
195}200}
201
202TEST_F(X11DisplayTest, adjusts_resolution_with_respect_to_screen_size)
203{
204 auto const pixel = geom::Size{1000, 1000};
205 auto const mm = geom::Size{677, 290};
206 auto const window = geom::Size{1280, 1024};
207 auto const border = 150; //must match the border value in clip_to_display()
208
209 setup_x11_screen(pixel, mm, window);
210
211 auto display = create_display();
212 auto config = display->configuration();
213 geom::Size reported_resolution;
214 config->for_each_output(
215 [&reported_resolution](mg::DisplayConfigurationOutput const& output)
216 {
217 reported_resolution = output.modes[0].size;
218 });
219
220 EXPECT_THAT(reported_resolution, Eq(geom::Size{pixel.width.as_uint32_t()-border, pixel.height.as_uint32_t()-border}));
221}

Subscribers

People subscribed via source and target branches