pointer-constraints: remove protocol

This implementation as it stands is incomplete/buggy and will make
updating to wlr_scene more complex.

It will be reimplemented after updating to wlr_scene is complete.
This commit is contained in:
Isaac Freund 2023-01-23 14:33:32 +01:00
parent 06cb76f937
commit b7ac5becfb
No known key found for this signature in database
GPG Key ID: 86DED400DDFD7A11
5 changed files with 6 additions and 207 deletions

View File

@ -108,7 +108,6 @@ pub fn build(b: *zbs.Builder) !void {
scanner.generate("xdg_wm_base", 2); scanner.generate("xdg_wm_base", 2);
scanner.generate("zwp_pointer_gestures_v1", 3); scanner.generate("zwp_pointer_gestures_v1", 3);
scanner.generate("zwp_pointer_constraints_v1", 1);
scanner.generate("ext_session_lock_manager_v1", 1); scanner.generate("ext_session_lock_manager_v1", 1);
scanner.generate("zriver_control_v1", 1); scanner.generate("zriver_control_v1", 1);

View File

@ -102,8 +102,6 @@ xcursor_manager: *wlr.XcursorManager,
image: Image = .unknown, image: Image = .unknown,
constraint: ?*wlr.PointerConstraintV1 = null,
/// Number of distinct buttons currently pressed /// Number of distinct buttons currently pressed
pressed_count: u32 = 0, pressed_count: u32 = 0,
@ -959,26 +957,6 @@ fn processMotion(self: *Self, device: *wlr.InputDevice, time: u32, delta_x: f64,
); );
var dx: f64 = delta_x; var dx: f64 = delta_x;
var dy: f64 = delta_y; var dy: f64 = delta_y;
if (self.constraint) |constraint| {
if (self.mode == .passthrough or self.mode == .down) {
if (constraint.type == .locked) return;
const result = self.surfaceAt() orelse return;
if (result.surface != constraint.surface) return;
const sx = result.sx;
const sy = result.sy;
var sx_con: f64 = undefined;
var sy_con: f64 = undefined;
if (!wlr.region.confine(&constraint.region, sx, sy, sx + dx, sy + dy, &sx_con, &sy_con)) {
return;
}
dx = sx_con - sx;
dy = sy_con - sy;
}
}
switch (self.mode) { switch (self.mode) {
.passthrough => { .passthrough => {
self.wlr_cursor.move(device, dx, dy); self.wlr_cursor.move(device, dx, dy);

View File

@ -29,7 +29,6 @@ const util = @import("util.zig");
const InputConfig = @import("InputConfig.zig"); const InputConfig = @import("InputConfig.zig");
const InputDevice = @import("InputDevice.zig"); const InputDevice = @import("InputDevice.zig");
const Keyboard = @import("Keyboard.zig"); const Keyboard = @import("Keyboard.zig");
const PointerConstraint = @import("PointerConstraint.zig");
const Seat = @import("Seat.zig"); const Seat = @import("Seat.zig");
const Switch = @import("Switch.zig"); const Switch = @import("Switch.zig");
@ -40,7 +39,6 @@ const log = std.log.scoped(.input_manager);
new_input: wl.Listener(*wlr.InputDevice) = wl.Listener(*wlr.InputDevice).init(handleNewInput), new_input: wl.Listener(*wlr.InputDevice) = wl.Listener(*wlr.InputDevice).init(handleNewInput),
idle_notifier: *wlr.IdleNotifierV1, idle_notifier: *wlr.IdleNotifierV1,
pointer_constraints: *wlr.PointerConstraintsV1,
relative_pointer_manager: *wlr.RelativePointerManagerV1, relative_pointer_manager: *wlr.RelativePointerManagerV1,
virtual_pointer_manager: *wlr.VirtualPointerManagerV1, virtual_pointer_manager: *wlr.VirtualPointerManagerV1,
virtual_keyboard_manager: *wlr.VirtualKeyboardManagerV1, virtual_keyboard_manager: *wlr.VirtualKeyboardManagerV1,
@ -51,8 +49,6 @@ seats: std.TailQueue(Seat) = .{},
exclusive_client: ?*wl.Client = null, exclusive_client: ?*wl.Client = null,
new_pointer_constraint: wl.Listener(*wlr.PointerConstraintV1) =
wl.Listener(*wlr.PointerConstraintV1).init(handleNewPointerConstraint),
new_virtual_pointer: wl.Listener(*wlr.VirtualPointerManagerV1.event.NewPointer) = new_virtual_pointer: wl.Listener(*wlr.VirtualPointerManagerV1.event.NewPointer) =
wl.Listener(*wlr.VirtualPointerManagerV1.event.NewPointer).init(handleNewVirtualPointer), wl.Listener(*wlr.VirtualPointerManagerV1.event.NewPointer).init(handleNewVirtualPointer),
new_virtual_keyboard: wl.Listener(*wlr.VirtualKeyboardV1) = new_virtual_keyboard: wl.Listener(*wlr.VirtualKeyboardV1) =
@ -65,7 +61,6 @@ pub fn init(self: *Self) !void {
self.* = .{ self.* = .{
// These are automatically freed when the display is destroyed // These are automatically freed when the display is destroyed
.idle_notifier = try wlr.IdleNotifierV1.create(server.wl_server), .idle_notifier = try wlr.IdleNotifierV1.create(server.wl_server),
.pointer_constraints = try wlr.PointerConstraintsV1.create(server.wl_server),
.relative_pointer_manager = try wlr.RelativePointerManagerV1.create(server.wl_server), .relative_pointer_manager = try wlr.RelativePointerManagerV1.create(server.wl_server),
.virtual_pointer_manager = try wlr.VirtualPointerManagerV1.create(server.wl_server), .virtual_pointer_manager = try wlr.VirtualPointerManagerV1.create(server.wl_server),
.virtual_keyboard_manager = try wlr.VirtualKeyboardManagerV1.create(server.wl_server), .virtual_keyboard_manager = try wlr.VirtualKeyboardManagerV1.create(server.wl_server),
@ -81,7 +76,6 @@ pub fn init(self: *Self) !void {
if (build_options.xwayland) server.xwayland.setSeat(self.defaultSeat().wlr_seat); if (build_options.xwayland) server.xwayland.setSeat(self.defaultSeat().wlr_seat);
server.backend.events.new_input.add(&self.new_input); server.backend.events.new_input.add(&self.new_input);
self.pointer_constraints.events.new_constraint.add(&self.new_pointer_constraint);
self.virtual_pointer_manager.events.new_virtual_pointer.add(&self.new_virtual_pointer); self.virtual_pointer_manager.events.new_virtual_pointer.add(&self.new_virtual_pointer);
self.virtual_keyboard_manager.events.new_virtual_keyboard.add(&self.new_virtual_keyboard); self.virtual_keyboard_manager.events.new_virtual_keyboard.add(&self.new_virtual_keyboard);
} }
@ -124,19 +118,6 @@ fn handleNewInput(listener: *wl.Listener(*wlr.InputDevice), wlr_device: *wlr.Inp
self.defaultSeat().addDevice(wlr_device); self.defaultSeat().addDevice(wlr_device);
} }
fn handleNewPointerConstraint(
_: *wl.Listener(*wlr.PointerConstraintV1),
constraint: *wlr.PointerConstraintV1,
) void {
const pointer_constraint = util.gpa.create(PointerConstraint) catch {
constraint.resource.getClient().postNoMemory();
log.err("out of memory", .{});
return;
};
pointer_constraint.init(constraint);
}
fn handleNewVirtualPointer( fn handleNewVirtualPointer(
listener: *wl.Listener(*wlr.VirtualPointerManagerV1.event.NewPointer), listener: *wl.Listener(*wlr.VirtualPointerManagerV1.event.NewPointer),
event: *wlr.VirtualPointerManagerV1.event.NewPointer, event: *wlr.VirtualPointerManagerV1.event.NewPointer,

View File

@ -1,144 +0,0 @@
// This file is part of river, a dynamic tiling wayland compositor.
//
// Copyright 2021 The River Developers
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 3.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
const Self = @This();
const build_options = @import("build_options");
const std = @import("std");
const wlr = @import("wlroots");
const wl = @import("wayland").server.wl;
const pixman = @import("pixman");
const server = &@import("main.zig").server;
const util = @import("util.zig");
const Cursor = @import("Cursor.zig");
const Seat = @import("Seat.zig");
const View = @import("View.zig");
constraint: *wlr.PointerConstraintV1,
cursor: *Cursor,
destroy: wl.Listener(*wlr.PointerConstraintV1) = wl.Listener(*wlr.PointerConstraintV1).init(handleDestroy),
set_region: wl.Listener(void) = wl.Listener(void).init(handleSetRegion),
pub fn init(self: *Self, constraint: *wlr.PointerConstraintV1) void {
const seat = @intToPtr(*Seat, constraint.seat.data);
self.* = .{
.constraint = constraint,
.cursor = &seat.cursor,
};
self.constraint.data = @ptrToInt(self);
self.constraint.events.destroy.add(&self.destroy);
self.constraint.events.set_region.add(&self.set_region);
if (seat.focused == .view and seat.focused.view.surface == self.constraint.surface) {
self.setAsActive();
}
}
pub fn setAsActive(self: *Self) void {
if (self.cursor.constraint == self.constraint) return;
if (self.cursor.constraint) |constraint| {
constraint.sendDeactivated();
}
self.cursor.constraint = self.constraint;
// TODO: This is the same hack sway uses to deal with the fact that this
// function may be called in response to a surface commit but before the
// the wlroots pointer constraints implementation's commit handler has been called.
// This logic is duplicated from that commit handler.
if (self.constraint.current.region.notEmpty()) {
_ = self.constraint.region.intersect(&self.constraint.surface.input_region, &self.constraint.current.region);
} else {
_ = self.constraint.region.copy(&self.constraint.surface.input_region);
}
self.constrainToRegion();
self.constraint.sendActivated();
}
fn constrainToRegion(self: *Self) void {
if (self.cursor.constraint != self.constraint) return;
if (View.fromWlrSurface(self.constraint.surface)) |view| {
const output = view.output;
var output_box: wlr.Box = undefined;
server.root.output_layout.getBox(output.wlr_output, &output_box);
const surface_lx = @intToFloat(f64, output_box.x + view.current.box.x - view.surface_box.x);
const surface_ly = @intToFloat(f64, output_box.y + view.current.box.y - view.surface_box.y);
const sx = @floatToInt(c_int, self.cursor.wlr_cursor.x - surface_lx);
const sy = @floatToInt(c_int, self.cursor.wlr_cursor.y - surface_ly);
// If the cursor is not already inside the constraint region, warp
// it to an arbitrary point inside the constraint region.
if (!self.constraint.region.containsPoint(sx, sy, null)) {
const rects = self.constraint.region.rectangles();
if (rects.len > 0) {
const new_lx = surface_lx + @intToFloat(f64, rects[0].x1 + rects[0].x2) / 2;
const new_ly = surface_ly + @intToFloat(f64, rects[0].y1 + rects[0].y2) / 2;
self.cursor.wlr_cursor.warpClosest(null, new_lx, new_ly);
}
}
}
}
fn handleDestroy(listener: *wl.Listener(*wlr.PointerConstraintV1), _: *wlr.PointerConstraintV1) void {
const self = @fieldParentPtr(Self, "destroy", listener);
self.destroy.link.remove();
self.set_region.link.remove();
if (self.cursor.constraint == self.constraint) {
warpToHint(self.cursor);
self.cursor.constraint = null;
}
util.gpa.destroy(self);
}
fn handleSetRegion(listener: *wl.Listener(void)) void {
const self = @fieldParentPtr(Self, "set_region", listener);
self.constrainToRegion();
}
pub fn warpToHint(cursor: *Cursor) void {
if (cursor.constraint) |constraint| {
if (constraint.current.committed.cursor_hint) {
if (View.fromWlrSurface(constraint.surface)) |view| {
const output = view.output;
var output_box: wlr.Box = undefined;
server.root.output_layout.getBox(output.wlr_output, &output_box);
const surface_lx = @intToFloat(f64, output_box.x + view.current.box.x - view.surface_box.x);
const surface_ly = @intToFloat(f64, output_box.y + view.current.box.y - view.surface_box.y);
_ = cursor.wlr_cursor.warp(
null,
surface_lx + constraint.current.cursor_hint.x,
surface_ly + constraint.current.cursor_hint.y,
);
}
}
}
}

View File

@ -45,7 +45,6 @@ const ViewStack = @import("view_stack.zig").ViewStack;
const XwaylandOverrideRedirect = @import("XwaylandOverrideRedirect.zig"); const XwaylandOverrideRedirect = @import("XwaylandOverrideRedirect.zig");
const log = std.log.scoped(.seat); const log = std.log.scoped(.seat);
const PointerConstraint = @import("PointerConstraint.zig");
pub const FocusTarget = union(enum) { pub const FocusTarget = union(enum) {
view: *View, view: *View,
@ -271,31 +270,17 @@ pub fn keyboardEnterOrLeave(self: *Self, target_surface: ?*wlr.Surface) void {
if (target_surface) |wlr_surface| { if (target_surface) |wlr_surface| {
self.keyboardNotifyEnter(wlr_surface); self.keyboardNotifyEnter(wlr_surface);
if (server.input_manager.pointer_constraints.constraintForSurface(wlr_surface, self.wlr_seat)) |constraint| {
@intToPtr(*PointerConstraint, constraint.data).setAsActive();
} else if (self.cursor.constraint) |constraint| {
PointerConstraint.warpToHint(&self.cursor);
constraint.sendDeactivated();
self.cursor.constraint = null;
} else {
// Depending on configuration and cursor position, changing keyboard focus // Depending on configuration and cursor position, changing keyboard focus
// may cause the cursor to be warped. // may cause the cursor to be warped.
self.cursor.may_need_warp = true; self.cursor.may_need_warp = true;
}
} else { } else {
self.wlr_seat.keyboardClearFocus(); self.wlr_seat.keyboardClearFocus();
if (self.cursor.constraint) |constraint| {
PointerConstraint.warpToHint(&self.cursor);
constraint.sendDeactivated();
self.cursor.constraint = null;
} else {
// Depending on configuration and cursor position, changing keyboard focus // Depending on configuration and cursor position, changing keyboard focus
// may cause the cursor to be warped. // may cause the cursor to be warped.
self.cursor.may_need_warp = true; self.cursor.may_need_warp = true;
} }
} }
}
fn keyboardNotifyEnter(self: *Self, wlr_surface: *wlr.Surface) void { fn keyboardNotifyEnter(self: *Self, wlr_surface: *wlr.Surface) void {
if (self.wlr_seat.getKeyboard()) |wlr_keyboard| { if (self.wlr_seat.getKeyboard()) |wlr_keyboard| {