Skip to content

Commit

Permalink
(#3357) provide a mechanism to move the cursor to a position immediately
Browse files Browse the repository at this point in the history
  • Loading branch information
mattkae committed May 2, 2024
1 parent fe39f76 commit e71ae5e
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 1 deletion.
7 changes: 7 additions & 0 deletions include/miral/miral/window_manager_tools.h
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,13 @@ class WindowManagerTools
*/
void invoke_under_lock(std::function<void()> const& callback);

/**
* Move the cursor to the provided point. If the point is outside of the range of the outputs,
* the point is clamped.
* @param point
*/
void move_cursor_to(mir::geometry::PointF point);

private:
WindowManagerToolsImplementation* tools;
};
Expand Down
24 changes: 23 additions & 1 deletion src/miral/basic_window_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@
#include <mir/shell/display_layout.h>
#include <mir/shell/persistent_surface_store.h>
#include <mir/shell/surface_specification.h>
#include <mir/input/virtual_input_device.h>
#include <mir/input/event_builder.h>
#include <mir/input/input_sink.h>

#include <boost/throw_exception.hpp>

Expand Down Expand Up @@ -99,7 +102,8 @@ miral::BasicWindowManager::BasicWindowManager(
display_layout(display_layout),
persistent_surface_store{persistent_surface_store},
policy(build(WindowManagerTools{this})),
display_config_monitor{std::make_shared<DisplayConfigurationListeners>()}
display_config_monitor{std::make_shared<DisplayConfigurationListeners>()},
pointer_device{std::make_shared<mir::input::VirtualInputDevice>("basic-window-manager", mir::input::DeviceCapability::pointer)}
{
display_config_monitor->add_listener(this);
display_configuration_observers.register_interest(display_config_monitor);
Expand Down Expand Up @@ -2981,3 +2985,21 @@ void miral::BasicWindowManager::update_application_zones_and_attached_windows()
area->zone_policy_knows_about = area->application_zone;
}
}

void miral::BasicWindowManager::move_cursor_to(mir::geometry::PointF point)
{
pointer_device->if_started_then([&](input::InputSink* sink, input::EventBuilder* builder)
{
std::chrono::nanoseconds now = std::chrono::system_clock::now().time_since_epoch();
auto event = builder->pointer_event(
now,
mir_pointer_action_motion,
0,
point,
DisplacementF{0, 0},
mir_pointer_axis_source_none,
events::ScrollAxisH(),
events::ScrollAxisV());
sink->handle_input(std::move(event));
});
}
4 changes: 4 additions & 0 deletions src/miral/basic_window_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ namespace mir
{
namespace shell { class DisplayLayout; class PersistentSurfaceStore; }
namespace graphics { class DisplayConfigurationObserver; }
namespace input { class VirtualInputDevice; }
}

namespace miral
Expand Down Expand Up @@ -192,6 +193,8 @@ class BasicWindowManager : public virtual mir::shell::WindowManager,

void invoke_under_lock(std::function<void()> const& callback) override;

void move_cursor_to(mir::geometry::PointF point) override;

private:
/// An area for windows to be placed in
struct DisplayArea
Expand Down Expand Up @@ -272,6 +275,7 @@ class BasicWindowManager : public virtual mir::shell::WindowManager,
wwbimap_t workspaces_to_windows;

std::shared_ptr<DisplayConfigurationListeners> const display_config_monitor;
std::shared_ptr<mir::input::VirtualInputDevice> const pointer_device;

struct Locker;

Expand Down
9 changes: 9 additions & 0 deletions src/miral/window_management_trace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -938,3 +938,12 @@ try {
return policy->advise_application_zone_delete(application_zone);
}
MIRAL_TRACE_EXCEPTION

void miral::WindowManagementTrace::move_cursor_to(mir::geometry::PointF point)
try {
std::stringstream out;
out << point;
mir::log_info("%s cursor=%s", __func__, out.str().c_str());
wrapped.move_cursor_to(point);
}
MIRAL_TRACE_EXCEPTION
2 changes: 2 additions & 0 deletions src/miral/window_management_trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,8 @@ class WindowManagementTrace
MirWindowState new_state,
Rectangle const& new_placement) -> Rectangle override;

void move_cursor_to(mir::geometry::PointF point) override;

public:
virtual void advise_begin() override;

Expand Down
3 changes: 3 additions & 0 deletions src/miral/window_manager_tools.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -143,3 +143,6 @@ void miral::WindowManagerTools::for_each_window_in_workspace(
std::shared_ptr<miral::Workspace> const& workspace,
std::function<void(miral::Window const&)> const& callback)
{ tools->for_each_window_in_workspace(workspace, callback); }

void miral::WindowManagerTools::move_cursor_to(mir::geometry::PointF point)
{ tools->move_cursor_to(point); }
1 change: 1 addition & 0 deletions src/miral/window_manager_tools_implementation.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ class WindowManagerToolsImplementation
virtual void for_each_window_in_workspace(
std::shared_ptr<Workspace> const& workspace,
std::function<void(Window const& window)> const& callback) = 0;
virtual void move_cursor_to(mir::geometry::PointF point) = 0;

/** @} */

Expand Down

0 comments on commit e71ae5e

Please sign in to comment.