This commit is contained in:
Michael Weiser 2024-03-22 15:39:35 +00:00 committed by GitHub
commit 180500867c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 178 additions and 2 deletions

View file

@ -36,6 +36,8 @@ enum ipc_command_type {
// sway-specific event types
IPC_EVENT_BAR_STATE_UPDATE = ((1<<31) | 20),
IPC_EVENT_INPUT = ((1<<31) | 21),
IPC_EVENT_IDLE_INHIBITOR = ((1<<31) | 22),
IPC_EVENT_KEYBOARD_SHORTCUTS_INHIBITOR = ((1<<31) | 23),
};
#endif

View file

@ -39,6 +39,10 @@ struct sway_idle_inhibitor_v1 *sway_idle_inhibit_v1_user_inhibitor_for_view(
struct sway_idle_inhibitor_v1 *sway_idle_inhibit_v1_application_inhibitor_for_view(
struct sway_view *view);
void sway_idle_inhibit_v1_user_inhibitor_update_mode(
struct sway_idle_inhibitor_v1 *inhibitor,
enum sway_idle_inhibit_mode mode);
void sway_idle_inhibit_v1_user_inhibitor_destroy(
struct sway_idle_inhibitor_v1 *inhibitor);

View file

@ -369,4 +369,12 @@ keyboard_shortcuts_inhibitor_get_for_surface(const struct sway_seat *seat,
struct sway_keyboard_shortcuts_inhibitor *
keyboard_shortcuts_inhibitor_get_for_focused_surface(const struct sway_seat *seat);
/**
* Returns the keyboard shortcuts inhibitor that applies to the given surface
* or NULL if none exists. It looks at inhibitors attached to all seats.
*/
struct sway_keyboard_shortcuts_inhibitor *
keyboard_shortcuts_inhibitor_get_for_surface_on_any_seat(
const struct wlr_surface *surface);
#endif

View file

@ -3,7 +3,10 @@
#include <json.h>
#include "sway/output.h"
#include "sway/tree/container.h"
#include "sway/desktop/idle_inhibit_v1.h"
#include "sway/input/input-manager.h"
#include "sway/input/seat.h"
#include "sway/tree/container.h"
json_object *ipc_json_get_version(void);
@ -16,5 +19,9 @@ json_object *ipc_json_describe_node_recursive(struct sway_node *node);
json_object *ipc_json_describe_input(struct sway_input_device *device);
json_object *ipc_json_describe_seat(struct sway_seat *seat);
json_object *ipc_json_describe_bar_config(struct bar_config *bar);
json_object *ipc_json_describe_idle_inhibitor(
struct sway_idle_inhibitor_v1 *sway_inhibitor);
json_object *ipc_json_describe_keyboard_shortcuts_inhibitor(
struct sway_keyboard_shortcuts_inhibitor *sway_inhibitor);
#endif

View file

@ -2,7 +2,9 @@
#define _SWAY_IPC_SERVER_H
#include <sys/socket.h>
#include "sway/config.h"
#include "sway/desktop/idle_inhibit_v1.h"
#include "sway/input/input-manager.h"
#include "sway/input/seat.h"
#include "sway/tree/container.h"
#include "ipc.h"
@ -22,5 +24,9 @@ void ipc_event_shutdown(const char *reason);
void ipc_event_binding(struct sway_binding *binding);
void ipc_event_input(const char *change, struct sway_input_device *device);
void ipc_event_output(void);
void ipc_event_idle_inhibitor(struct sway_idle_inhibitor_v1 *inhibitor, const char *change);
void ipc_event_keyboard_shortcuts_inhibitor(
struct sway_keyboard_shortcuts_inhibitor *inhibitor,
const char *change);
#endif

View file

@ -40,7 +40,7 @@ struct cmd_results *cmd_inhibit_idle(int argc, char **argv) {
if (clear) {
sway_idle_inhibit_v1_user_inhibitor_destroy(inhibitor);
} else {
inhibitor->mode = mode;
sway_idle_inhibit_v1_user_inhibitor_update_mode(inhibitor, mode);
sway_idle_inhibit_v1_check_active();
}
} else if (!clear) {

View file

@ -2,6 +2,7 @@
#include "sway/commands.h"
#include "sway/input/seat.h"
#include "sway/input/input-manager.h"
#include "sway/ipc-server.h"
#include "util.h"
static struct cmd_results *handle_action(struct seat_config *sc,
@ -12,6 +13,8 @@ static struct cmd_results *handle_action(struct seat_config *sc,
wl_list_for_each(sway_inhibitor,
&seat->keyboard_shortcuts_inhibitors, link) {
ipc_event_keyboard_shortcuts_inhibitor(
sway_inhibitor, "deactivate");
wlr_keyboard_shortcuts_inhibitor_v1_deactivate(
sway_inhibitor->inhibitor);
}
@ -39,8 +42,12 @@ static struct cmd_results *handle_action(struct seat_config *sc,
}
if (inhibit) {
ipc_event_keyboard_shortcuts_inhibitor(
sway_inhibitor, "activate");
wlr_keyboard_shortcuts_inhibitor_v1_activate(inhibitor);
} else {
ipc_event_keyboard_shortcuts_inhibitor(
sway_inhibitor, "deactivate");
wlr_keyboard_shortcuts_inhibitor_v1_deactivate(inhibitor);
}

View file

@ -3,6 +3,7 @@
#include "sway/commands.h"
#include "sway/config.h"
#include "sway/input/seat.h"
#include "sway/ipc-server.h"
#include "sway/tree/container.h"
#include "sway/tree/view.h"
@ -33,12 +34,13 @@ struct cmd_results *cmd_shortcuts_inhibitor(int argc, char **argv) {
continue;
}
ipc_event_keyboard_shortcuts_inhibitor(
sway_inhibitor, "deactivate");
wlr_keyboard_shortcuts_inhibitor_v1_deactivate(
sway_inhibitor->inhibitor);
sway_log(SWAY_DEBUG, "Deactivated keyboard shortcuts "
"inhibitor for seat %s on view",
seat->wlr_seat->name);
}
} else {
return cmd_results_new(CMD_INVALID,

View file

@ -3,12 +3,14 @@
#include "log.h"
#include "sway/desktop/idle_inhibit_v1.h"
#include "sway/input/seat.h"
#include "sway/ipc-server.h"
#include "sway/tree/container.h"
#include "sway/tree/view.h"
#include "sway/server.h"
static void destroy_inhibitor(struct sway_idle_inhibitor_v1 *inhibitor) {
ipc_event_idle_inhibitor(inhibitor, "destroy");
wl_list_remove(&inhibitor->link);
wl_list_remove(&inhibitor->destroy.link);
sway_idle_inhibit_v1_check_active();
@ -36,6 +38,9 @@ void handle_idle_inhibitor_v1(struct wl_listener *listener, void *data) {
inhibitor->mode = INHIBIT_IDLE_APPLICATION;
inhibitor->wlr_inhibitor = wlr_inhibitor;
ipc_event_idle_inhibitor(inhibitor, "create");
wl_list_insert(&manager->inhibitors, &inhibitor->link);
inhibitor->destroy.notify = handle_destroy;
@ -56,6 +61,9 @@ void sway_idle_inhibit_v1_user_inhibitor_register(struct sway_view *view,
inhibitor->mode = mode;
inhibitor->view = view;
ipc_event_idle_inhibitor(inhibitor, "create");
wl_list_insert(&manager->inhibitors, &inhibitor->link);
inhibitor->destroy.notify = handle_destroy;
@ -90,6 +98,13 @@ struct sway_idle_inhibitor_v1 *sway_idle_inhibit_v1_application_inhibitor_for_vi
return NULL;
}
void sway_idle_inhibit_v1_user_inhibitor_update_mode(
struct sway_idle_inhibitor_v1 *inhibitor,
enum sway_idle_inhibit_mode mode) {
inhibitor->mode = mode;
ipc_event_idle_inhibitor(inhibitor, "mode");
}
void sway_idle_inhibit_v1_user_inhibitor_destroy(
struct sway_idle_inhibitor_v1 *inhibitor) {
if (!inhibitor) {

View file

@ -298,6 +298,8 @@ static void handle_keyboard_shortcuts_inhibitor_destroy(
sway_log(SWAY_DEBUG, "Removing keyboard shortcuts inhibitor");
ipc_event_keyboard_shortcuts_inhibitor(sway_inhibitor, "destroy");
// sway_seat::keyboard_shortcuts_inhibitors
wl_list_remove(&sway_inhibitor->link);
wl_list_remove(&sway_inhibitor->destroy.link);
@ -321,6 +323,8 @@ static void handle_keyboard_shortcuts_inhibit_new_inhibitor(
}
sway_inhibitor->inhibitor = inhibitor;
ipc_event_keyboard_shortcuts_inhibitor(sway_inhibitor, "create");
sway_inhibitor->destroy.notify = handle_keyboard_shortcuts_inhibitor_destroy;
wl_signal_add(&inhibitor->events.destroy, &sway_inhibitor->destroy);
@ -361,6 +365,7 @@ static void handle_keyboard_shortcuts_inhibit_new_inhibitor(
return;
}
ipc_event_keyboard_shortcuts_inhibitor(sway_inhibitor, "activate");
wlr_keyboard_shortcuts_inhibitor_v1_activate(inhibitor);
}

View file

@ -1723,3 +1723,18 @@ keyboard_shortcuts_inhibitor_get_for_focused_surface(
return keyboard_shortcuts_inhibitor_get_for_surface(seat,
seat->wlr_seat->keyboard_state.focused_surface);
}
struct sway_keyboard_shortcuts_inhibitor *
keyboard_shortcuts_inhibitor_get_for_surface_on_any_seat(
const struct wlr_surface *surface) {
struct sway_seat *seat = NULL;
wl_list_for_each(seat, &server.input->seats, link) {
struct sway_keyboard_shortcuts_inhibitor *sway_inhibitor =
keyboard_shortcuts_inhibitor_get_for_surface(seat, surface);
if (sway_inhibitor) {
return sway_inhibitor;
}
}
return NULL;
}

View file

@ -220,6 +220,19 @@ static const char *ipc_json_content_type_description(enum wp_content_type_v1_typ
return NULL;
}
static const char *ipc_json_keyboard_shortcuts_inhibitor_description(
struct sway_keyboard_shortcuts_inhibitor *sway_inhibitor) {
if (!sway_inhibitor) {
return "none";
}
if (!sway_inhibitor->inhibitor->active) {
return "inactive";
}
return "active";
}
json_object *ipc_json_get_version(void) {
int major = 0, minor = 0, patch = 0;
json_object *version = json_object_new_object();
@ -633,6 +646,12 @@ static void ipc_json_describe_view(struct sway_container *c, json_object *object
json_object_new_string(ipc_json_content_type_description(content_type)));
}
json_object_object_add(object, "keyboard_shortcuts_inhibitor",
json_object_new_string(
ipc_json_keyboard_shortcuts_inhibitor_description(
keyboard_shortcuts_inhibitor_get_for_surface_on_any_seat(
c->view->surface))));
#if HAVE_XWAYLAND
if (c->view->type == SWAY_VIEW_XWAYLAND) {
json_object_object_add(object, "window",
@ -1426,3 +1445,51 @@ json_object *ipc_json_get_binding_mode(void) {
json_object_new_string(config->current_mode->name));
return current_mode;
}
json_object *ipc_json_describe_idle_inhibitor(
struct sway_idle_inhibitor_v1 *sway_inhibitor) {
json_object *object = json_object_new_object();
json_object_object_add(object, "active",
json_object_new_boolean(
sway_idle_inhibit_v1_is_active(sway_inhibitor)));
const char *type = NULL;
struct sway_view *view = NULL;
if (sway_inhibitor->mode == INHIBIT_IDLE_APPLICATION) {
type = "application";
view = view_from_wlr_surface(sway_inhibitor->wlr_inhibitor->surface);
} else {
type = "user";
view = sway_inhibitor->view;
json_object_object_add(object, "mode",
json_object_new_string(
ipc_json_user_idle_inhibitor_description(
sway_inhibitor->mode)));
}
if (type) {
json_object_object_add(object, "type", json_object_new_string(type));
}
if (view && view->container) {
json_object_object_add(object, "container",
ipc_json_describe_node(&view->container->node));
}
return object;
}
json_object *ipc_json_describe_keyboard_shortcuts_inhibitor(
struct sway_keyboard_shortcuts_inhibitor *sway_inhibitor) {
json_object *object = json_object_new_object();
struct sway_view *view = view_from_wlr_surface(
sway_inhibitor->inhibitor->surface);
if (view && view->container) {
json_object_object_add(object, "container",
ipc_json_describe_node(&view->container->node));
}
return object;
}

View file

@ -521,6 +521,39 @@ void ipc_event_output(void) {
json_object_put(json);
}
void ipc_event_idle_inhibitor(struct sway_idle_inhibitor_v1 *inhibitor, const char *change) {
if (!ipc_has_event_listeners(IPC_EVENT_IDLE_INHIBITOR)) {
return;
}
sway_log(SWAY_DEBUG, "Sending idle inhibitor::%s event", change);
json_object *obj = json_object_new_object();
json_object_object_add(obj, "change", json_object_new_string(change));
json_object_object_add(obj, "idle_inhibitor",
ipc_json_describe_idle_inhibitor(inhibitor));
const char *json_string = json_object_to_json_string(obj);
ipc_send_event(json_string, IPC_EVENT_IDLE_INHIBITOR);
json_object_put(obj);
}
void ipc_event_keyboard_shortcuts_inhibitor(
struct sway_keyboard_shortcuts_inhibitor *inhibitor,
const char *change) {
if (!ipc_has_event_listeners(IPC_EVENT_KEYBOARD_SHORTCUTS_INHIBITOR)) {
return;
}
sway_log(SWAY_DEBUG, "Sending keyboard shortcuts "
"inhibitor::%s event", change);
json_object *obj = json_object_new_object();
json_object_object_add(obj, "change", json_object_new_string(change));
json_object_object_add(obj, "keyboard_shortcuts_inhibitor",
ipc_json_describe_keyboard_shortcuts_inhibitor(inhibitor));
const char *json_string = json_object_to_json_string(obj);
ipc_send_event(json_string, IPC_EVENT_KEYBOARD_SHORTCUTS_INHIBITOR);
json_object_put(obj);
}
int ipc_client_handle_writable(int client_fd, uint32_t mask, void *data) {
struct ipc_client *client = data;
@ -757,6 +790,11 @@ void ipc_client_handle_command(struct ipc_client *client, uint32_t payload_lengt
is_tick = true;
} else if (strcmp(event_type, "input") == 0) {
client->subscribed_events |= event_mask(IPC_EVENT_INPUT);
} else if (strcmp(event_type, "idle_inhibitor") == 0) {
client->subscribed_events |= event_mask(IPC_EVENT_IDLE_INHIBITOR);
} else if (strcmp(event_type, "keyboard_shortcuts_inhibitor") == 0) {
client->subscribed_events |= event_mask(
IPC_EVENT_KEYBOARD_SHORTCUTS_INHIBITOR);
} else {
const char msg[] = "{\"success\": false}";
ipc_send_reply(client, payload_type, msg, strlen(msg));