Skip to content

Commit 3ac0284

Browse files
authored
api: make input focus global state (#1913)
The keyboard input focus has always been a global state (to be precise, per-seat, but Wayfire has only one seat anyway). However, previously the focused view has been managed per-output, which makes little sense and does not reflect reality, nor the desired behavior. This commit moves all keyboard-focus functionality out of wf::output_t and into wf::seat_t. Should fix #1892
1 parent c6d0d28 commit 3ac0284

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+540
-585
lines changed

plugins/common/wayfire/plugins/common/input-grab.hpp

+3-5
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <wayfire/debug.hpp>
99
#include <memory>
1010
#include <string>
11+
#include <wayfire/seat.hpp>
1112
namespace wf
1213
{
1314
namespace scene
@@ -146,8 +147,7 @@ class input_grab_t
146147
children.insert(idx, grab_node);
147148
root->set_children_list(children);
148149
wf::get_core().transfer_grab(grab_node);
149-
scene::update(root, scene::update_flag::CHILDREN_LIST);
150-
output->refocus();
150+
scene::update(root, scene::update_flag::CHILDREN_LIST | scene::update_flag::REFOCUS);
151151

152152
// Set cursor to default.
153153
wf::get_core().set_cursor("default");
@@ -160,10 +160,8 @@ class input_grab_t
160160
{
161161
if (grab_node->parent())
162162
{
163-
wf::scene::remove_child(grab_node);
163+
wf::scene::remove_child(grab_node, scene::update_flag::REFOCUS);
164164
}
165-
166-
output->refocus();
167165
}
168166
};
169167
}

plugins/common/wayfire/plugins/common/move-drag-interface.hpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "wayfire/scene-operations.hpp"
1010
#include "wayfire/scene-render.hpp"
1111
#include "wayfire/scene.hpp"
12+
#include "wayfire/seat.hpp"
1213
#include "wayfire/signal-definitions.hpp"
1314
#include <memory>
1415
#include <wayfire/nonstd/reverse.hpp>
@@ -669,7 +670,7 @@ class core_drag_t : public signal::provider_t
669670

670671
current_output = output;
671672
data.focus_output = output;
672-
wf::get_core().focus_output(output);
673+
wf::get_core().seat->focus_output(output);
673674
emit(&data);
674675

675676
if (output)
@@ -774,7 +775,7 @@ inline void adjust_view_on_output(drag_done_signal *ev)
774775
ev->focused_output->wset()->move_to_workspace(v, target_ws);
775776
}
776777

777-
ev->focused_output->focus_view(focus_view, true);
778+
wf::get_core().default_wm->focus_raise_view(focus_view);
778779
}
779780

