Mir

Merge lp:~andreas-pokorny/mir/fix-1596051 into lp:mir

Proposed by Andreas Pokorny
Status: Merged
Approved by: Cemil Azizoglu
Approved revision: no longer in the source branch.
Merged at revision: 3563
Proposed branch: lp:~andreas-pokorny/mir/fix-1596051
Merge into: lp:mir
Diff against target: 218 lines (+75/-5)
6 files modified
src/platforms/mesa/server/x11/graphics/display.cpp (+19/-1)
src/platforms/mesa/server/x11/graphics/display.h (+2/-0)
src/platforms/mesa/server/x11/graphics/display_configuration.cpp (+0/-1)
tests/include/mir/test/doubles/mock_x11.h (+2/-0)
tests/mir_test_doubles/mock_x11.cpp (+13/-0)
tests/unit-tests/graphics/mesa/x11/test_display.cpp (+39/-3)
To merge this branch: bzr merge lp:~andreas-pokorny/mir/fix-1596051
Reviewer Review Type Date Requested Status
Cemil Azizoglu (community) Approve
Alexandros Frantzis (community) Approve
Mir CI Bot continuous-integration Approve
Review via email: mp+298488@code.launchpad.net

Commit message

fix: use Information inside default x11 screen of display to calculate size of window in mm

instead of using the resolution as screen size in mm

Description of the change

Small fix in x11 platform .. forwards the mm information x11 believes is correct. It is off by four to six cm in my case (the information offered by kms seems to be more accurate), but better than claiming we have 1 pixel per millimeter.

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

PASSED: Continuous integration, rev:3555
https://mir-jenkins.ubuntu.com/job/mir-ci/1204/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/1378
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/1429
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/1420
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/1420
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/1392
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/1392/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/1392
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/1392/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/1392
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/1392/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/1392
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/1392/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/1392
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/1392/artifact/output/*zip*/output.zip

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

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

Looks good.

review: Approve
Revision history for this message
Cemil Azizoglu (cemil-azizoglu) wrote :

