Skip to content

Commit

Permalink
Move focus stealing prevention stuff to MinimalWindowManager
Browse files Browse the repository at this point in the history
  • Loading branch information
tarek-y-ismail committed Dec 4, 2024
1 parent 146ed5c commit cb04206
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 20 deletions.
14 changes: 3 additions & 11 deletions examples/example-server-lib/floating_window_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,9 @@ FloatingWindowManagerPolicy::FloatingWindowManagerPolicy(
miral::InternalClientLauncher const& launcher,
std::function<void()>& shutdown_hook,
bool focus_stealing_prevention) :
MinimalWindowManager(tools),
MinimalWindowManager(tools, focus_stealing_prevention),
spinner{spinner},
decoration_provider{std::make_unique<DecorationProvider>()},
focus_stealing_prevention{focus_stealing_prevention}
decoration_provider{std::make_unique<DecorationProvider>()}
{
launcher.launch(*decoration_provider);
shutdown_hook = [this] { decoration_provider->stop(); };
Expand Down Expand Up @@ -241,12 +240,7 @@ void FloatingWindowManagerPolicy::advise_new_window(WindowInfo const& window_inf
auto const parent = window_info.parent();

if (!parent)
{
tools.add_tree_to_workspace(window_info.window(), active_workspace);

if (focus_stealing_prevention && tools.active_window())
tools.swap_tree_order(tools.active_window(), window_info.window());
}
else
{
if (policy_data_for(tools.info_for(parent)).in_hidden_workspace)
Expand All @@ -256,9 +250,7 @@ void FloatingWindowManagerPolicy::advise_new_window(WindowInfo const& window_inf

void FloatingWindowManagerPolicy::handle_window_ready(WindowInfo& window_info)
{
if (!focus_stealing_prevention || !tools.active_window())
MinimalWindowManager::handle_window_ready(window_info);

MinimalWindowManager::handle_window_ready(window_info);
keep_spinner_on_top();
}

Expand Down
2 changes: 0 additions & 2 deletions examples/example-server-lib/floating_window_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,8 +126,6 @@ class FloatingWindowManagerPolicy : public miral::MinimalWindowManager
void apply_workspace_hidden_to(miral::Window const& window);

void keep_spinner_on_top();

bool const focus_stealing_prevention{true};
};

#endif //MIRAL_SHELL_FLOATING_WINDOW_MANAGER_H
1 change: 1 addition & 0 deletions include/miral/miral/minimal_window_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class MinimalWindowManager : public WindowManagementPolicy
{
public:
explicit MinimalWindowManager(WindowManagerTools const& tools);
explicit MinimalWindowManager(WindowManagerTools const& tools, bool focus_stealing_prevention);

/// Allows shells to change the modifer used to identify a window drag gesture
/// The default is mir_input_event_modifier_alt
Expand Down
37 changes: 30 additions & 7 deletions src/miral/minimal_window_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,14 @@ auto touch_center(MirTouchEvent const* event) -> mir::geometry::Point

struct miral::MinimalWindowManager::Impl
{
Impl(WindowManagerTools const& tools, MirInputEventModifier pointer_drag_modifier) :
tools{tools}, application_selector(tools), pointer_drag_modifier{pointer_drag_modifier} {}
Impl(WindowManagerTools const& tools, MirInputEventModifier pointer_drag_modifier, bool focus_stealing_prevention) :
tools{tools},
application_selector(tools),
pointer_drag_modifier{pointer_drag_modifier},
focus_stealing_prevention{focus_stealing_prevention}
{
}

WindowManagerTools tools;

Gesture gesture = Gesture::none;
Expand Down Expand Up @@ -99,6 +105,7 @@ struct miral::MinimalWindowManager::Impl
void apply_resize_by(Displacement movement);

MirInputEventModifier const pointer_drag_modifier;
bool focus_stealing_prevention{false};
};

miral::MinimalWindowManager::MinimalWindowManager(WindowManagerTools const& tools) :
Expand All @@ -108,7 +115,13 @@ miral::MinimalWindowManager::MinimalWindowManager(WindowManagerTools const& tool

miral::MinimalWindowManager::MinimalWindowManager(WindowManagerTools const& tools, MirInputEventModifier pointer_drag_modifier):
tools{tools},
self{new Impl{tools, pointer_drag_modifier}}
self{new Impl{tools, pointer_drag_modifier, false}}
{
}

miral::MinimalWindowManager::MinimalWindowManager(WindowManagerTools const& tools, bool focus_stealing_prevention) :
tools{tools},
self{new Impl{tools, mir_input_event_modifier_alt, focus_stealing_prevention}}
{
}

Expand All @@ -126,10 +139,13 @@ auto miral::MinimalWindowManager::place_new_window(

void miral::MinimalWindowManager::handle_window_ready(WindowInfo& window_info)
{
if (window_info.can_be_active())
{
tools.select_active_window(window_info.window());
}
// If focus stealing prevention isn't enabled, activate on window ready (if
// possible). Otherwise, only activate the first opened window.
if (!self->focus_stealing_prevention || !tools.active_window())
if (window_info.can_be_active())
{
tools.select_active_window(window_info.window());
}
}

void miral::MinimalWindowManager::handle_modify_window(
Expand Down Expand Up @@ -277,6 +293,13 @@ auto miral::MinimalWindowManager::confirm_inherited_move(WindowInfo const& windo
void miral::MinimalWindowManager::advise_new_window(miral::WindowInfo const& window_info)
{
self->application_selector.advise_new_window(window_info);

// If focus stealing prevention is on, swap the old focused window (now in
// the back) with the new window in the front.
// If it's a legitimate window, it'll be focused and raised via
// xdg-activation.
if (self->focus_stealing_prevention && tools.active_window())
tools.swap_tree_order(tools.active_window(), window_info.window());
}

void miral::MinimalWindowManager::advise_focus_gained(WindowInfo const& window_info)
Expand Down

0 comments on commit cb04206

Please sign in to comment.