780781
/**

plugins/ipc/ipc-activator.hpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "wayfire/option-wrapper.hpp"
1010
#include "wayfire/output.hpp"
1111
#include "wayfire/plugins/common/shared-core-data.hpp"
12+
#include "wayfire/seat.hpp"
1213

1314
namespace wf
1415
{
@@ -74,7 +75,7 @@ class ipc_activator_t
7475
WFJSON_OPTIONAL_FIELD(data, "output_id", number_integer);
7576
WFJSON_OPTIONAL_FIELD(data, "view_id", number_integer);
7677

77-
wf::output_t *wo = wf::get_core().get_active_output();
78+
wf::output_t *wo = wf::get_core().seat->get_active_output();
7879
if (data.contains("output_id"))
7980
{
8081
wo = ipc::find_output_by_id(data["output_id"]);
@@ -104,7 +105,7 @@ class ipc_activator_t
104105

105106
wf::output_t *choose_output()
106107
{
107-
return wf::get_core().get_active_output();
108+
return wf::get_core().seat->get_active_output();
108109
}
109110

110111
wayfire_view choose_view(wf::activator_source_t source)
@@ -115,7 +116,7 @@ class ipc_activator_t
115116
view = wf::get_core().get_cursor_focus_view();
116117
} else
117118
{
118-
view = wf::get_core().get_active_output()->get_active_view();
119+
view = wf::get_core().seat->get_active_view();
119120
}
120121

121122
return view;

plugins/scale/scale-title-filter.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <wayfire/plugins/scale-signal.hpp>
1111
#include <wayfire/nonstd/wlroots-full.hpp>
1212
#include <wayfire/toplevel-view.hpp>
13+
#include <wayfire/seat.hpp>
1314

1415
#include <linux/input-event-codes.h>
1516

@@ -218,7 +219,7 @@ class scale_title_filter : public wf::per_output_plugin_instance_t
218219
return;
219220
}
220221

221-
if (output != wf::get_core().get_active_output())
222+
if (output != wf::get_core().seat->get_active_output())
222223
{
223224
return;
224225
}

plugins/scale/scale.cpp

+19-29
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ class wayfire_scale : public wf::per_output_plugin_instance_t,
418418
{
419419
if (view == current_focus_view)
420420
{
421-
current_focus_view = toplevel_cast(output->get_active_view());
421+
current_focus_view = toplevel_cast(wf::get_active_view_for_output(output));
422422
}
423423

424424
if (view == initial_focus_view)
@@ -498,9 +498,6 @@ class wayfire_scale : public wf::per_output_plugin_instance_t,
498498
// End scale
499499
initial_focus_view = nullptr;
500500
deactivate();
501-
select_view(view);
502-
503-
output->focus_view(view, false);
504501
break;
505502

506503
case BTN_MIDDLE:
@@ -587,15 +584,16 @@ class wayfire_scale : public wf::per_output_plugin_instance_t,
587584

588585
void handle_keyboard_key(wf::seat_t*, wlr_keyboard_key_event ev) override
589586
{
590-
auto view = toplevel_cast(output->get_active_view());
587+
auto view = toplevel_cast(wf::get_active_view_for_output(output));
591588
if (!view)
592589
{
593590
view = current_focus_view;
594591
if (view)
595592
{
596593
fade_out_all_except(view);
597594
fade_in(view);
598-
output->focus_view(view, true);
595+
596+
wf::get_core().default_wm->focus_raise_view(view);
599597
return;
600598
}
601599
} else if (!scale_data.count(view))
@@ -635,14 +633,14 @@ class wayfire_scale : public wf::per_output_plugin_instance_t,
635633
case KEY_ENTER:
636634
deactivate();
637635
select_view(current_focus_view);
638-
output->focus_view(current_focus_view, true);
636+
wf::get_core().default_wm->focus_raise_view(view);
639637

640638
return;
641639

642640
case KEY_ESC:
643641
deactivate();
644642
output->wset()->request_workspace(initial_workspace);
645-
output->focus_view(initial_focus_view, true);
643+
wf::get_core().default_wm->focus_raise_view(initial_focus_view);
646644
initial_focus_view = nullptr;
647645

648646
return;
@@ -682,9 +680,12 @@ class wayfire_scale : public wf::per_output_plugin_instance_t,
682680
view = find_view_in_grid(next_row, next_col);
683681
if (view && (current_focus_view != view))
684682
{
685-
/* view_focused handler will update the view state
686-
* note: this will always unminimize a minimized view */
687-
output->focus_view(view, false);
683+
fade_out_all_except(view);
684+
fade_in(view);
685+
current_focus_view = view;
686+
687+
// Update activated state
688+
wf::get_core().seat->focus_view(view);
688689
}
689690
}
690691

@@ -896,7 +897,7 @@ class wayfire_scale : public wf::per_output_plugin_instance_t,
896897
});
897898

898899
current_focus_view = views.empty() ? nullptr : views.front();
899-
output->focus_view(current_focus_view, true);
900+
wf::get_core().default_wm->focus_raise_view(current_focus_view);
900901
}
901902
}
902903

@@ -1162,7 +1163,7 @@ class wayfire_scale : public wf::per_output_plugin_instance_t,
11621163
{
11631164
if (current_focus_view)
11641165
{
1165-
output->focus_view(current_focus_view, true);
1166+
wf::get_core().default_wm->focus_raise_view(current_focus_view);
11661167
}
11671168

11681169
layout_slots(get_views());
@@ -1202,20 +1203,12 @@ class wayfire_scale : public wf::per_output_plugin_instance_t,
12021203
}
12031204
};
12041205

