mirror of
https://github.com/swaywm/sway.git
synced 2024-11-27 18:31:28 +00:00
Merge branch 'master' into feature/swap-workspace
This commit is contained in:
commit
d56dc242a4
|
@ -114,7 +114,7 @@ void pointer_motion(struct sway_cursor *cursor, uint32_t time_msec,
|
|||
|
||||
void dispatch_cursor_button(struct sway_cursor *cursor,
|
||||
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,
|
||||
struct wlr_pointer_axis_event *event);
|
||||
|
|
|
@ -17,7 +17,7 @@ struct sway_seat;
|
|||
struct sway_seatop_impl {
|
||||
void (*button)(struct sway_seat *seat, uint32_t time_msec,
|
||||
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_axis)(struct sway_seat *seat,
|
||||
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);
|
||||
|
||||
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 seatop_button(struct sway_seat *seat, uint32_t time_msec,
|
||||
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);
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ struct sway_output {
|
|||
enum wl_output_subpixel detected_subpixel;
|
||||
enum scale_filter_mode scale_filter;
|
||||
|
||||
bool enabling, enabled;
|
||||
bool enabled;
|
||||
list_t *workspaces;
|
||||
|
||||
struct sway_output_state current;
|
||||
|
|
|
@ -192,6 +192,7 @@ struct sway_xdg_popup {
|
|||
|
||||
struct wl_listener surface_commit;
|
||||
struct wl_listener new_popup;
|
||||
struct wl_listener reposition;
|
||||
struct wl_listener destroy;
|
||||
};
|
||||
|
||||
|
|
|
@ -769,15 +769,6 @@ static struct cmd_results *cmd_move_in_direction(
|
|||
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);
|
||||
|
||||
return cmd_results_new(CMD_SUCCESS, NULL);
|
||||
|
|
|
@ -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,
|
||||
char *action, char *button_str) {
|
||||
enum wlr_button_state state;
|
||||
enum wl_pointer_button_state state;
|
||||
uint32_t button;
|
||||
if (strcasecmp(action, "press") == 0) {
|
||||
state = WLR_BUTTON_PRESSED;
|
||||
state = WL_POINTER_BUTTON_STATE_PRESSED;
|
||||
} else if (strcasecmp(action, "release") == 0) {
|
||||
state = WLR_BUTTON_RELEASED;
|
||||
state = WL_POINTER_BUTTON_STATE_RELEASED;
|
||||
} else {
|
||||
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
|
||||
|| button == SWAY_SCROLL_LEFT || button == SWAY_SCROLL_RIGHT) {
|
||||
// Dispatch axis event
|
||||
enum wlr_axis_orientation orientation =
|
||||
enum wl_pointer_axis orientation =
|
||||
(button == SWAY_SCROLL_UP || button == SWAY_SCROLL_DOWN)
|
||||
? WLR_AXIS_ORIENTATION_VERTICAL
|
||||
: WLR_AXIS_ORIENTATION_HORIZONTAL;
|
||||
? WL_POINTER_AXIS_VERTICAL_SCROLL
|
||||
: WL_POINTER_AXIS_HORIZONTAL_SCROLL;
|
||||
double delta = (button == SWAY_SCROLL_UP || button == SWAY_SCROLL_LEFT)
|
||||
? -1 : 1;
|
||||
struct wlr_pointer_axis_event event = {
|
||||
.pointer = NULL,
|
||||
.time_msec = 0,
|
||||
.source = WLR_AXIS_SOURCE_WHEEL,
|
||||
.source = WL_POINTER_AXIS_SOURCE_WHEEL,
|
||||
.orientation = orientation,
|
||||
.delta = delta * 15,
|
||||
.delta_discrete = delta
|
||||
|
|
|
@ -37,19 +37,26 @@
|
|||
struct sway_config *config = NULL;
|
||||
|
||||
static struct xkb_state *keysym_translation_state_create(
|
||||
struct xkb_rule_names rules) {
|
||||
struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_SECURE_GETENV);
|
||||
struct xkb_rule_names rules, uint32_t context_flags) {
|
||||
struct xkb_context *context = xkb_context_new(context_flags | XKB_CONTEXT_NO_SECURE_GETENV);
|
||||
struct xkb_keymap *xkb_keymap = xkb_keymap_new_from_names(
|
||||
context,
|
||||
&rules,
|
||||
XKB_KEYMAP_COMPILE_NO_FLAGS);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
static void keysym_translation_state_destroy(
|
||||
struct xkb_state *state) {
|
||||
if (state == NULL) {
|
||||
return;
|
||||
}
|
||||
xkb_keymap_unref(xkb_state_get_keymap(state));
|
||||
xkb_state_unref(state);
|
||||
}
|
||||
|
@ -337,8 +344,14 @@ static void config_defaults(struct sway_config *config) {
|
|||
|
||||
// The keysym to keycode translation
|
||||
struct xkb_rule_names rules = {0};
|
||||
config->keysym_translation_state =
|
||||
keysym_translation_state_create(rules);
|
||||
config->keysym_translation_state = keysym_translation_state_create(rules, 0);
|
||||
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;
|
||||
cleanup:
|
||||
|
@ -985,8 +998,12 @@ void translate_keysyms(struct input_config *input_config) {
|
|||
|
||||
struct xkb_rule_names rules = {0};
|
||||
input_config_fill_rule_names(input_config, &rules);
|
||||
config->keysym_translation_state =
|
||||
keysym_translation_state_create(rules);
|
||||
config->keysym_translation_state = keysym_translation_state_create(rules, 0);
|
||||
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) {
|
||||
struct sway_mode *mode = config->modes->items[i];
|
||||
|
|
|
@ -510,9 +510,6 @@ bool apply_output_config(struct output_config *oc, struct sway_output *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};
|
||||
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
|
||||
// the mode we asked for.
|
||||
sway_log(SWAY_ERROR, "Failed to commit output %s", wlr_output->name);
|
||||
output->enabling = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
output->enabling = false;
|
||||
|
||||
if (oc && !oc->enabled) {
|
||||
sway_log(SWAY_DEBUG, "Disabling output %s", oc->name);
|
||||
if (output->enabled) {
|
||||
|
|
|
@ -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) {
|
||||
case SCALE_FILTER_LINEAR:
|
||||
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
|
||||
// We don't want to damage outputs that aren't our current output that
|
||||
// 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);
|
||||
} else if (node->type == WLR_SCENE_NODE_TREE) {
|
||||
|
|
|
@ -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->destroy.link);
|
||||
wl_list_remove(&popup->surface_commit.link);
|
||||
wl_list_remove(&popup->reposition.link);
|
||||
wlr_scene_node_destroy(&popup->scene_tree->node);
|
||||
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,
|
||||
struct sway_view *view, struct wlr_scene_tree *parent) {
|
||||
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;
|
||||
wl_signal_add(&xdg_surface->events.new_popup, &popup->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);
|
||||
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
|
||||
wlr_xdg_surface_schedule_configure(xdg_surface);
|
||||
// TODO: wlr_xdg_toplevel_set_bounds()
|
||||
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);
|
||||
|
||||
xdg_toplevel->base->data = xdg_shell_view;
|
||||
|
||||
wlr_xdg_toplevel_set_wm_capabilities(xdg_toplevel,
|
||||
XDG_TOPLEVEL_WM_CAPABILITIES_FULLSCREEN);
|
||||
}
|
||||
|
|
|
@ -243,7 +243,7 @@ static enum sway_input_idle_source idle_source_from_device(
|
|||
return IDLE_SOURCE_POINTER;
|
||||
case WLR_INPUT_DEVICE_TOUCH:
|
||||
return IDLE_SOURCE_TOUCH;
|
||||
case WLR_INPUT_DEVICE_TABLET_TOOL:
|
||||
case WLR_INPUT_DEVICE_TABLET:
|
||||
return IDLE_SOURCE_TABLET_TOOL;
|
||||
case WLR_INPUT_DEVICE_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,
|
||||
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) {
|
||||
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 wlr_pointer_button_event *event = data;
|
||||
|
||||
if (event->state == WLR_BUTTON_PRESSED) {
|
||||
if (event->state == WL_POINTER_BUTTON_STATE_PRESSED) {
|
||||
cursor->pressed_button_count++;
|
||||
} else {
|
||||
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) {
|
||||
cursor->pointer_touch_up = true;
|
||||
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 {
|
||||
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) {
|
||||
cursor->pointer_touch_up = true;
|
||||
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 {
|
||||
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 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);
|
||||
if (tablet->width_mm == 0 || tablet->height_mm == 0) {
|
||||
return;
|
||||
|
@ -661,7 +661,7 @@ static void handle_tool_tip(struct wl_listener *listener, void *data) {
|
|||
event->state == WLR_TABLET_TOOL_TIP_UP) {
|
||||
cursor->simulating_pointer_from_tool_tip = false;
|
||||
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);
|
||||
} else if (!surface || !wlr_surface_accepts_tablet_v2(tablet_v2, surface)) {
|
||||
// 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 {
|
||||
cursor->simulating_pointer_from_tool_tip = true;
|
||||
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);
|
||||
}
|
||||
} else {
|
||||
|
@ -776,13 +776,13 @@ static void handle_tool_button(struct wl_listener *listener, void *data) {
|
|||
case WLR_BUTTON_PRESSED:
|
||||
if (cursor->tool_buttons == 0) {
|
||||
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;
|
||||
case WLR_BUTTON_RELEASED:
|
||||
if (cursor->tool_buttons <= 1) {
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
int vendor = device->vendor;
|
||||
int product = device->product;
|
||||
int vendor = 0, product = 0;
|
||||
#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 : "");
|
||||
strip_whitespace(name);
|
||||
|
||||
|
@ -111,7 +118,7 @@ const char *input_device_get_type(struct sway_input_device *device) {
|
|||
return "keyboard";
|
||||
case WLR_INPUT_DEVICE_TOUCH:
|
||||
return "touch";
|
||||
case WLR_INPUT_DEVICE_TABLET_TOOL:
|
||||
case WLR_INPUT_DEVICE_TABLET:
|
||||
return "tablet_tool";
|
||||
case WLR_INPUT_DEVICE_TABLET_PAD:
|
||||
return "tablet_pad";
|
||||
|
|
|
@ -607,7 +607,7 @@ static void seat_update_capabilities(struct sway_seat *seat) {
|
|||
case WLR_INPUT_DEVICE_TOUCH:
|
||||
caps |= WL_SEAT_CAPABILITY_TOUCH;
|
||||
break;
|
||||
case WLR_INPUT_DEVICE_TABLET_TOOL:
|
||||
case WLR_INPUT_DEVICE_TABLET:
|
||||
caps |= WL_SEAT_CAPABILITY_POINTER;
|
||||
break;
|
||||
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) {
|
||||
switch (seat_device->input_device->wlr_device->type) {
|
||||
case WLR_INPUT_DEVICE_TOUCH:
|
||||
case WLR_INPUT_DEVICE_TABLET_TOOL:
|
||||
case WLR_INPUT_DEVICE_TABLET:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
|
@ -680,7 +680,7 @@ static void seat_apply_input_mapping(struct sway_seat *seat,
|
|||
switch (sway_device->input_device->wlr_device->type) {
|
||||
case WLR_INPUT_DEVICE_POINTER:
|
||||
case WLR_INPUT_DEVICE_TOUCH:
|
||||
case WLR_INPUT_DEVICE_TABLET_TOOL:
|
||||
case WLR_INPUT_DEVICE_TABLET:
|
||||
break;
|
||||
default:
|
||||
return; // these devices don't support mappings
|
||||
|
@ -873,7 +873,7 @@ void seat_configure_device(struct sway_seat *seat,
|
|||
case WLR_INPUT_DEVICE_TOUCH:
|
||||
seat_configure_touch(seat, seat_device);
|
||||
break;
|
||||
case WLR_INPUT_DEVICE_TABLET_TOOL:
|
||||
case WLR_INPUT_DEVICE_TABLET:
|
||||
seat_configure_tablet_tool(seat, seat_device);
|
||||
break;
|
||||
case WLR_INPUT_DEVICE_TABLET_PAD:
|
||||
|
@ -912,7 +912,7 @@ void seat_reset_device(struct sway_seat *seat,
|
|||
case WLR_INPUT_DEVICE_TOUCH:
|
||||
seat_reset_input_config(seat, seat_device);
|
||||
break;
|
||||
case WLR_INPUT_DEVICE_TABLET_TOOL:
|
||||
case WLR_INPUT_DEVICE_TABLET:
|
||||
seat_reset_input_config(seat, seat_device);
|
||||
break;
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
struct wlr_input_device *device, uint32_t button,
|
||||
enum wlr_button_state state) {
|
||||
enum wl_pointer_button_state state) {
|
||||
if (seat->seatop_impl->button) {
|
||||
seat->seatop_impl->button(seat, time_msec, device, button, state);
|
||||
}
|
||||
|
|
|
@ -290,7 +290,7 @@ static void handle_tablet_tool_tip(struct sway_seat *seat,
|
|||
|
||||
static bool trigger_pointer_button_binding(struct sway_seat *seat,
|
||||
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) {
|
||||
// We can reach this for non-pointer devices if we're currently emulating
|
||||
// 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)
|
||||
: strdup("*");
|
||||
struct sway_binding *binding = NULL;
|
||||
if (state == WLR_BUTTON_PRESSED) {
|
||||
if (state == WL_POINTER_BUTTON_STATE_PRESSED) {
|
||||
state_add_button(e, button);
|
||||
binding = get_active_mouse_binding(e,
|
||||
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,
|
||||
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;
|
||||
|
||||
// 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
|
||||
if (node && node->type == N_WORKSPACE) {
|
||||
if (state == WLR_BUTTON_PRESSED) {
|
||||
if (state == WL_POINTER_BUTTON_STATE_PRESSED) {
|
||||
seat_set_focus(seat, node);
|
||||
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);
|
||||
transaction_commit_dirty();
|
||||
}
|
||||
if (state == WLR_BUTTON_PRESSED) {
|
||||
if (state == WL_POINTER_BUTTON_STATE_PRESSED) {
|
||||
seatop_begin_down_on_surface(seat, surface, sx, sy);
|
||||
}
|
||||
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
|
||||
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
|
||||
// focus to the tab which already had inactive focus -- otherwise, we'd
|
||||
// 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
|
||||
bool mod_pressed = modifiers & config->floating_mod;
|
||||
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 ?
|
||||
BTN_LEFT : BTN_RIGHT;
|
||||
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
|
||||
if (cont && state == WLR_BUTTON_PRESSED) {
|
||||
if (cont && state == WL_POINTER_BUTTON_STATE_PRESSED) {
|
||||
// Default case: focus the container that was just clicked.
|
||||
node = &cont->node;
|
||||
|
||||
|
@ -453,7 +453,7 @@ static void handle_button(struct sway_seat *seat, uint32_t time_msec,
|
|||
|
||||
// Handle beginning floating move
|
||||
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;
|
||||
if (button == btn_move && (mod_pressed || on_titlebar)) {
|
||||
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
|
||||
if (cont && is_floating_or_child && !is_fullscreen_or_child &&
|
||||
state == WLR_BUTTON_PRESSED) {
|
||||
state == WL_POINTER_BUTTON_STATE_PRESSED) {
|
||||
// Via border
|
||||
if (button == BTN_LEFT && resize_edge != WLR_EDGE_NONE) {
|
||||
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
|
||||
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) {
|
||||
// If moving a container by its title bar, use a threshold for the drag
|
||||
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
|
||||
if (surface && cont && state == WLR_BUTTON_PRESSED) {
|
||||
if (surface && cont && state == WL_POINTER_BUTTON_STATE_PRESSED) {
|
||||
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;
|
||||
}
|
||||
|
||||
// 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);
|
||||
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,
|
||||
dx, dy);
|
||||
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) {
|
||||
switch (event->orientation) {
|
||||
case WLR_AXIS_ORIENTATION_VERTICAL:
|
||||
case WL_POINTER_AXIS_VERTICAL_SCROLL:
|
||||
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;
|
||||
default:
|
||||
sway_log(SWAY_DEBUG, "Unknown axis orientation");
|
||||
|
|
|
@ -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,
|
||||
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);
|
||||
|
||||
if (seat->cursor->pressed_button_count == 0) {
|
||||
|
|
|
@ -21,7 +21,7 @@ static void finalize_move(struct sway_seat *seat) {
|
|||
|
||||
static void handle_button(struct sway_seat *seat, uint32_t time_msec,
|
||||
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) {
|
||||
finalize_move(seat);
|
||||
}
|
||||
|
|
|
@ -405,7 +405,7 @@ static void finalize_move(struct sway_seat *seat) {
|
|||
|
||||
static void handle_button(struct sway_seat *seat, uint32_t time_msec,
|
||||
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) {
|
||||
finalize_move(seat);
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ struct seatop_resize_floating_event {
|
|||
|
||||
static void handle_button(struct sway_seat *seat, uint32_t time_msec,
|
||||
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 sway_container *con = e->con;
|
||||
|
||||
|
|
|
@ -45,7 +45,7 @@ static struct sway_container *container_get_resize_sibling(
|
|||
|
||||
static void handle_button(struct sway_seat *seat, uint32_t time_msec,
|
||||
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;
|
||||
|
||||
if (seat->cursor->pressed_button_count == 0) {
|
||||
|
|
|
@ -293,10 +293,6 @@ static void input_popup_update(struct sway_input_popup *popup) {
|
|||
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
|
||||
& WLR_TEXT_INPUT_V3_FEATURE_CURSOR_RECTANGLE;
|
||||
struct wlr_surface *focused_surface = text_input->input->focused_surface;
|
||||
|
|
|
@ -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, "fullscreen_mode", json_object_new_int(0));
|
||||
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;
|
||||
}
|
||||
|
@ -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) {
|
||||
json_object_object_add(object, "name",
|
||||
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_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, "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_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 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_object_add(object, "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_new_string(
|
||||
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);
|
||||
json_object_object_add(object, "libinput",
|
||||
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
|
||||
|
||||
|
|
|
@ -65,7 +65,7 @@
|
|||
#include <wlr/types/wlr_drm_lease_v1.h>
|
||||
#endif
|
||||
|
||||
#define SWAY_XDG_SHELL_VERSION 2
|
||||
#define SWAY_XDG_SHELL_VERSION 5
|
||||
#define SWAY_LAYER_SHELL_VERSION 4
|
||||
#define SWAY_FOREIGN_TOPLEVEL_LIST_VERSION 1
|
||||
|
||||
|
|
|
@ -376,6 +376,12 @@ node and will have the following properties:
|
|||
: integer
|
||||
: (Only containers and views) The fullscreen mode of the node. 0 means none, 1 means
|
||||
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
|
||||
: string
|
||||
: (Only views) For an xdg-shell view, the name of the application, if set.
|
||||
|
|
Loading…
Reference in a new issue