mirror of
https://github.com/swaywm/sway.git
synced 2024-11-14 06:24:20 +01:00
Merge 1a1bc78ce5
into d417a8fcd0
This commit is contained in:
commit
6a447fb02e
@ -1,5 +1,6 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <wlr/types/wlr_idle_notify_v1.h>
|
#include <wlr/types/wlr_idle_notify_v1.h>
|
||||||
|
#include <wlr/types/wlr_session_lock_v1.h>
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "sway/desktop/idle_inhibit_v1.h"
|
#include "sway/desktop/idle_inhibit_v1.h"
|
||||||
#include "sway/input/seat.h"
|
#include "sway/input/seat.h"
|
||||||
@ -103,11 +104,34 @@ void sway_idle_inhibit_v1_user_inhibitor_destroy(
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool sway_idle_inhibit_v1_is_active(struct sway_idle_inhibitor_v1 *inhibitor) {
|
bool sway_idle_inhibit_v1_is_active(struct sway_idle_inhibitor_v1 *inhibitor) {
|
||||||
|
if (server.session_lock.lock) {
|
||||||
|
// A session lock is active. In this case, only application inhibitors
|
||||||
|
// on the session lock surface can have any effect.
|
||||||
|
if (inhibitor->mode != INHIBIT_IDLE_APPLICATION) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
struct wlr_surface *wlr_surface = inhibitor->wlr_inhibitor->surface;
|
||||||
|
if (!wlr_session_lock_surface_v1_try_from_wlr_surface(wlr_surface)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return wlr_surface->mapped;
|
||||||
|
}
|
||||||
|
|
||||||
switch (inhibitor->mode) {
|
switch (inhibitor->mode) {
|
||||||
case INHIBIT_IDLE_APPLICATION:;
|
case INHIBIT_IDLE_APPLICATION:;
|
||||||
// If there is no view associated with the inhibitor, assume visible
|
struct wlr_surface *wlr_surface = inhibitor->wlr_inhibitor->surface;
|
||||||
struct sway_view *view = view_from_wlr_surface(inhibitor->wlr_inhibitor->surface);
|
struct wlr_layer_surface_v1 *layer_surface =
|
||||||
return !view || !view->container || view_is_visible(view);
|
wlr_layer_surface_v1_try_from_wlr_surface(wlr_surface);
|
||||||
|
if (layer_surface) {
|
||||||
|
// Layer surfaces can be occluded but are always on screen after
|
||||||
|
// they have been mapped.
|
||||||
|
return layer_surface->output && layer_surface->output->enabled &&
|
||||||
|
wlr_surface->mapped;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If there is no view associated with the inhibitor, assume invisible
|
||||||
|
struct sway_view *view = view_from_wlr_surface(wlr_surface);
|
||||||
|
return view && view->container && view_is_visible(view);
|
||||||
case INHIBIT_IDLE_FOCUS:;
|
case INHIBIT_IDLE_FOCUS:;
|
||||||
struct sway_seat *seat = NULL;
|
struct sway_seat *seat = NULL;
|
||||||
wl_list_for_each(seat, &server.input->seats, link) {
|
wl_list_for_each(seat, &server.input->seats, link) {
|
||||||
|
@ -234,6 +234,9 @@ static void handle_unlock(struct wl_listener *listener, void *data) {
|
|||||||
struct sway_output *output = root->outputs->items[i];
|
struct sway_output *output = root->outputs->items[i];
|
||||||
arrange_layers(output);
|
arrange_layers(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Views are now visible, so check if we need to activate inhibition again.
|
||||||
|
sway_idle_inhibit_v1_check_active();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_abandon(struct wl_listener *listener, void *data) {
|
static void handle_abandon(struct wl_listener *listener, void *data) {
|
||||||
@ -297,6 +300,10 @@ static void handle_session_lock(struct wl_listener *listener, void *data) {
|
|||||||
|
|
||||||
wlr_session_lock_v1_send_locked(lock);
|
wlr_session_lock_v1_send_locked(lock);
|
||||||
server.session_lock.lock = sway_lock;
|
server.session_lock.lock = sway_lock;
|
||||||
|
|
||||||
|
// The lock screen covers everything, so check if any active inhibition got
|
||||||
|
// deactivated due to lost visibility.
|
||||||
|
sway_idle_inhibit_v1_check_active();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_session_lock_destroy(struct wl_listener *listener, void *data) {
|
static void handle_session_lock_destroy(struct wl_listener *listener, void *data) {
|
||||||
|
@ -188,6 +188,10 @@ uint32_t view_configure(struct sway_view *view, double lx, double ly, int width,
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool view_inhibit_idle(struct sway_view *view) {
|
bool view_inhibit_idle(struct sway_view *view) {
|
||||||
|
if (server.session_lock.lock) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
struct sway_idle_inhibitor_v1 *user_inhibitor =
|
struct sway_idle_inhibitor_v1 *user_inhibitor =
|
||||||
sway_idle_inhibit_v1_user_inhibitor_for_view(view);
|
sway_idle_inhibit_v1_user_inhibitor_for_view(view);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user