1205-
/* View focused. This handler makes sure our view remains focused */
1206-
wf::signal::connection_t<wf::focus_view_signal> view_focused = [=] (wf::focus_view_signal *ev)
1207-
{
1208-
fade_out_all_except(toplevel_cast(ev->view));
1209-
fade_in(toplevel_cast(ev->view));
1210-
current_focus_view = toplevel_cast(ev->view);
1211-
};
1212-
12131206
/* Our own refocus that uses untransformed coordinates */
12141207
void refocus()
12151208
{
12161209
if (current_focus_view)
12171210
{
1218-
output->focus_view(current_focus_view, true);
1211+
wf::get_core().default_wm->focus_raise_view(current_focus_view);
12191212
select_view(current_focus_view);
12201213

12211214
return;
@@ -1234,7 +1227,7 @@ class wayfire_scale : public wf::per_output_plugin_instance_t,
12341227
}
12351228
}
12361229

1237-
output->focus_view(next_focus, true);
1230+
wf::get_core().default_wm->focus_raise_view(current_focus_view);
12381231
}
12391232

12401233
/* Returns true if any scale animation is running */
@@ -1340,16 +1333,16 @@ class wayfire_scale : public wf::per_output_plugin_instance_t,
13401333
}
13411334

13421335
initial_workspace = output->wset()->get_current_workspace();
1343-
initial_focus_view = toplevel_cast(output->get_active_view());
1336+
initial_focus_view = toplevel_cast(wf::get_active_view_for_output(output));
13441337
current_focus_view = initial_focus_view ?: views.front();
13451338
// Make sure no leftover events from the activation binding
13461339
// trigger an action in scale
13471340
last_selected_view = nullptr;
13481341

13491342
grab->grab_input(wf::scene::layer::OVERLAY);
1350-
if (current_focus_view != output->get_active_view())
1343+
if (current_focus_view != wf::get_core().seat->get_active_view())
13511344
{
1352-
output->focus_view(current_focus_view, true);
1345+
wf::get_core().default_wm->focus_raise_view(current_focus_view);
13531346
}
13541347

13551348
active = true;
@@ -1362,7 +1355,6 @@ class wayfire_scale : public wf::per_output_plugin_instance_t,
13621355
output->connect(&view_disappeared);
13631356
output->connect(&view_minimized);
13641357
output->connect(&view_unmapped);
1365-
output->connect(&view_focused);
13661358

13671359
fade_out_all_except(current_focus_view);
13681360
fade_in(current_focus_view);
@@ -1376,7 +1368,6 @@ class wayfire_scale : public wf::per_output_plugin_instance_t,
13761368
active = false;
13771369

13781370
set_hook();
1379-
view_focused.disconnect();
13801371
on_view_mapped.disconnect();
13811372
on_view_set_output.disconnect();
13821373
view_unmapped.disconnect();
@@ -1433,7 +1424,6 @@ class wayfire_scale : public wf::per_output_plugin_instance_t,
14331424
remove_transformers();
14341425
scale_data.clear();
14351426
grab->ungrab_input();
1436-
view_focused.disconnect();
14371427
on_view_mapped.disconnect();
14381428
on_view_set_output.disconnect();
14391429
view_unmapped.disconnect();

plugins/single_plugins/fast-switcher.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <wayfire/util/log.hpp>
1212
#include <wayfire/seat.hpp>
1313
#include <wayfire/toplevel-view.hpp>
14+
#include <wayfire/window-manager.hpp>
1415

