~ci-train-bot/mir/mir-ubuntu-zesty-2683

« back to all changes in this revision

Viewing changes to src/server/graphics/nested/input_platform.cpp

  • Committer: Bileto Bot
  • Date: 2017-04-13 15:26:17 UTC
  • mfrom: (1160.2883.164 0.27)
  • Revision ID: ci-train-bot@canonical.com-20170413152617-bs7slz07xbzxu2d3
* New upstream release 0.27.0 (https://launchpad.net/mir/+milestone/0.27.0)
  - ABI summary:
    . mirclient ABI unchanged at 9
    . mirserver ABI bumped to 44
    . mircommon ABI unchanged at 7
    . mirplatform ABI bumped to 61
    . mirprotobuf ABI unchanged at 3
    . mirplatformgraphics ABI bumped to 13
    . mirclientplatform ABI unchanged at 5
    . mirinputplatform ABI bumped to 7
    . mircore ABI unchanged at 1
  - Enhancements:
    . Mostly groundwork required to support major enhancements coming in
      future Mir versions.
    . Removed android-input and eliminated the entire "3rd_party/" subtree.
      Now the Mir source tree contains original code only.
    . Added mir_prompt_session_new_fds_for_prompt_providers_sync API.
    . mirout: Added load and save options for keeping display configs
      on disk.
    . mirout: Added "--" support for applying configuration changes under
      Unity8.
    . Fixed failure of DRM hardware cursor {hide(); show(image);}
    . Added server option: "--cursor software" (MIR_SERVER_CURSOR=software)
    . Added letterboxing/black bars support to the GL renderer in preparation
      for generic output cloning.
    . Added client API for getting the logical size of an output.
    . Migrated MirCookie to use SHA-256.
    . Ensure RealKMSOutputConfiguration stays in sync with actual hardware
      state.
    . Added support for drag-and-drop.
    . Lots of other client API enhancements.
    . Minor clean-ups, optimizations and dead code removal.
  - Bugs fixed:
    . [enhancement] Make able to get version information from client /
      server APIs (LP: #1195540)
    . Touch screen coordinates don't rotate with the screen (LP: #1349660)
    . Subpixel order not included in Mir display information (LP: #1393578)
    . [enhancement] Missing client API for relative surface movement (e.g.
      dragging client-decorated windows) (LP: #1420334) . Mir does not reset
      key states when paused or resumed (modifiers get stuck after VT
      switching) (LP: #1536279)
    . Inconsistent behaviour of Num Lock (LP: #1588237)
    . [ FAILED ] NestedInput.nested_event_filter_receives_keyboard_from_host
      (LP: #1613523)
    . Rotating an output left or right without restarting the
      compositor distorts the image (LP: #1643488)
    . support display scaling slider in unity8 (LP: #1645372)
    . [ FAILED ] NestedInputWithMouse.mouse_pointer_coordinates_in_nested_
      server_are_accumulated (LP: #1646375)
    . [ FAILED ] NestedInputWithMouse.mouse_pointer_position_is_in_sync_with_
      host_server (LP: #1646558)
    . abi_check doesn't check mircore (LP: #1649354)
    . Under Unity8, mir_demo_client_target is distorted and input in the
      wrong place on start-up (LP: #1655804)
    . [testsfail] PromptSessionClientAPI.client_pid_is_associated_with_
      session hangs and times out (LP: #1655929)
    . EDID does not change when hotplugging a monitor (LP: #1660017)
    . [regression] Mir 0.26.0 - spinner loading animation, minimize, maximize
      too fast (LP: #1661072)
    . [regression] Unity8 stutters constantly (like half frame rate) using
      Mir 0.26.0 (LP: #1661128)
    . [regression] mir_demo_server refuses to quit on Ctrl+Alt+Backspace or
      Ctrl+C in its terminal (deadlock in DefaultInputDeviceHub::add_device)
      (LP: #1661151)
    . [regression] mirout crashes when connecting to unity8 or any nested
      server: [libprotobuf FATAL
      /usr/include/google/protobuf/repeated_field.h:1408] CHECK failed:
      (index) < (current_size_): (LP: #1661163)
    . [ FAILED ] DefaultInputManagerTest.forwards_pause_continue_state_
      changes_to_platform (LP: #1661187)
    . [regression] Segfault on detect_fd_leaks during acceptance tests (in
      DisplayConfiguration/{DisplayFormatSetting,DisplaySubpixelSetting})
      (LP: #1661498)
    . [regression] Nested server segfaults or rapidly logs exceptions when a
      fullscreen client starts [in mir_presentation_chain_set_dropping_mode
      ... std::exception::what: Operation not permitted] (LP: #1661508)
    . [regression] Windowed clients of nested servers are all black
      (LP: #1661521)
    . mir_window_request_persistent_id_sync seg faults when called twice
      (LP: #1661704)
    . mir_acceptance_tests now takes 10 seconds longer (in r4002 compared to
      r4001) (LP: #1662044)
    . Mir graphics platform ABI broke in series 0.26 but sonames never
      changed (LP: #1662455)
    . libmirclient-dev missing build depndency on libmircore-dev
      (LP: #1662942)
    . [regression] mirscreencast hangs during screencast creation
      (LP: #1662997)
    . [regression] Software clients of nested servers with size >=480x480
      are all black in Mir 0.25.0 and later (or stretched and distorted under
      Unity8) (LP: #1663062)
    . mir_window_spec_set_cursor_name() doesn't trigger
      mir::scene::SurfaceObserver::cursor_image_set_to (LP: #1663197)
    . android complaint during mirscreencast of nested server (LP: #1664562)
    . qtubuntu sends wrong text as part of QKeyEvent (LP: #1664610)
    . Mir server crashed with SIGSEGV in
      mir::compositor::TemporaryBuffer::size() called from
      mir::gl::tessellate_renderable_into_rectangle() (LP: #1664760)
    . mirout reports logical size of a rotated display incorrectly
      (LP: #1665271)
    . Nested servers (Unity8) periodically stutter (half frame rate) with
      Mir 0.26.1 (LP: #1666372)
    . If the only surface in a session cannot take focus the server crashes
      (LP: #1667645)
    . [regression] OSK input shaping no longer works correctly (LP: #1669444)
    . GTK window functions `Always on Top, Move and Resize' don't work in
      Mir/Unity8 (LP: #1669524)
    . [regression] mir_proving_server mode hotkeys (Ctrl+Alt+=/-) cause the
      server to segfault (LP: #1669752)
    . Test takes minutes to complete: MediatingDisplayChangerTest.confirmed_
      configuration_doesnt_revert_after_timeout (LP: #1671033)
    . [ FAILED ] PosixRWMutex.prefer_writer_nonrecursive_prevents_writer_
      starvation (Timeout waiting to acquire write lock) (LP: #1671037)
    . [regression] Mixing screen rotation with mode changes makes the image
      squished (LP: #1672269)
    . unity-system-compositor crashed with SIGSEGV in
      libinput_device_config_accel_is_available() from
      libinput_device_config_accel_set_speed() from
      mir::input::evdev::LibInputDevice::apply_settings() (LP: #1672955)
    . Presentation chains should support various Vulkan presentation modes
      (LP: #1673533)
    . Need an extension for GBM buffers to replace
      mir_buffer_get_buffer_package() (LP: #1673534)
    . cross-compile-chroot.sh (to zesty) fails to build [cannot find -ludev]
      due to libudev.so being in a different directory to where libudev.pc
      searches for it (LP: #1674201)
    . Please transition to Boost 1.62 (LP: #1675138)
    . [regression] Mir is assigning the first output ID = 0 (==
      mir_display_output_id_invalid) (LP: #1675331)
    . Mir sending key repeat events continually to nested shell after VT
      switch (causes Unity8 lockup for a while) (LP: #1675357)
    . mirout commands don't work when followed by -- (LP: #1676320)
    . mir_demo_standalone_render_overlays fails to link (LP: #1677239)
    . [regression] doxygen processing for capnproto/protobuf broken
      (LP: #1679248)
    . mir_window_spec_set_cursor_render_surface does not work (LP: #1679836)

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
#include "mir/input/event_builder.h"
28
28
#include "mir/input/pointer_settings.h"
29
29
#include "mir/input/touchpad_settings.h"
 
30
#include "mir/input/touchscreen_settings.h"
30
31
#include "mir/input/device_capability.h"
31
32
#include "mir/dispatch/action_queue.h"
32
33
#include "mir/events/event_builders.h"
56
57
struct mgn::InputPlatform::InputDevice : mi::InputDevice
57
58
{
58
59
public:
59
 
    InputDevice(MirInputDevice const* dev)
 
60
    InputDevice(MirInputDevice* dev, std::function<void()> config_change)
 
61
        : emit_device_change{config_change}
60
62
    {
61
63
        update(dev);
62
64
    }
66
68
        return device_id;
67
69
    }
68
70
 
69
 
    void update(MirInputDevice const* dev)
 
71
    void update(MirInputDevice* dev)
70
72
    {
 
73
        device = dev;
71
74
        device_id = mir_input_device_get_id(dev);
72
75
        device_info.name = mir_input_device_get_name(dev);
73
76
        device_info.unique_id = mir_input_device_get_unique_id(dev);
74
77
        device_info.capabilities = mi::DeviceCapabilities(mir_input_device_get_capabilities(dev));
 
78
 
 
79
        auto pointer_config = mir_input_device_get_pointer_config(dev);
 
80
        if (pointer_config && contains(device_info.capabilities, mi::DeviceCapability::pointer))
 
81
        {
 
82
            mi::PointerSettings settings;
 
83
            settings.handedness = mir_pointer_config_get_handedness(pointer_config);
 
84
            settings.cursor_acceleration_bias = mir_pointer_config_get_acceleration_bias(pointer_config);
 
85
            settings.acceleration = mir_pointer_config_get_acceleration(pointer_config);
 
86
            settings.horizontal_scroll_scale = mir_pointer_config_get_horizontal_scroll_scale(pointer_config);
 
87
            settings.vertical_scroll_scale = mir_pointer_config_get_vertical_scroll_scale(pointer_config);
 
88
 
 
89
            pointer_settings = settings;
 
90
        }
 
91
 
 
92
        auto touchpad_config = mir_input_device_get_touchpad_config(dev);
 
93
        if (touchpad_config && contains(device_info.capabilities, mi::DeviceCapability::touchpad))
 
94
        {
 
95
            mi::TouchpadSettings settings;
 
96
            settings.click_mode = mir_touchpad_config_get_click_modes(touchpad_config);
 
97
            settings.scroll_mode = mir_touchpad_config_get_scroll_modes(touchpad_config);
 
98
            settings.button_down_scroll_button = mir_touchpad_config_get_button_down_scroll_button(touchpad_config);
 
99
            settings.tap_to_click = mir_touchpad_config_get_tap_to_click(touchpad_config);
 
100
            settings.disable_while_typing = mir_touchpad_config_get_disable_while_typing(touchpad_config);
 
101
            settings.disable_with_mouse = mir_touchpad_config_get_disable_with_mouse(touchpad_config);
 
102
            settings.middle_mouse_button_emulation = mir_touchpad_config_get_middle_mouse_button_emulation(touchpad_config);
 
103
 
 
104
            touchpad_settings = settings;
 
105
        }
 
106
 
 
107
        auto touchscreen_config = mir_input_device_get_touchscreen_config(dev);
 
108
        if (touchscreen_config && contains(device_info.capabilities, mi::DeviceCapability::touchscreen))
 
109
        {
 
110
            mi::TouchscreenSettings settings;
 
111
            settings.output_id = mir_touchscreen_config_get_output_id(touchscreen_config);
 
112
            settings.mapping_mode = mir_touchscreen_config_get_mapping_mode(touchscreen_config);
 
113
 
 
114
            touchscreen_settings = settings;
 
115
        }
75
116
    }
76
117
 
77
118
    void start(mi::InputSink* destination, mi::EventBuilder* builder) override
163
204
        return pointer_settings;
164
205
    }
165
206
 
166
 
    void apply_settings(mi::PointerSettings const&) override
 
207
    void apply_settings(mi::PointerSettings const& new_settings) override
167
208
    {
168
 
        // TODO no C API for that 
 
209
        if (pointer_settings.is_set() && pointer_settings.value() == new_settings)
 
210
            return;
 
211
 
 
212
        auto ptr_conf = mir_input_device_get_mutable_pointer_config(device);
 
213
 
 
214
        if (ptr_conf)
 
215
        {
 
216
            mir_pointer_config_set_acceleration(ptr_conf, new_settings.acceleration);
 
217
            mir_pointer_config_set_acceleration_bias(ptr_conf, new_settings.cursor_acceleration_bias);
 
218
            mir_pointer_config_set_handedness(ptr_conf, new_settings.handedness);
 
219
            mir_pointer_config_set_vertical_scroll_scale(ptr_conf, new_settings.vertical_scroll_scale);
 
220
            mir_pointer_config_set_horizontal_scroll_scale(ptr_conf, new_settings.horizontal_scroll_scale);
 
221
 
 
222
            emit_device_change();
 
223
        }
169
224
    }
170
225
 
171
226
    mir::optional_value<mi::TouchpadSettings> get_touchpad_settings() const override
173
228
        return touchpad_settings;
174
229
    }
175
230
 
176
 
    void apply_settings(mi::TouchpadSettings const&) override
177
 
    {
178
 
        // no c api for that
 
231
    void apply_settings(mi::TouchpadSettings const& new_settings) override
 
232
    {
 
233
        if (touchpad_settings.is_set() && touchpad_settings.value() == new_settings)
 
234
            return;
 
235
 
 
236
        auto tpd_conf = mir_input_device_get_mutable_touchpad_config(device);
 
237
 
 
238
        if (tpd_conf)
 
239
        {
 
240
            mir_touchpad_config_set_click_modes(tpd_conf, new_settings.click_mode);
 
241
            mir_touchpad_config_set_scroll_modes(tpd_conf, new_settings.scroll_mode);
 
242
            mir_touchpad_config_set_button_down_scroll_button(tpd_conf, new_settings.button_down_scroll_button);
 
243
            mir_touchpad_config_set_tap_to_click(tpd_conf, new_settings.tap_to_click);
 
244
            mir_touchpad_config_set_disable_with_mouse(tpd_conf, new_settings.disable_with_mouse);
 
245
            mir_touchpad_config_set_disable_while_typing(tpd_conf, new_settings.disable_while_typing);
 
246
            mir_touchpad_config_set_middle_mouse_button_emulation(tpd_conf, new_settings.middle_mouse_button_emulation);
 
247
 
 
248
            emit_device_change();
 
249
        }
 
250
    }
 
251
 
 
252
    mir::optional_value<mi::TouchscreenSettings> get_touchscreen_settings() const override
 
253
    {
 
254
        return touchscreen_settings;
 
255
    }
 
256
 
 
257
    void apply_settings(mi::TouchscreenSettings const& new_settings) override
 
258
    {
 
259
        if (touchscreen_settings.is_set() && touchscreen_settings.value() == new_settings)
 
260
            return;
 
261
 
 
262
        auto ts_conf = mir_input_device_get_mutable_touchscreen_config(device);
 
263
 
 
264
        if (ts_conf)
 
265
        {
 
266
            mir_touchscreen_config_set_output_id(ts_conf, new_settings.output_id);
 
267
            mir_touchscreen_config_set_mapping_mode(ts_conf, new_settings.mapping_mode);
 
268
 
 
269
            emit_device_change();
 
270
        }
179
271
    }
180
272
 
181
273
    MirInputDeviceId device_id;
 
274
    MirInputDevice* device{nullptr};
182
275
    mi::InputSink* destination{nullptr};
183
276
    mi::EventBuilder* builder{nullptr};
184
277
    mi::InputDeviceInfo device_info;
185
278
    mir::optional_value<mi::PointerSettings> pointer_settings;
186
279
    mir::optional_value<mi::TouchpadSettings> touchpad_settings;
 
280
    mir::optional_value<mi::TouchscreenSettings> touchscreen_settings;
 
281
    std::function<void()> emit_device_change;
187
282
};
188
283
 
189
284
 
201
296
 
202
297
void mgn::InputPlatform::start()
203
298
{
 
299
    state = started;
204
300
    {
205
301
        std::lock_guard<std::mutex> lock(devices_guard);
206
302
        input_config = connection->create_input_device_config();
286
382
        input_device_registry->remove_device(device.second);
287
383
 
288
384
    devices.clear();
 
385
    state = stopped;
289
386
}
290
387
 
291
388
void mgn::InputPlatform::update_devices()
301
398
    auto config_ptr = input_config.get();
302
399
    for (size_t i = 0, e = mir_input_config_device_count(config_ptr); i!=e; ++i)
303
400
    {
304
 
        auto dev = mir_input_config_get_device(config_ptr, i);
 
401
        auto dev = mir_input_config_get_mutable_device(config_ptr, i);
305
402
        auto const id = mir_input_device_get_id(dev);
306
403
        auto it = deleted.find(id);
307
404
        if (it != end(deleted))
312
409
        }
313
410
        else
314
411
        {
315
 
            new_devs.emplace_back(std::make_shared<InputDevice>(dev), id);
 
412
            new_devs.emplace_back(
 
413
                std::make_shared<InputDevice>(dev, [this]() { config_changed(); }),
 
414
                id);
316
415
            devices[id] = new_devs.back().first;
317
416
        }
318
417
    }
335
434
    }
336
435
    unknown_device_events.clear();
337
436
}
 
437
 
 
438
void mgn::InputPlatform::config_changed()
 
439
{
 
440
    if (state != paused)
 
441
    {
 
442
        connection->apply_input_configuration(input_config.get());
 
443
    }
 
444
    else
 
445
    {
 
446
        changed = true;
 
447
    }
 
448
}
 
449
 
 
450
void mgn::InputPlatform::pause_for_config()
 
451
{
 
452
    state = paused;
 
453
}
 
454
 
 
455
void mgn::InputPlatform::continue_after_config()
 
456
{
 
457
    if (changed)
 
458
    {
 
459
        connection->apply_input_configuration(input_config.get());
 
460
        changed = false;
 
461
    }
 
462
    state = started;
 
463
}