Merge branch 'master' into feature/swap-workspace

This commit is contained in:
Fabian Specht 2024-03-12 13:47:22 +01:00 committed by GitHub
commit d56dc242a4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
23 changed files with 131 additions and 88 deletions

View file

@ -114,7 +114,7 @@ void pointer_motion(struct sway_cursor *cursor, uint32_t time_msec,
void dispatch_cursor_button(struct sway_cursor *cursor, void dispatch_cursor_button(struct sway_cursor *cursor,
struct wlr_input_device *device, uint32_t time_msec, uint32_t button, struct wlr_input_device *device, uint32_t time_msec, uint32_t button,
enum wlr_button_state state); enum wl_pointer_button_state state);
void dispatch_cursor_axis(struct sway_cursor *cursor, void dispatch_cursor_axis(struct sway_cursor *cursor,
struct wlr_pointer_axis_event *event); struct wlr_pointer_axis_event *event);

View file

@ -17,7 +17,7 @@ struct sway_seat;
struct sway_seatop_impl { struct sway_seatop_impl {
void (*button)(struct sway_seat *seat, uint32_t time_msec, void (*button)(struct sway_seat *seat, uint32_t time_msec,
struct wlr_input_device *device, uint32_t button, struct wlr_input_device *device, uint32_t button,
enum wlr_button_state state); enum wl_pointer_button_state state);
void (*pointer_motion)(struct sway_seat *seat, uint32_t time_msec); void (*pointer_motion)(struct sway_seat *seat, uint32_t time_msec);
void (*pointer_axis)(struct sway_seat *seat, void (*pointer_axis)(struct sway_seat *seat,
struct wlr_pointer_axis_event *event); struct wlr_pointer_axis_event *event);
@ -286,13 +286,13 @@ struct sway_container *seat_get_focus_inactive_floating(struct sway_seat *seat,
struct sway_workspace *workspace); struct sway_workspace *workspace);
void seat_pointer_notify_button(struct sway_seat *seat, uint32_t time_msec, void seat_pointer_notify_button(struct sway_seat *seat, uint32_t time_msec,
uint32_t button, enum wlr_button_state state); uint32_t button, enum wl_pointer_button_state state);
void seat_consider_warp_to_focus(struct sway_seat *seat); void seat_consider_warp_to_focus(struct sway_seat *seat);
void seatop_button(struct sway_seat *seat, uint32_t time_msec, void seatop_button(struct sway_seat *seat, uint32_t time_msec,
struct wlr_input_device *device, uint32_t button, struct wlr_input_device *device, uint32_t button,
enum wlr_button_state state); enum wl_pointer_button_state state);
void seatop_pointer_motion(struct sway_seat *seat, uint32_t time_msec); void seatop_pointer_motion(struct sway_seat *seat, uint32_t time_msec);

View file

@ -50,7 +50,7 @@ struct sway_output {
enum wl_output_subpixel detected_subpixel; enum wl_output_subpixel detected_subpixel;
enum scale_filter_mode scale_filter; enum scale_filter_mode scale_filter;
bool enabling, enabled; bool enabled;
list_t *workspaces; list_t *workspaces;
struct sway_output_state current; struct sway_output_state current;

View file

@ -192,6 +192,7 @@ struct sway_xdg_popup {
struct wl_listener surface_commit; struct wl_listener surface_commit;
struct wl_listener new_popup; struct wl_listener new_popup;
struct wl_listener reposition;
struct wl_listener destroy; struct wl_listener destroy;
}; };

View file

@ -769,15 +769,6 @@ static struct cmd_results *cmd_move_in_direction(
ipc_event_window(container, "move"); ipc_event_window(container, "move");
} }
// Hack to re-focus container
seat_set_raw_focus(config->handler_context.seat, &new_ws->node);
seat_set_focus_container(config->handler_context.seat, container);
if (old_ws != new_ws) {
ipc_event_workspace(old_ws, new_ws, "focus");
workspace_detect_urgent(old_ws);
workspace_detect_urgent(new_ws);
}
container_end_mouse_operation(container); container_end_mouse_operation(container);
return cmd_results_new(CMD_SUCCESS, NULL); return cmd_results_new(CMD_SUCCESS, NULL);

View file

@ -84,12 +84,12 @@ struct cmd_results *seat_cmd_cursor(int argc, char **argv) {
static struct cmd_results *press_or_release(struct sway_cursor *cursor, static struct cmd_results *press_or_release(struct sway_cursor *cursor,
char *action, char *button_str) { char *action, char *button_str) {
enum wlr_button_state state; enum wl_pointer_button_state state;
uint32_t button; uint32_t button;
if (strcasecmp(action, "press") == 0) { if (strcasecmp(action, "press") == 0) {
state = WLR_BUTTON_PRESSED; state = WL_POINTER_BUTTON_STATE_PRESSED;
} else if (strcasecmp(action, "release") == 0) { } else if (strcasecmp(action, "release") == 0) {
state = WLR_BUTTON_RELEASED; state = WL_POINTER_BUTTON_STATE_RELEASED;
} else { } else {
return cmd_results_new(CMD_INVALID, "%s", expected_syntax); return cmd_results_new(CMD_INVALID, "%s", expected_syntax);
} }
@ -104,16 +104,16 @@ static struct cmd_results *press_or_release(struct sway_cursor *cursor,
} else if (button == SWAY_SCROLL_UP || button == SWAY_SCROLL_DOWN } else if (button == SWAY_SCROLL_UP || button == SWAY_SCROLL_DOWN
|| button == SWAY_SCROLL_LEFT || button == SWAY_SCROLL_RIGHT) { || button == SWAY_SCROLL_LEFT || button == SWAY_SCROLL_RIGHT) {
// Dispatch axis event // Dispatch axis event
enum wlr_axis_orientation orientation = enum wl_pointer_axis orientation =
(button == SWAY_SCROLL_UP || button == SWAY_SCROLL_DOWN) (button == SWAY_SCROLL_UP || button == SWAY_SCROLL_DOWN)
? WLR_AXIS_ORIENTATION_VERTICAL ? WL_POINTER_AXIS_VERTICAL_SCROLL
: WLR_AXIS_ORIENTATION_HORIZONTAL; : WL_POINTER_AXIS_HORIZONTAL_SCROLL;
double delta = (button == SWAY_SCROLL_UP || button == SWAY_SCROLL_LEFT) double delta = (button == SWAY_SCROLL_UP || button == SWAY_SCROLL_LEFT)
? -1 : 1; ? -1 : 1;
struct wlr_pointer_axis_event event = { struct wlr_pointer_axis_event event = {
.pointer = NULL, .pointer = NULL,
.time_msec = 0, .time_msec = 0,
.source = WLR_AXIS_SOURCE_WHEEL, .source = WL_POINTER_AXIS_SOURCE_WHEEL,
.orientation = orientation, .orientation = orientation,
.delta = delta * 15, .delta = delta * 15,
.delta_discrete = delta .delta_discrete = delta

View file

@ -37,19 +37,26 @@
struct sway_config *config = NULL; struct sway_config *config = NULL;
static struct xkb_state *keysym_translation_state_create( static struct xkb_state *keysym_translation_state_create(
struct xkb_rule_names rules) { struct xkb_rule_names rules, uint32_t context_flags) {
struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_SECURE_GETENV); struct xkb_context *context = xkb_context_new(context_flags | XKB_CONTEXT_NO_SECURE_GETENV);
struct xkb_keymap *xkb_keymap = xkb_keymap_new_from_names( struct xkb_keymap *xkb_keymap = xkb_keymap_new_from_names(
context, context,
&rules, &rules,
XKB_KEYMAP_COMPILE_NO_FLAGS); XKB_KEYMAP_COMPILE_NO_FLAGS);
xkb_context_unref(context); xkb_context_unref(context);
if (xkb_keymap == NULL) {
sway_log(SWAY_ERROR, "Failed to compile keysym translation XKB keymap");
return NULL;
}
return xkb_state_new(xkb_keymap); return xkb_state_new(xkb_keymap);
} }
static void keysym_translation_state_destroy( static void keysym_translation_state_destroy(
struct xkb_state *state) { struct xkb_state *state) {
if (state == NULL) {
return;
}
xkb_keymap_unref(xkb_state_get_keymap(state)); xkb_keymap_unref(xkb_state_get_keymap(state));
xkb_state_unref(state); xkb_state_unref(state);
} }
@ -337,8 +344,14 @@ static void config_defaults(struct sway_config *config) {
// The keysym to keycode translation // The keysym to keycode translation
struct xkb_rule_names rules = {0}; struct xkb_rule_names rules = {0};
config->keysym_translation_state = config->keysym_translation_state = keysym_translation_state_create(rules, 0);
keysym_translation_state_create(rules); if (config->keysym_translation_state == NULL) {
config->keysym_translation_state = keysym_translation_state_create(rules,
XKB_CONTEXT_NO_ENVIRONMENT_NAMES);
}
if (config->keysym_translation_state == NULL) {
goto cleanup;
}
return; return;
cleanup: cleanup:
@ -985,8 +998,12 @@ void translate_keysyms(struct input_config *input_config) {
struct xkb_rule_names rules = {0}; struct xkb_rule_names rules = {0};
input_config_fill_rule_names(input_config, &rules); input_config_fill_rule_names(input_config, &rules);
config->keysym_translation_state = config->keysym_translation_state = keysym_translation_state_create(rules, 0);
keysym_translation_state_create(rules); if (config->keysym_translation_state == NULL) {
sway_log(SWAY_ERROR, "Failed to create keysym translation XKB state "
"for device '%s'", input_config->identifier);
return;
}
for (int i = 0; i < config->modes->length; ++i) { for (int i = 0; i < config->modes->length; ++i) {
struct sway_mode *mode = config->modes->items[i]; struct sway_mode *mode = config->modes->items[i];

View file

@ -510,9 +510,6 @@ bool apply_output_config(struct output_config *oc, struct sway_output *output) {
struct wlr_output *wlr_output = output->wlr_output; struct wlr_output *wlr_output = output->wlr_output;
// Flag to prevent the output mode event handler from calling us
output->enabling = (!oc || oc->enabled);
struct wlr_output_state pending = {0}; struct wlr_output_state pending = {0};
queue_output_config(oc, output, &pending); queue_output_config(oc, output, &pending);
@ -522,12 +519,9 @@ bool apply_output_config(struct output_config *oc, struct sway_output *output) {
// Leave the output disabled for now and try again when the output gets // Leave the output disabled for now and try again when the output gets
// the mode we asked for. // the mode we asked for.
sway_log(SWAY_ERROR, "Failed to commit output %s", wlr_output->name); sway_log(SWAY_ERROR, "Failed to commit output %s", wlr_output->name);
output->enabling = false;
return false; return false;
} }
output->enabling = false;
if (oc && !oc->enabled) { if (oc && !oc->enabled) {
sway_log(SWAY_DEBUG, "Disabling output %s", oc->name); sway_log(SWAY_DEBUG, "Disabling output %s", oc->name);
if (output->enabled) { if (output->enabled) {

View file

@ -183,7 +183,15 @@ static void send_frame_done_iterator(struct wlr_scene_buffer *buffer,
} }
} }
static enum wlr_scale_filter_mode get_scale_filter(struct sway_output *output) { static enum wlr_scale_filter_mode get_scale_filter(struct sway_output *output,
struct wlr_scene_buffer *buffer) {
// if we are scaling down, we should always choose linear
if (buffer->dst_width > 0 && buffer->dst_height > 0 && (
buffer->dst_width < buffer->buffer_width ||
buffer->dst_height < buffer->buffer_height)) {
return WLR_SCALE_FILTER_BILINEAR;
}
switch (output->scale_filter) { switch (output->scale_filter) {
case SCALE_FILTER_LINEAR: case SCALE_FILTER_LINEAR:
return WLR_SCALE_FILTER_BILINEAR; return WLR_SCALE_FILTER_BILINEAR;
@ -212,7 +220,7 @@ static void output_configure_scene(struct sway_output *output,
// hack: don't call the scene setter because that will damage all outputs // hack: don't call the scene setter because that will damage all outputs
// We don't want to damage outputs that aren't our current output that // We don't want to damage outputs that aren't our current output that
// we're configuring // we're configuring
buffer->filter_mode = get_scale_filter(output); buffer->filter_mode = get_scale_filter(output, buffer);
wlr_scene_buffer_set_opacity(buffer, opacity); wlr_scene_buffer_set_opacity(buffer, opacity);
} else if (node->type == WLR_SCENE_NODE_TREE) { } else if (node->type == WLR_SCENE_NODE_TREE) {

View file

@ -35,6 +35,7 @@ static void popup_handle_destroy(struct wl_listener *listener, void *data) {
wl_list_remove(&popup->new_popup.link); wl_list_remove(&popup->new_popup.link);
wl_list_remove(&popup->destroy.link); wl_list_remove(&popup->destroy.link);
wl_list_remove(&popup->surface_commit.link); wl_list_remove(&popup->surface_commit.link);
wl_list_remove(&popup->reposition.link);
wlr_scene_node_destroy(&popup->scene_tree->node); wlr_scene_node_destroy(&popup->scene_tree->node);
free(popup); free(popup);
} }
@ -70,6 +71,11 @@ static void popup_handle_surface_commit(struct wl_listener *listener, void *data
} }
} }
static void popup_handle_reposition(struct wl_listener *listener, void *data) {
struct sway_xdg_popup *popup = wl_container_of(listener, popup, reposition);
popup_unconstrain(popup);
}
static struct sway_xdg_popup *popup_create(struct wlr_xdg_popup *wlr_popup, static struct sway_xdg_popup *popup_create(struct wlr_xdg_popup *wlr_popup,
struct sway_view *view, struct wlr_scene_tree *parent) { struct sway_view *view, struct wlr_scene_tree *parent) {
struct wlr_xdg_surface *xdg_surface = wlr_popup->base; struct wlr_xdg_surface *xdg_surface = wlr_popup->base;
@ -116,6 +122,8 @@ static struct sway_xdg_popup *popup_create(struct wlr_xdg_popup *wlr_popup,
popup->surface_commit.notify = popup_handle_surface_commit; popup->surface_commit.notify = popup_handle_surface_commit;
wl_signal_add(&xdg_surface->events.new_popup, &popup->new_popup); wl_signal_add(&xdg_surface->events.new_popup, &popup->new_popup);
popup->new_popup.notify = popup_handle_new_popup; popup->new_popup.notify = popup_handle_new_popup;
wl_signal_add(&wlr_popup->events.reposition, &popup->reposition);
popup->reposition.notify = popup_handle_reposition;
wl_signal_add(&wlr_popup->events.destroy, &popup->destroy); wl_signal_add(&wlr_popup->events.destroy, &popup->destroy);
popup->destroy.notify = popup_handle_destroy; popup->destroy.notify = popup_handle_destroy;
@ -281,6 +289,7 @@ static void handle_commit(struct wl_listener *listener, void *data) {
} }
// XXX: https://github.com/swaywm/sway/issues/2176 // XXX: https://github.com/swaywm/sway/issues/2176
wlr_xdg_surface_schedule_configure(xdg_surface); wlr_xdg_surface_schedule_configure(xdg_surface);
// TODO: wlr_xdg_toplevel_set_bounds()
return; return;
} }
@ -566,4 +575,7 @@ void handle_xdg_shell_toplevel(struct wl_listener *listener, void *data) {
wlr_scene_xdg_surface_create(xdg_shell_view->view.content_tree, xdg_toplevel->base); wlr_scene_xdg_surface_create(xdg_shell_view->view.content_tree, xdg_toplevel->base);
xdg_toplevel->base->data = xdg_shell_view; xdg_toplevel->base->data = xdg_shell_view;
wlr_xdg_toplevel_set_wm_capabilities(xdg_toplevel,
XDG_TOPLEVEL_WM_CAPABILITIES_FULLSCREEN);
} }

View file

@ -243,7 +243,7 @@ static enum sway_input_idle_source idle_source_from_device(
return IDLE_SOURCE_POINTER; return IDLE_SOURCE_POINTER;
case WLR_INPUT_DEVICE_TOUCH: case WLR_INPUT_DEVICE_TOUCH:
return IDLE_SOURCE_TOUCH; return IDLE_SOURCE_TOUCH;
case WLR_INPUT_DEVICE_TABLET_TOOL: case WLR_INPUT_DEVICE_TABLET:
return IDLE_SOURCE_TABLET_TOOL; return IDLE_SOURCE_TABLET_TOOL;
case WLR_INPUT_DEVICE_TABLET_PAD: case WLR_INPUT_DEVICE_TABLET_PAD:
return IDLE_SOURCE_TABLET_PAD; return IDLE_SOURCE_TABLET_PAD;
@ -356,7 +356,7 @@ static void handle_pointer_motion_absolute(
void dispatch_cursor_button(struct sway_cursor *cursor, void dispatch_cursor_button(struct sway_cursor *cursor,
struct wlr_input_device *device, uint32_t time_msec, uint32_t button, struct wlr_input_device *device, uint32_t time_msec, uint32_t button,
enum wlr_button_state state) { enum wl_pointer_button_state state) {
if (time_msec == 0) { if (time_msec == 0) {
time_msec = get_current_time_msec(); time_msec = get_current_time_msec();
} }
@ -368,7 +368,7 @@ static void handle_pointer_button(struct wl_listener *listener, void *data) {
struct sway_cursor *cursor = wl_container_of(listener, cursor, button); struct sway_cursor *cursor = wl_container_of(listener, cursor, button);
struct wlr_pointer_button_event *event = data; struct wlr_pointer_button_event *event = data;
if (event->state == WLR_BUTTON_PRESSED) { if (event->state == WL_POINTER_BUTTON_STATE_PRESSED) {
cursor->pressed_button_count++; cursor->pressed_button_count++;
} else { } else {
if (cursor->pressed_button_count > 0) { if (cursor->pressed_button_count > 0) {
@ -430,7 +430,7 @@ static void handle_touch_up(struct wl_listener *listener, void *data) {
if (cursor->pointer_touch_id == cursor->seat->touch_id) { if (cursor->pointer_touch_id == cursor->seat->touch_id) {
cursor->pointer_touch_up = true; cursor->pointer_touch_up = true;
dispatch_cursor_button(cursor, &event->touch->base, dispatch_cursor_button(cursor, &event->touch->base,
event->time_msec, BTN_LEFT, WLR_BUTTON_RELEASED); event->time_msec, BTN_LEFT, WL_POINTER_BUTTON_STATE_RELEASED);
} }
} else { } else {
seatop_touch_up(seat, event); seatop_touch_up(seat, event);
@ -448,7 +448,7 @@ static void handle_touch_cancel(struct wl_listener *listener, void *data) {
if (cursor->pointer_touch_id == cursor->seat->touch_id) { if (cursor->pointer_touch_id == cursor->seat->touch_id) {
cursor->pointer_touch_up = true; cursor->pointer_touch_up = true;
dispatch_cursor_button(cursor, &event->touch->base, dispatch_cursor_button(cursor, &event->touch->base,
event->time_msec, BTN_LEFT, WLR_BUTTON_RELEASED); event->time_msec, BTN_LEFT, WL_POINTER_BUTTON_STATE_RELEASED);
} }
} else { } else {
seatop_touch_cancel(seat, event); seatop_touch_cancel(seat, event);
@ -518,7 +518,7 @@ static void apply_mapping_from_region(struct wlr_input_device *device,
double x1 = region->x1, x2 = region->x2; double x1 = region->x1, x2 = region->x2;
double y1 = region->y1, y2 = region->y2; double y1 = region->y1, y2 = region->y2;
if (region->mm && device->type == WLR_INPUT_DEVICE_TABLET_TOOL) { if (region->mm && device->type == WLR_INPUT_DEVICE_TABLET) {
struct wlr_tablet *tablet = wlr_tablet_from_input_device(device); struct wlr_tablet *tablet = wlr_tablet_from_input_device(device);
if (tablet->width_mm == 0 || tablet->height_mm == 0) { if (tablet->width_mm == 0 || tablet->height_mm == 0) {
return; return;
@ -661,7 +661,7 @@ static void handle_tool_tip(struct wl_listener *listener, void *data) {
event->state == WLR_TABLET_TOOL_TIP_UP) { event->state == WLR_TABLET_TOOL_TIP_UP) {
cursor->simulating_pointer_from_tool_tip = false; cursor->simulating_pointer_from_tool_tip = false;
dispatch_cursor_button(cursor, &event->tablet->base, event->time_msec, dispatch_cursor_button(cursor, &event->tablet->base, event->time_msec,
BTN_LEFT, WLR_BUTTON_RELEASED); BTN_LEFT, WL_POINTER_BUTTON_STATE_RELEASED);
wlr_seat_pointer_notify_frame(cursor->seat->wlr_seat); wlr_seat_pointer_notify_frame(cursor->seat->wlr_seat);
} else if (!surface || !wlr_surface_accepts_tablet_v2(tablet_v2, surface)) { } else if (!surface || !wlr_surface_accepts_tablet_v2(tablet_v2, surface)) {
// If we started holding the tool tip down on a surface that accepts // If we started holding the tool tip down on a surface that accepts
@ -673,7 +673,7 @@ static void handle_tool_tip(struct wl_listener *listener, void *data) {
} else { } else {
cursor->simulating_pointer_from_tool_tip = true; cursor->simulating_pointer_from_tool_tip = true;
dispatch_cursor_button(cursor, &event->tablet->base, dispatch_cursor_button(cursor, &event->tablet->base,
event->time_msec, BTN_LEFT, WLR_BUTTON_PRESSED); event->time_msec, BTN_LEFT, WL_POINTER_BUTTON_STATE_PRESSED);
wlr_seat_pointer_notify_frame(cursor->seat->wlr_seat); wlr_seat_pointer_notify_frame(cursor->seat->wlr_seat);
} }
} else { } else {
@ -776,13 +776,13 @@ static void handle_tool_button(struct wl_listener *listener, void *data) {
case WLR_BUTTON_PRESSED: case WLR_BUTTON_PRESSED:
if (cursor->tool_buttons == 0) { if (cursor->tool_buttons == 0) {
dispatch_cursor_button(cursor, &event->tablet->base, dispatch_cursor_button(cursor, &event->tablet->base,
event->time_msec, BTN_RIGHT, event->state); event->time_msec, BTN_RIGHT, WL_POINTER_BUTTON_STATE_PRESSED);
} }
break; break;
case WLR_BUTTON_RELEASED: case WLR_BUTTON_RELEASED:
if (cursor->tool_buttons <= 1) { if (cursor->tool_buttons <= 1) {
dispatch_cursor_button(cursor, &event->tablet->base, dispatch_cursor_button(cursor, &event->tablet->base,
event->time_msec, BTN_RIGHT, event->state); event->time_msec, BTN_RIGHT, WL_POINTER_BUTTON_STATE_RELEASED);
} }
break; break;
} }

View file

@ -65,8 +65,15 @@ struct sway_seat *input_manager_sway_seat_from_wlr_seat(struct wlr_seat *wlr_sea
} }
char *input_device_get_identifier(struct wlr_input_device *device) { char *input_device_get_identifier(struct wlr_input_device *device) {
int vendor = device->vendor; int vendor = 0, product = 0;
int product = device->product; #if WLR_HAS_LIBINPUT_BACKEND
if (wlr_input_device_is_libinput(device)) {
struct libinput_device *libinput_dev = wlr_libinput_get_device_handle(device);
vendor = libinput_device_get_id_vendor(libinput_dev);
product = libinput_device_get_id_product(libinput_dev);
}
#endif
char *name = strdup(device->name ? device->name : ""); char *name = strdup(device->name ? device->name : "");
strip_whitespace(name); strip_whitespace(name);
@ -111,7 +118,7 @@ const char *input_device_get_type(struct sway_input_device *device) {
return "keyboard"; return "keyboard";
case WLR_INPUT_DEVICE_TOUCH: case WLR_INPUT_DEVICE_TOUCH:
return "touch"; return "touch";
case WLR_INPUT_DEVICE_TABLET_TOOL: case WLR_INPUT_DEVICE_TABLET:
return "tablet_tool"; return "tablet_tool";
case WLR_INPUT_DEVICE_TABLET_PAD: case WLR_INPUT_DEVICE_TABLET_PAD:
return "tablet_pad"; return "tablet_pad";

View file

@ -607,7 +607,7 @@ static void seat_update_capabilities(struct sway_seat *seat) {
case WLR_INPUT_DEVICE_TOUCH: case WLR_INPUT_DEVICE_TOUCH:
caps |= WL_SEAT_CAPABILITY_TOUCH; caps |= WL_SEAT_CAPABILITY_TOUCH;
break; break;
case WLR_INPUT_DEVICE_TABLET_TOOL: case WLR_INPUT_DEVICE_TABLET:
caps |= WL_SEAT_CAPABILITY_POINTER; caps |= WL_SEAT_CAPABILITY_POINTER;
break; break;
case WLR_INPUT_DEVICE_SWITCH: case WLR_INPUT_DEVICE_SWITCH:
@ -665,7 +665,7 @@ static const char *get_builtin_output_name(void) {
static bool is_touch_or_tablet_tool(struct sway_seat_device *seat_device) { static bool is_touch_or_tablet_tool(struct sway_seat_device *seat_device) {
switch (seat_device->input_device->wlr_device->type) { switch (seat_device->input_device->wlr_device->type) {
case WLR_INPUT_DEVICE_TOUCH: case WLR_INPUT_DEVICE_TOUCH:
case WLR_INPUT_DEVICE_TABLET_TOOL: case WLR_INPUT_DEVICE_TABLET:
return true; return true;
default: default:
return false; return false;
@ -680,7 +680,7 @@ static void seat_apply_input_mapping(struct sway_seat *seat,
switch (sway_device->input_device->wlr_device->type) { switch (sway_device->input_device->wlr_device->type) {
case WLR_INPUT_DEVICE_POINTER: case WLR_INPUT_DEVICE_POINTER:
case WLR_INPUT_DEVICE_TOUCH: case WLR_INPUT_DEVICE_TOUCH:
case WLR_INPUT_DEVICE_TABLET_TOOL: case WLR_INPUT_DEVICE_TABLET:
break; break;
default: default:
return; // these devices don't support mappings return; // these devices don't support mappings
@ -873,7 +873,7 @@ void seat_configure_device(struct sway_seat *seat,
case WLR_INPUT_DEVICE_TOUCH: case WLR_INPUT_DEVICE_TOUCH:
seat_configure_touch(seat, seat_device); seat_configure_touch(seat, seat_device);
break; break;
case WLR_INPUT_DEVICE_TABLET_TOOL: case WLR_INPUT_DEVICE_TABLET:
seat_configure_tablet_tool(seat, seat_device); seat_configure_tablet_tool(seat, seat_device);
break; break;
case WLR_INPUT_DEVICE_TABLET_PAD: case WLR_INPUT_DEVICE_TABLET_PAD:
@ -912,7 +912,7 @@ void seat_reset_device(struct sway_seat *seat,
case WLR_INPUT_DEVICE_TOUCH: case WLR_INPUT_DEVICE_TOUCH:
seat_reset_input_config(seat, seat_device); seat_reset_input_config(seat, seat_device);
break; break;
case WLR_INPUT_DEVICE_TABLET_TOOL: case WLR_INPUT_DEVICE_TABLET:
seat_reset_input_config(seat, seat_device); seat_reset_input_config(seat, seat_device);
break; break;
case WLR_INPUT_DEVICE_TABLET_PAD: case WLR_INPUT_DEVICE_TABLET_PAD:
@ -1520,7 +1520,7 @@ struct seat_config *seat_get_config_by_name(const char *name) {
} }
void seat_pointer_notify_button(struct sway_seat *seat, uint32_t time_msec, void seat_pointer_notify_button(struct sway_seat *seat, uint32_t time_msec,
uint32_t button, enum wlr_button_state state) { uint32_t button, enum wl_pointer_button_state state) {
seat->last_button_serial = wlr_seat_pointer_notify_button(seat->wlr_seat, seat->last_button_serial = wlr_seat_pointer_notify_button(seat->wlr_seat,
time_msec, button, state); time_msec, button, state);
} }
@ -1557,7 +1557,7 @@ void seatop_unref(struct sway_seat *seat, struct sway_container *con) {
void seatop_button(struct sway_seat *seat, uint32_t time_msec, void seatop_button(struct sway_seat *seat, uint32_t time_msec,
struct wlr_input_device *device, uint32_t button, struct wlr_input_device *device, uint32_t button,
enum wlr_button_state state) { enum wl_pointer_button_state state) {
if (seat->seatop_impl->button) { if (seat->seatop_impl->button) {
seat->seatop_impl->button(seat, time_msec, device, button, state); seat->seatop_impl->button(seat, time_msec, device, button, state);
} }

View file

@ -290,7 +290,7 @@ static void handle_tablet_tool_tip(struct sway_seat *seat,
static bool trigger_pointer_button_binding(struct sway_seat *seat, static bool trigger_pointer_button_binding(struct sway_seat *seat,
struct wlr_input_device *device, uint32_t button, struct wlr_input_device *device, uint32_t button,
enum wlr_button_state state, uint32_t modifiers, enum wl_pointer_button_state state, uint32_t modifiers,
bool on_titlebar, bool on_border, bool on_contents, bool on_workspace) { bool on_titlebar, bool on_border, bool on_contents, bool on_workspace) {
// We can reach this for non-pointer devices if we're currently emulating // We can reach this for non-pointer devices if we're currently emulating
// pointer input for one. Emulated input should not trigger bindings. The // pointer input for one. Emulated input should not trigger bindings. The
@ -304,7 +304,7 @@ static bool trigger_pointer_button_binding(struct sway_seat *seat,
char *device_identifier = device ? input_device_get_identifier(device) char *device_identifier = device ? input_device_get_identifier(device)
: strdup("*"); : strdup("*");
struct sway_binding *binding = NULL; struct sway_binding *binding = NULL;
if (state == WLR_BUTTON_PRESSED) { if (state == WL_POINTER_BUTTON_STATE_PRESSED) {
state_add_button(e, button); state_add_button(e, button);
binding = get_active_mouse_binding(e, binding = get_active_mouse_binding(e,
config->current_mode->mouse_bindings, modifiers, false, config->current_mode->mouse_bindings, modifiers, false,
@ -329,7 +329,7 @@ static bool trigger_pointer_button_binding(struct sway_seat *seat,
static void handle_button(struct sway_seat *seat, uint32_t time_msec, static void handle_button(struct sway_seat *seat, uint32_t time_msec,
struct wlr_input_device *device, uint32_t button, struct wlr_input_device *device, uint32_t button,
enum wlr_button_state state) { enum wl_pointer_button_state state) {
struct sway_cursor *cursor = seat->cursor; struct sway_cursor *cursor = seat->cursor;
// Determine what's under the cursor // Determine what's under the cursor
@ -362,7 +362,7 @@ static void handle_button(struct sway_seat *seat, uint32_t time_msec,
// Handle clicking an empty workspace // Handle clicking an empty workspace
if (node && node->type == N_WORKSPACE) { if (node && node->type == N_WORKSPACE) {
if (state == WLR_BUTTON_PRESSED) { if (state == WL_POINTER_BUTTON_STATE_PRESSED) {
seat_set_focus(seat, node); seat_set_focus(seat, node);
transaction_commit_dirty(); transaction_commit_dirty();
} }
@ -377,7 +377,7 @@ static void handle_button(struct sway_seat *seat, uint32_t time_msec,
seat_set_focus_layer(seat, layer); seat_set_focus_layer(seat, layer);
transaction_commit_dirty(); transaction_commit_dirty();
} }
if (state == WLR_BUTTON_PRESSED) { if (state == WL_POINTER_BUTTON_STATE_PRESSED) {
seatop_begin_down_on_surface(seat, surface, sx, sy); seatop_begin_down_on_surface(seat, surface, sx, sy);
} }
seat_pointer_notify_button(seat, time_msec, button, state); seat_pointer_notify_button(seat, time_msec, button, state);
@ -386,7 +386,7 @@ static void handle_button(struct sway_seat *seat, uint32_t time_msec,
// Handle tiling resize via border // Handle tiling resize via border
if (cont && resize_edge && button == BTN_LEFT && if (cont && resize_edge && button == BTN_LEFT &&
state == WLR_BUTTON_PRESSED && !is_floating) { state == WL_POINTER_BUTTON_STATE_PRESSED && !is_floating) {
// If a resize is triggered on a tabbed or stacked container, change // If a resize is triggered on a tabbed or stacked container, change
// focus to the tab which already had inactive focus -- otherwise, we'd // focus to the tab which already had inactive focus -- otherwise, we'd
// change the active tab when the user probably just wanted to resize. // change the active tab when the user probably just wanted to resize.
@ -404,7 +404,7 @@ static void handle_button(struct sway_seat *seat, uint32_t time_msec,
// Handle tiling resize via mod // Handle tiling resize via mod
bool mod_pressed = modifiers & config->floating_mod; bool mod_pressed = modifiers & config->floating_mod;
if (cont && !is_floating_or_child && mod_pressed && if (cont && !is_floating_or_child && mod_pressed &&
state == WLR_BUTTON_PRESSED) { state == WL_POINTER_BUTTON_STATE_PRESSED) {
uint32_t btn_resize = config->floating_mod_inverse ? uint32_t btn_resize = config->floating_mod_inverse ?
BTN_LEFT : BTN_RIGHT; BTN_LEFT : BTN_RIGHT;
if (button == btn_resize) { if (button == btn_resize) {
@ -432,7 +432,7 @@ static void handle_button(struct sway_seat *seat, uint32_t time_msec,
} }
// Handle changing focus when clicking on a container // Handle changing focus when clicking on a container
if (cont && state == WLR_BUTTON_PRESSED) { if (cont && state == WL_POINTER_BUTTON_STATE_PRESSED) {
// Default case: focus the container that was just clicked. // Default case: focus the container that was just clicked.
node = &cont->node; node = &cont->node;
@ -453,7 +453,7 @@ static void handle_button(struct sway_seat *seat, uint32_t time_msec,
// Handle beginning floating move // Handle beginning floating move
if (cont && is_floating_or_child && !is_fullscreen_or_child && if (cont && is_floating_or_child && !is_fullscreen_or_child &&
state == WLR_BUTTON_PRESSED) { state == WL_POINTER_BUTTON_STATE_PRESSED) {
uint32_t btn_move = config->floating_mod_inverse ? BTN_RIGHT : BTN_LEFT; uint32_t btn_move = config->floating_mod_inverse ? BTN_RIGHT : BTN_LEFT;
if (button == btn_move && (mod_pressed || on_titlebar)) { if (button == btn_move && (mod_pressed || on_titlebar)) {
seatop_begin_move_floating(seat, container_toplevel_ancestor(cont)); seatop_begin_move_floating(seat, container_toplevel_ancestor(cont));
@ -463,7 +463,7 @@ static void handle_button(struct sway_seat *seat, uint32_t time_msec,
// Handle beginning floating resize // Handle beginning floating resize
if (cont && is_floating_or_child && !is_fullscreen_or_child && if (cont && is_floating_or_child && !is_fullscreen_or_child &&
state == WLR_BUTTON_PRESSED) { state == WL_POINTER_BUTTON_STATE_PRESSED) {
// Via border // Via border
if (button == BTN_LEFT && resize_edge != WLR_EDGE_NONE) { if (button == BTN_LEFT && resize_edge != WLR_EDGE_NONE) {
seat_set_focus_container(seat, cont); seat_set_focus_container(seat, cont);
@ -489,7 +489,7 @@ static void handle_button(struct sway_seat *seat, uint32_t time_msec,
// Handle moving a tiling container // Handle moving a tiling container
if (config->tiling_drag && (mod_pressed || on_titlebar) && if (config->tiling_drag && (mod_pressed || on_titlebar) &&
state == WLR_BUTTON_PRESSED && !is_floating_or_child && state == WL_POINTER_BUTTON_STATE_PRESSED && !is_floating_or_child &&
cont && cont->pending.fullscreen_mode == FULLSCREEN_NONE) { cont && cont->pending.fullscreen_mode == FULLSCREEN_NONE) {
// If moving a container by its title bar, use a threshold for the drag // If moving a container by its title bar, use a threshold for the drag
if (!mod_pressed && config->tiling_drag_threshold > 0) { if (!mod_pressed && config->tiling_drag_threshold > 0) {
@ -502,14 +502,14 @@ static void handle_button(struct sway_seat *seat, uint32_t time_msec,
} }
// Handle mousedown on a container surface // Handle mousedown on a container surface
if (surface && cont && state == WLR_BUTTON_PRESSED) { if (surface && cont && state == WL_POINTER_BUTTON_STATE_PRESSED) {
seatop_begin_down(seat, cont, sx, sy); seatop_begin_down(seat, cont, sx, sy);
seat_pointer_notify_button(seat, time_msec, button, WLR_BUTTON_PRESSED); seat_pointer_notify_button(seat, time_msec, button, WL_POINTER_BUTTON_STATE_PRESSED);
return; return;
} }
// Handle clicking a container surface or decorations // Handle clicking a container surface or decorations
if (cont && state == WLR_BUTTON_PRESSED) { if (cont && state == WL_POINTER_BUTTON_STATE_PRESSED) {
seat_pointer_notify_button(seat, time_msec, button, state); seat_pointer_notify_button(seat, time_msec, button, state);
return; return;
} }
@ -684,7 +684,7 @@ static void handle_touch_down(struct sway_seat *seat,
pointer_motion(cursor, event->time_msec, &event->touch->base, dx, dy, pointer_motion(cursor, event->time_msec, &event->touch->base, dx, dy,
dx, dy); dx, dy);
dispatch_cursor_button(cursor, &event->touch->base, event->time_msec, dispatch_cursor_button(cursor, &event->touch->base, event->time_msec,
BTN_LEFT, WLR_BUTTON_PRESSED); BTN_LEFT, WL_POINTER_BUTTON_STATE_PRESSED);
} }
} }
@ -694,9 +694,9 @@ static void handle_touch_down(struct sway_seat *seat,
static uint32_t wl_axis_to_button(struct wlr_pointer_axis_event *event) { static uint32_t wl_axis_to_button(struct wlr_pointer_axis_event *event) {
switch (event->orientation) { switch (event->orientation) {
case WLR_AXIS_ORIENTATION_VERTICAL: case WL_POINTER_AXIS_VERTICAL_SCROLL:
return event->delta < 0 ? SWAY_SCROLL_UP : SWAY_SCROLL_DOWN; return event->delta < 0 ? SWAY_SCROLL_UP : SWAY_SCROLL_DOWN;
case WLR_AXIS_ORIENTATION_HORIZONTAL: case WL_POINTER_AXIS_HORIZONTAL_SCROLL:
return event->delta < 0 ? SWAY_SCROLL_LEFT : SWAY_SCROLL_RIGHT; return event->delta < 0 ? SWAY_SCROLL_LEFT : SWAY_SCROLL_RIGHT;
default: default:
sway_log(SWAY_DEBUG, "Unknown axis orientation"); sway_log(SWAY_DEBUG, "Unknown axis orientation");

View file

@ -142,7 +142,7 @@ static void handle_pointer_axis(struct sway_seat *seat,
static void handle_button(struct sway_seat *seat, uint32_t time_msec, static void handle_button(struct sway_seat *seat, uint32_t time_msec,
struct wlr_input_device *device, uint32_t button, struct wlr_input_device *device, uint32_t button,
enum wlr_button_state state) { enum wl_pointer_button_state state) {
seat_pointer_notify_button(seat, time_msec, button, state); seat_pointer_notify_button(seat, time_msec, button, state);
if (seat->cursor->pressed_button_count == 0) { if (seat->cursor->pressed_button_count == 0) {

View file

@ -21,7 +21,7 @@ static void finalize_move(struct sway_seat *seat) {
static void handle_button(struct sway_seat *seat, uint32_t time_msec, static void handle_button(struct sway_seat *seat, uint32_t time_msec,
struct wlr_input_device *device, uint32_t button, struct wlr_input_device *device, uint32_t button,
enum wlr_button_state state) { enum wl_pointer_button_state state) {
if (seat->cursor->pressed_button_count == 0) { if (seat->cursor->pressed_button_count == 0) {
finalize_move(seat); finalize_move(seat);
} }

View file

@ -405,7 +405,7 @@ static void finalize_move(struct sway_seat *seat) {
static void handle_button(struct sway_seat *seat, uint32_t time_msec, static void handle_button(struct sway_seat *seat, uint32_t time_msec,
struct wlr_input_device *device, uint32_t button, struct wlr_input_device *device, uint32_t button,
enum wlr_button_state state) { enum wl_pointer_button_state state) {
if (seat->cursor->pressed_button_count == 0) { if (seat->cursor->pressed_button_count == 0) {
finalize_move(seat); finalize_move(seat);
} }

View file

@ -20,7 +20,7 @@ struct seatop_resize_floating_event {
static void handle_button(struct sway_seat *seat, uint32_t time_msec, static void handle_button(struct sway_seat *seat, uint32_t time_msec,
struct wlr_input_device *device, uint32_t button, struct wlr_input_device *device, uint32_t button,
enum wlr_button_state state) { enum wl_pointer_button_state state) {
struct seatop_resize_floating_event *e = seat->seatop_data; struct seatop_resize_floating_event *e = seat->seatop_data;
struct sway_container *con = e->con; struct sway_container *con = e->con;

View file

@ -45,7 +45,7 @@ static struct sway_container *container_get_resize_sibling(
static void handle_button(struct sway_seat *seat, uint32_t time_msec, static void handle_button(struct sway_seat *seat, uint32_t time_msec,
struct wlr_input_device *device, uint32_t button, struct wlr_input_device *device, uint32_t button,
enum wlr_button_state state) { enum wl_pointer_button_state state) {
struct seatop_resize_tiling_event *e = seat->seatop_data; struct seatop_resize_tiling_event *e = seat->seatop_data;
if (seat->cursor->pressed_button_count == 0) { if (seat->cursor->pressed_button_count == 0) {

View file

@ -293,10 +293,6 @@ static void input_popup_update(struct sway_input_popup *popup) {
return; return;
} }
wlr_scene_node_destroy(&popup->scene_tree->node);
wlr_scene_node_destroy(popup->desc.relative);
popup->scene_tree = NULL;
bool cursor_rect = text_input->input->current.features bool cursor_rect = text_input->input->current.features
& WLR_TEXT_INPUT_V3_FEATURE_CURSOR_RECTANGLE; & WLR_TEXT_INPUT_V3_FEATURE_CURSOR_RECTANGLE;
struct wlr_surface *focused_surface = text_input->input->focused_surface; struct wlr_surface *focused_surface = text_input->input->focused_surface;

View file

@ -288,6 +288,8 @@ static json_object *ipc_json_create_node(int id, const char* type, char *name,
json_object_object_add(object, "focus", focus); json_object_object_add(object, "focus", focus);
json_object_object_add(object, "fullscreen_mode", json_object_new_int(0)); json_object_object_add(object, "fullscreen_mode", json_object_new_int(0));
json_object_object_add(object, "sticky", json_object_new_boolean(false)); json_object_object_add(object, "sticky", json_object_new_boolean(false));
json_object_object_add(object, "floating", NULL);
json_object_object_add(object, "scratchpad_state", NULL);
return object; return object;
} }
@ -675,7 +677,8 @@ static void ipc_json_describe_view(struct sway_container *c, json_object *object
static void ipc_json_describe_container(struct sway_container *c, json_object *object) { static void ipc_json_describe_container(struct sway_container *c, json_object *object) {
json_object_object_add(object, "name", json_object_object_add(object, "name",
c->title ? json_object_new_string(c->title) : NULL); c->title ? json_object_new_string(c->title) : NULL);
if (container_is_floating(c)) { bool floating = container_is_floating(c);
if (floating) {
json_object_object_add(object, "type", json_object_object_add(object, "type",
json_object_new_string("floating_con")); json_object_new_string("floating_con"));
} }
@ -693,9 +696,17 @@ static void ipc_json_describe_container(struct sway_container *c, json_object *o
json_object_object_add(object, "urgent", json_object_new_boolean(urgent)); json_object_object_add(object, "urgent", json_object_new_boolean(urgent));
json_object_object_add(object, "sticky", json_object_new_boolean(c->is_sticky)); json_object_object_add(object, "sticky", json_object_new_boolean(c->is_sticky));
// sway doesn't track the floating reason, so we can't use "auto_on" or "user_off"
json_object_object_add(object, "floating",
json_object_new_string(floating ? "user_on" : "auto_off"));
json_object_object_add(object, "fullscreen_mode", json_object_object_add(object, "fullscreen_mode",
json_object_new_int(c->pending.fullscreen_mode)); json_object_new_int(c->pending.fullscreen_mode));
// sway doesn't track if window was resized in scratchpad, so we can't use "changed"
json_object_object_add(object, "scratchpad_state",
json_object_new_string(!c->scratchpad ? "none" : "fresh"));
struct sway_node *parent = node_get_parent(&c->node); struct sway_node *parent = node_get_parent(&c->node);
struct wlr_box parent_box = {0, 0, 0, 0}; struct wlr_box parent_box = {0, 0, 0, 0};
@ -1086,10 +1097,6 @@ json_object *ipc_json_describe_input(struct sway_input_device *device) {
json_object_new_string(device->identifier)); json_object_new_string(device->identifier));
json_object_object_add(object, "name", json_object_object_add(object, "name",
json_object_new_string(device->wlr_device->name)); json_object_new_string(device->wlr_device->name));
json_object_object_add(object, "vendor",
json_object_new_int(device->wlr_device->vendor));
json_object_object_add(object, "product",
json_object_new_int(device->wlr_device->product));
json_object_object_add(object, "type", json_object_object_add(object, "type",
json_object_new_string( json_object_new_string(
input_device_get_type(device))); input_device_get_type(device)));
@ -1143,6 +1150,10 @@ json_object *ipc_json_describe_input(struct sway_input_device *device) {
libinput_dev = wlr_libinput_get_device_handle(device->wlr_device); libinput_dev = wlr_libinput_get_device_handle(device->wlr_device);
json_object_object_add(object, "libinput", json_object_object_add(object, "libinput",
describe_libinput_device(libinput_dev)); describe_libinput_device(libinput_dev));
json_object_object_add(object, "vendor",
json_object_new_int(libinput_device_get_id_vendor(libinput_dev)));
json_object_object_add(object, "product",
json_object_new_int(libinput_device_get_id_product(libinput_dev)));
} }
#endif #endif

View file

@ -65,7 +65,7 @@
#include <wlr/types/wlr_drm_lease_v1.h> #include <wlr/types/wlr_drm_lease_v1.h>
#endif #endif
#define SWAY_XDG_SHELL_VERSION 2 #define SWAY_XDG_SHELL_VERSION 5
#define SWAY_LAYER_SHELL_VERSION 4 #define SWAY_LAYER_SHELL_VERSION 4
#define SWAY_FOREIGN_TOPLEVEL_LIST_VERSION 1 #define SWAY_FOREIGN_TOPLEVEL_LIST_VERSION 1

View file

@ -376,6 +376,12 @@ node and will have the following properties:
: integer : integer
: (Only containers and views) The fullscreen mode of the node. 0 means none, 1 means : (Only containers and views) The fullscreen mode of the node. 0 means none, 1 means
full workspace, and 2 means global fullscreen full workspace, and 2 means global fullscreen
|- floating
: string
: Floating state of container. Can be either "auto_off" or "user_on"
|- scratchpad_state
: string
: Whether the window is in the scratchpad. Can be either "none" or "fresh"
|- app_id |- app_id
: string : string
: (Only views) For an xdg-shell view, the name of the application, if set. : (Only views) For an xdg-shell view, the name of the application, if set.