1516
/*
1617
* This plugin provides abilities to switch between views.
@@ -74,7 +75,7 @@ class wayfire_fast_switcher : public wf::per_output_plugin_instance_t, public wf
7475
wf::view_bring_to_front(views[i]);
7576
} else
7677
{
77-
output->focus_view(views[i], true);
78+
wf::get_core().default_wm->focus_raise_view(views[i]);
7879
}
7980
}
8081

plugins/single_plugins/idle.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ class wayfire_idle_plugin : public wf::per_output_plugin_instance_t
194194
output->connect(&fullscreen_state_changed);
195195
disable_on_fullscreen.set_callback(disable_on_fullscreen_changed);
196196

197-
if (auto toplevel = toplevel_cast(output->get_active_view()))
197+
if (auto toplevel = toplevel_cast(wf::get_active_view_for_output(output)))
198198
{
199199
/* Currently, the fullscreen count would always be 0 or 1,
200200
* since fullscreen-layer-focused is only emitted on changes between 0

plugins/single_plugins/ipc-rules.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <wayfire/view.hpp>
44
#include <wayfire/output.hpp>
55
#include <wayfire/toplevel-view.hpp>
6+
#include <wayfire/seat.hpp>
67
#include <set>
78

89
#include "plugins/ipc/ipc-helpers.hpp"
@@ -75,7 +76,7 @@ class ipc_rules_t : public wf::plugin_interface_t, public wf::per_output_tracker
7576

7677
wf::ipc::method_callback get_focused_view = [=] (nlohmann::json data)
7778
{
78-
if (auto view = wf::get_core().get_active_output()->get_active_view())
79+
if (auto view = wf::get_core().seat->get_active_view())
7980
{
8081
auto response = wf::ipc::json_ok();
8182
response["info"] = view_to_json(view);

plugins/single_plugins/move.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ class wayfire_move : public wf::per_output_plugin_instance_t,
331331
if (join_views)
332332
{
333333
// ensure that the originally grabbed view will be focused
334-
output->focus_view(grabbed_view);
334+
wf::get_core().seat->focus_view(grabbed_view);
335335
}
336336

337337
drag_helper->start_drag(view, grab_position, opts);

plugins/single_plugins/oswitch.cpp

+7-5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <wayfire/view.hpp>
66
#include <wayfire/output-layout.hpp>
77
#include <wayfire/bindings-repository.hpp>
8+
#include <wayfire/seat.hpp>
89

910
class wayfire_oswitch : public wf::plugin_interface_t
1011
{
@@ -15,21 +16,22 @@ class wayfire_oswitch : public wf::plugin_interface_t
1516
/* when we switch the output, the oswitch keybinding
1617
* may be activated for the next output, which we don't want,
1718
* so we postpone the switch */
18-
auto current_output = wf::get_core().get_active_output();
19+
auto current_output = wf::get_core().seat->get_active_output();
1920
auto next = wf::get_core().output_layout->get_next_output(current_output);
2021
idle_next_output.run_once([=] ()
2122
{
22-
wf::get_core().focus_output(next);
23+
wf::get_core().seat->focus_output(next);
2324
});
2425

2526
return true;
2627
};
2728

2829
wf::activator_callback switch_output_with_window = [=] (auto)
2930
{
30-
auto current_output = wf::get_core().get_active_output();
31+
auto current_output = wf::get_core().seat->get_active_output();
3132
auto next = wf::get_core().output_layout->get_next_output(current_output);
32-
auto view = wf::toplevel_cast(current_output->get_active_view());
33+
auto view = wf::toplevel_cast(wf::get_active_view_for_output(current_output));
34+
LOGI("Found view ", view);
3335
if (!view)
3436
{
3537
switch_output(wf::activator_data_t{});
@@ -40,7 +42,7 @@ class wayfire_oswitch : public wf::plugin_interface_t
4042
move_view_to_output(view, next, true);
4143
idle_next_output.run_once([=] ()
4244
{
43-
wf::get_core().focus_output(next);
45+
wf::get_core().seat->focus_output(next);
4446
});
4547

4648
return true;

plugins/single_plugins/preserve-output.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <wayfire/workspace-set.hpp>
44
#include <wayfire/signal-definitions.hpp>
55
#include <wayfire/output.hpp>
6+
#include <wayfire/seat.hpp>
67
#include <wayfire/output-layout.hpp>
78
#include <wayfire/nonstd/wlroots-full.hpp>
89
#include <chrono>
@@ -47,7 +48,7 @@ class preserve_output_t : public wf::plugin_interface_t
4748
auto ident = make_output_identifier(output);
4849
auto& data = saved_outputs[ident];
4950

50-
data.was_focused = (output == wf::get_core().get_active_output());
51+
data.was_focused = (output == wf::get_core().seat->get_active_output());
5152
data.destroy_timestamp = std::chrono::steady_clock::now();
5253
data.workspace_set = output->wset();
5354

@@ -84,7 +85,7 @@ class preserve_output_t : public wf::plugin_interface_t
8485
output->set_workspace_set(data.workspace_set);
8586
if (data.was_focused && !focused_output_expired(data))
8687
{
87-
wf::get_core().focus_output(output);
88+
wf::get_core().seat->focus_output(output);
8889
}
8990

9091
saved_outputs.erase(ident);

0 commit comments

Comments
 (0)