Ok

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-06-13 16:03:06 +0000
+++ src/platforms/mesa/server/x11/graphics/display.cpp 2016-06-28 08:29:09 +0000
@@ -36,6 +36,22 @@
36#define MIR_LOG_COMPONENT "x11-display"36#define MIR_LOG_COMPONENT "x11-display"
37#include "mir/log.h"37#include "mir/log.h"
3838
39namespace
40{
41auto get_pixel_width(Display *dpy)
42{
43 auto screen = XDefaultScreenOfDisplay(dpy);
44
45 return float(screen->mwidth) / screen->width;
46}
47auto get_pixel_height(Display *dpy)
48{
49 auto screen = XDefaultScreenOfDisplay(dpy);
50
51 return float(screen->mheight) / screen->height;
52}
53}
54
39namespace mg=mir::graphics;55namespace mg=mir::graphics;
40namespace mgx=mg::X;56namespace mgx=mg::X;
41namespace geom=mir::geometry;57namespace geom=mir::geometry;
@@ -256,6 +272,8 @@
256 GLConfig const& gl_config)272 GLConfig const& gl_config)
257 : egl_display{X11EGLDisplay(x_dpy)},273 : egl_display{X11EGLDisplay(x_dpy)},
258 size{size},274 size{size},
275 pixel_width{get_pixel_width(x_dpy)},
276 pixel_height{get_pixel_height(x_dpy)},
259 win{X11Window(x_dpy,277 win{X11Window(x_dpy,
260 egl_display,278 egl_display,
261 size,279 size,
@@ -291,7 +309,7 @@
291309
292std::unique_ptr<mg::DisplayConfiguration> mgx::Display::configuration() const310std::unique_ptr<mg::DisplayConfiguration> mgx::Display::configuration() const
293{311{
294 return std::make_unique<mgx::DisplayConfiguration>(pf, size, orientation);312 return std::make_unique<mgx::DisplayConfiguration>(pf, geom::Size{size.width*pixel_width, size.height*pixel_height}, orientation);
295}313}
296314
297void mgx::Display::configure(mg::DisplayConfiguration const& new_configuration)315void mgx::Display::configure(mg::DisplayConfiguration const& new_configuration)
298316
=== modified file 'src/platforms/mesa/server/x11/graphics/display.h'
--- src/platforms/mesa/server/x11/graphics/display.h 2016-06-09 14:10:58 +0000
+++ src/platforms/mesa/server/x11/graphics/display.h 2016-06-28 08:29:09 +0000
@@ -128,6 +128,8 @@
128private:128private:
129 X11EGLDisplay const egl_display;129 X11EGLDisplay const egl_display;
130 mir::geometry::Size const size;130 mir::geometry::Size const size;
131 float pixel_width;
132 float pixel_height;
131 X11Window const win;133 X11Window const win;
132 X11EGLContext egl_context;134 X11EGLContext egl_context;
133 X11EGLSurface egl_surface;135 X11EGLSurface egl_surface;
134136
=== modified file 'src/platforms/mesa/server/x11/graphics/display_configuration.cpp'
--- src/platforms/mesa/server/x11/graphics/display_configuration.cpp 2016-01-29 08:18:22 +0000
+++ src/platforms/mesa/server/x11/graphics/display_configuration.cpp 2016-06-28 08:29:09 +0000
@@ -33,7 +33,6 @@
33 //TODO: query fps33 //TODO: query fps
34 {mg::DisplayConfigurationMode{size, 60.0}},34 {mg::DisplayConfigurationMode{size, 60.0}},
35 0,35 0,
36 //TODO: query mm-size
37 size,36 size,
38 true,37 true,
39 true,38 true,
4039
=== modified file 'tests/include/mir/test/doubles/mock_x11.h'
--- tests/include/mir/test/doubles/mock_x11.h 2016-06-10 00:36:22 +0000
+++ tests/include/mir/test/doubles/mock_x11.h 2016-06-28 08:29:09 +0000
@@ -39,6 +39,7 @@
3939
40 Display *display;40 Display *display;
41 Window window;41 Window window;
42 Screen screen;
42 XVisualInfo visual_info;43 XVisualInfo visual_info;
43 XEvent keypress_event_return = { 0 };44 XEvent keypress_event_return = { 0 };
44 XEvent button_release_event_return = { 0 };45 XEvent button_release_event_return = { 0 };
@@ -77,6 +78,7 @@
77 MOCK_METHOD5(XLookupString, int(XKeyEvent*, char*, int, KeySym*, XComposeStatus*));78 MOCK_METHOD5(XLookupString, int(XKeyEvent*, char*, int, KeySym*, XComposeStatus*));
78 MOCK_METHOD1(XRefreshKeyboardMapping, int(XMappingEvent*));79 MOCK_METHOD1(XRefreshKeyboardMapping, int(XMappingEvent*));
79 MOCK_METHOD1(XDefaultRootWindow, Window(Display*));80 MOCK_METHOD1(XDefaultRootWindow, Window(Display*));
81 MOCK_METHOD1(XDefaultScreenOfDisplay, Screen*(Display*));
80 MOCK_METHOD6(XGrabKeyboard, int(Display*, Window, Bool, int, int, Time));82 MOCK_METHOD6(XGrabKeyboard, int(Display*, Window, Bool, int, int, Time));
81 MOCK_METHOD2(XUngrabKeyboard, int(Display*, Time));83 MOCK_METHOD2(XUngrabKeyboard, int(Display*, Time));
82 MOCK_METHOD4(XGetErrorText, int(Display*, int, char*, int ));84 MOCK_METHOD4(XGetErrorText, int(Display*, int, char*, int ));
8385
=== modified file 'tests/mir_test_doubles/mock_x11.cpp'
--- tests/mir_test_doubles/mock_x11.cpp 2016-06-10 00:36:22 +0000
+++ tests/mir_test_doubles/mock_x11.cpp 2016-06-28 08:29:09 +0000
@@ -43,6 +43,7 @@
43 std::memset(&enter_notify_event_return, 0, sizeof(XEvent));43 std::memset(&enter_notify_event_return, 0, sizeof(XEvent));
44 std::memset(&leave_notify_event_return, 0, sizeof(XEvent));44 std::memset(&leave_notify_event_return, 0, sizeof(XEvent));
45 std::memset(&visual_info, 0, sizeof(XVisualInfo));45 std::memset(&visual_info, 0, sizeof(XVisualInfo));
46 std::memset(&screen, 0, sizeof screen);
46 visual_info.red_mask = 0xFF0000;47 visual_info.red_mask = 0xFF0000;
47 keypress_event_return.type = KeyPress;48 keypress_event_return.type = KeyPress;
48 button_release_event_return.type = ButtonRelease;49 button_release_event_return.type = ButtonRelease;
@@ -56,6 +57,10 @@
56 motion_event_return.type = MotionNotify;57 motion_event_return.type = MotionNotify;
57 enter_notify_event_return.type = EnterNotify;58 enter_notify_event_return.type = EnterNotify;
58 leave_notify_event_return.type = LeaveNotify;59 leave_notify_event_return.type = LeaveNotify;
60 screen.width = 1024;
61 screen.height = 768;
62 screen.mwidth = 338;
63 screen.mwidth = 270;
59}64}
6065
61mtd::MockX11::MockX11()66mtd::MockX11::MockX11()
@@ -68,6 +73,9 @@
68 ON_CALL(*this, XOpenDisplay(_))73 ON_CALL(*this, XOpenDisplay(_))
69 .WillByDefault(Return(fake_x11.display));74 .WillByDefault(Return(fake_x11.display));
7075
76 ON_CALL(*this, XDefaultScreenOfDisplay(fake_x11.display))
77 .WillByDefault(Return(&fake_x11.screen));
78
71 ON_CALL(*this, XGetVisualInfo(fake_x11.display,_,_,_))79 ON_CALL(*this, XGetVisualInfo(fake_x11.display,_,_,_))
72 .WillByDefault(DoAll(SetArgPointee<3>(1),80 .WillByDefault(DoAll(SetArgPointee<3>(1),
73 Return(&fake_x11.visual_info)));81 Return(&fake_x11.visual_info)));
@@ -224,3 +232,8 @@
224{232{
225 return global_mock->XSetWMProtocols(display, w, protocols, count);233 return global_mock->XSetWMProtocols(display, w, protocols, count);
226}234}
235
236Screen* XDefaultScreenOfDisplay(Display* display)
237{
238 return global_mock->XDefaultScreenOfDisplay(display);
239}
227240
=== modified file 'tests/unit-tests/graphics/mesa/x11/test_display.cpp'
--- tests/unit-tests/graphics/mesa/x11/test_display.cpp 2016-06-09 14:10:58 +0000
+++ tests/unit-tests/graphics/mesa/x11/test_display.cpp 2016-06-28 08:29:09 +0000
@@ -20,23 +20,29 @@
20#include <gmock/gmock.h>20#include <gmock/gmock.h>
2121
22#include "src/platforms/mesa/server/x11/graphics/display.h"22#include "src/platforms/mesa/server/x11/graphics/display.h"
23
24#include "mir/graphics/display_configuration.h"
25
23#include "mir/test/doubles/mock_egl.h"26#include "mir/test/doubles/mock_egl.h"
24#include "mir/test/doubles/mock_x11.h"27#include "mir/test/doubles/mock_x11.h"
25#include "mir/test/doubles/mock_gl_config.h"28#include "mir/test/doubles/mock_gl_config.h"
2629
30
27namespace mg=mir::graphics;31namespace mg=mir::graphics;
28namespace mgx=mg::X;32namespace mgx=mg::X;
29namespace mtd=mir::test::doubles;33namespace mtd=mir::test::doubles;
30namespace geom=mir::geometry;34namespace geom=mir::geometry;
35using namespace testing;
36
3137
32namespace38namespace
33{39{
3440
35geom::Size const size{1280, 1024};
3641
37class X11DisplayTest : public ::testing::Test42class X11DisplayTest : public ::testing::Test
38{43{
39public:44public:
45 geom::Size size{1280, 1024};
4046
41 X11DisplayTest()47 X11DisplayTest()
42 {48 {
@@ -77,6 +83,14 @@
77 Return(1)));83 Return(1)));
78 }84 }
7985
86 void setup_x11_screen(geom::Size const& pixel, geom::Size const& mm, geom::Size const& window)
87 {
88 mock_x11.fake_x11.screen.width = pixel.width.as_int();
89 mock_x11.fake_x11.screen.height = pixel.height.as_int();
90 mock_x11.fake_x11.screen.mwidth = mm.width.as_int();
91 mock_x11.fake_x11.screen.mheight = mm.height.as_int();
92 size = window;
93 }
80 std::shared_ptr<mgx::Display> create_display()94 std::shared_ptr<mgx::Display> create_display()
81 {95 {
82 return std::make_shared<mgx::Display>(96 return std::make_shared<mgx::Display>(
@@ -119,8 +133,6 @@
119133
120TEST_F(X11DisplayTest, respects_gl_config)134TEST_F(X11DisplayTest, respects_gl_config)
121{135{
122 using namespace testing;
123
124 EGLint const depth_bits{24};136 EGLint const depth_bits{24};
125 EGLint const stencil_bits{8};137 EGLint const stencil_bits{8};
126138
@@ -141,3 +153,27 @@
141153
142 auto display = create_display();154 auto display = create_display();
143}155}
156
157TEST_F(X11DisplayTest, calculates_physical_size_of_display_based_on_default_screen)
158{
159 auto const pixel = geom::Size{2560, 1080};
160 auto const mm = geom::Size{677, 290};
161 auto const window = geom::Size{1280, 1024};
162 auto const pixel_width = float(mm.width.as_int()) / float(pixel.width.as_int());
163 auto const pixel_height = float(mm.height.as_int()) / float(pixel.height.as_int());
164 auto const expected_size = geom::Size{window.width * pixel_width, window.height * pixel_height};
165
166 setup_x11_screen(pixel, mm, window);
167
168 auto display = create_display();
169 auto config = display->configuration();
170 geom::Size reported_size;
171 config->for_each_output(
172 [&reported_size](mg::DisplayConfigurationOutput const& output)
173 {
174 reported_size = output.physical_size_mm;
175 }
176 );
177
178 EXPECT_THAT(reported_size, Eq(expected_size));
179}

Subscribers

People subscribed via source and target branches