/* Used to prevent region snapping when starting a move with A-Left */
bool region_prevent_snap;
- struct wl_client *active_client_while_inhibited;
struct wl_list inputs;
struct wl_listener new_input;
struct wl_listener focus_change;
struct wl_listener xwayland_new_surface;
#endif
- struct wlr_input_inhibit_manager *input_inhibit;
- struct wl_listener input_inhibit_activate;
- struct wl_listener input_inhibit_deactivate;
-
struct wlr_xdg_activation_v1 *xdg_activation;
struct wl_listener xdg_activation_request;
struct wl_listener xdg_activation_new_token;
* - optionally raise above other views
*
* It's okay to call this function even if the view isn't mapped or the
- * session is locked/input is inhibited; it will simply do nothing.
+ * session is locked; it will simply do nothing.
*/
void desktop_focus_view(struct view *view, bool raise);
void server_start(struct server *server);
void server_finish(struct server *server);
-/*
- * wlroots "input inhibitor" extension (required for swaylock) blocks
- * any client other than the requesting client from receiving events
- */
-bool input_inhibit_blocks_surface(struct seat *seat,
- struct wl_resource *resource);
-
void create_constraint(struct wl_listener *listener, void *data);
void constrain_cursor(struct server *server, struct wlr_pointer_constraint_v1
*constraint);
cursor_names[cursor]);
}
-bool
-input_inhibit_blocks_surface(struct seat *seat, struct wl_resource *resource)
-{
- struct wl_client *inhibiting_client =
- seat->active_client_while_inhibited;
- return inhibiting_client
- && inhibiting_client != wl_resource_get_client(resource);
-}
-
static bool
update_pressed_surface(struct seat *seat, struct cursor_context *ctx)
{
return false;
}
- if (ctx->surface && !input_inhibit_blocks_surface(seat,
- ctx->surface->resource)) {
+ if (ctx->surface) {
/*
* Cursor is over an input-enabled client surface. The
* cursor image will be set by request_cursor_notify()
if (event->state == WL_KEYBOARD_KEY_STATE_RELEASED) {
if (cur_keybind && cur_keybind->on_release) {
key_state_bound_key_remove(event->keycode);
- if (seat->server->session_lock_manager->locked
- || seat->active_client_while_inhibited) {
+ if (seat->server->session_lock_manager->locked) {
cur_keybind = NULL;
return true;
}
}
/*
- * Ignore labwc keybindings if input is inhibited
+ * Ignore labwc keybindings if the session is locked.
* It's important to do this after key_state_set_pressed() to ensure
* _all_ key press/releases are registered
*/
- if (seat->active_client_while_inhibited) {
- return false;
- }
if (seat->server->session_lock_manager->locked) {
return false;
}
#include <wlr/types/wlr_export_dmabuf_v1.h>
#include <wlr/types/wlr_fractional_scale_v1.h>
#include <wlr/types/wlr_gamma_control_v1.h>
-#include <wlr/types/wlr_input_inhibitor.h>
#include <wlr/types/wlr_presentation_time.h>
#include <wlr/types/wlr_primary_selection_v1.h>
#include <wlr/types/wlr_screencopy_v1.h>
return 0;
}
-static void
-seat_inhibit_input(struct seat *seat, struct wl_client *active_client)
-{
- seat->active_client_while_inhibited = active_client;
-
- if (seat->focused_layer && active_client !=
- wl_resource_get_client(seat->focused_layer->resource)) {
- seat_set_focus_layer(seat, NULL);
- }
- struct wlr_surface *previous_kb_surface =
- seat->seat->keyboard_state.focused_surface;
- if (previous_kb_surface && active_client !=
- wl_resource_get_client(previous_kb_surface->resource)) {
- seat_focus_surface(seat, NULL); /* keyboard focus */
- }
-
- struct wlr_seat_client *previous_ptr_client =
- seat->seat->pointer_state.focused_client;
- if (previous_ptr_client && previous_ptr_client->client != active_client) {
- wlr_seat_pointer_clear_focus(seat->seat);
- }
-}
-
-static void
-seat_disinhibit_input(struct seat *seat)
-{
- seat->active_client_while_inhibited = NULL;
-
- /*
- * Triggers a refocus of the topmost surface layer if necessary
- * TODO: Make layer surface focus per-output based on cursor position
- */
- output_update_all_usable_areas(seat->server, /*layout_changed*/ false);
-}
-
-static void
-handle_input_inhibit(struct wl_listener *listener, void *data)
-{
- wlr_log(WLR_INFO, "activate input inhibit");
-
- struct server *server =
- wl_container_of(listener, server, input_inhibit_activate);
- seat_inhibit_input(&server->seat, server->input_inhibit->active_client);
-}
-
-static void
-handle_input_disinhibit(struct wl_listener *listener, void *data)
-{
- wlr_log(WLR_INFO, "deactivate input inhibit");
-
- struct server *server =
- wl_container_of(listener, server, input_inhibit_deactivate);
- seat_disinhibit_input(&server->seat);
-}
-
static void
handle_drm_lease_request(struct wl_listener *listener, void *data)
{
wl_signal_add(&server->constraints->events.new_constraint,
&server->new_constraint);
- server->input_inhibit =
- wlr_input_inhibit_manager_create(server->wl_display);
- if (!server->input_inhibit) {
- wlr_log(WLR_ERROR, "unable to create input inhibit manager");
- exit(EXIT_FAILURE);
- }
-
- wl_signal_add(&server->input_inhibit->events.activate,
- &server->input_inhibit_activate);
- server->input_inhibit_activate.notify = handle_input_inhibit;
-
- wl_signal_add(&server->input_inhibit->events.deactivate,
- &server->input_inhibit_deactivate);
- server->input_inhibit_deactivate.notify = handle_input_disinhibit;
-
server->foreign_toplevel_manager =
wlr_foreign_toplevel_manager_v1_create(server->wl_display);