river: remove InputManager.server
The server is now global so this is no longer needed.
This commit is contained in:
parent
ac27db236a
commit
ece465b7ed
18 changed files with 71 additions and 70 deletions
|
@ -94,7 +94,7 @@ swipe_end: wl.Listener(*wlr.Pointer.event.SwipeEnd) =
|
||||||
pub fn init(self: *Self, seat: *Seat) !void {
|
pub fn init(self: *Self, seat: *Seat) !void {
|
||||||
const wlr_cursor = try wlr.Cursor.create();
|
const wlr_cursor = try wlr.Cursor.create();
|
||||||
errdefer wlr_cursor.destroy();
|
errdefer wlr_cursor.destroy();
|
||||||
wlr_cursor.attachOutputLayout(seat.input_manager.server.root.output_layout);
|
wlr_cursor.attachOutputLayout(server.root.output_layout);
|
||||||
|
|
||||||
// This is here so that self.xcursor_manager doesn't need to be an
|
// This is here so that self.xcursor_manager doesn't need to be an
|
||||||
// optional pointer. This isn't optimal as it does a needless allocation,
|
// optional pointer. This isn't optimal as it does a needless allocation,
|
||||||
|
@ -105,7 +105,7 @@ pub fn init(self: *Self, seat: *Seat) !void {
|
||||||
self.* = .{
|
self.* = .{
|
||||||
.seat = seat,
|
.seat = seat,
|
||||||
.wlr_cursor = wlr_cursor,
|
.wlr_cursor = wlr_cursor,
|
||||||
.pointer_gestures = try wlr.PointerGesturesV1.create(seat.input_manager.server.wl_server),
|
.pointer_gestures = try wlr.PointerGesturesV1.create(server.wl_server),
|
||||||
.xcursor_manager = xcursor_manager,
|
.xcursor_manager = xcursor_manager,
|
||||||
};
|
};
|
||||||
try self.setTheme(null, null);
|
try self.setTheme(null, null);
|
||||||
|
@ -346,8 +346,7 @@ fn handlePointerMapping(self: *Self, event: *wlr.Pointer.event.Button, view: *Vi
|
||||||
|
|
||||||
const fullscreen = view.current.fullscreen or view.pending.fullscreen;
|
const fullscreen = view.current.fullscreen or view.pending.fullscreen;
|
||||||
|
|
||||||
const config = self.seat.input_manager.server.config;
|
return for (server.config.modes.items[self.seat.mode_id].pointer_mappings.items) |mapping| {
|
||||||
return for (config.modes.items[self.seat.mode_id].pointer_mappings.items) |mapping| {
|
|
||||||
if (event.button == mapping.event_code and std.meta.eql(modifiers, mapping.modifiers)) {
|
if (event.button == mapping.event_code and std.meta.eql(modifiers, mapping.modifiers)) {
|
||||||
switch (mapping.action) {
|
switch (mapping.action) {
|
||||||
.move => if (!fullscreen) self.enterMode(.move, view),
|
.move => if (!fullscreen) self.enterMode(.move, view),
|
||||||
|
@ -427,14 +426,13 @@ fn handleRequestSetCursor(
|
||||||
/// surface coordinates.
|
/// surface coordinates.
|
||||||
/// This function must be kept in sync with the rendering order in render.zig.
|
/// This function must be kept in sync with the rendering order in render.zig.
|
||||||
fn surfaceAt(self: Self, lx: f64, ly: f64, sx: *f64, sy: *f64) ?*wlr.Surface {
|
fn surfaceAt(self: Self, lx: f64, ly: f64, sx: *f64, sy: *f64) ?*wlr.Surface {
|
||||||
const root = self.seat.input_manager.server.root;
|
const wlr_output = server.root.output_layout.outputAt(lx, ly) orelse return null;
|
||||||
const wlr_output = root.output_layout.outputAt(lx, ly) orelse return null;
|
|
||||||
const output = @intToPtr(*Output, wlr_output.data);
|
const output = @intToPtr(*Output, wlr_output.data);
|
||||||
|
|
||||||
// Get output-local coords from the layout coords
|
// Get output-local coords from the layout coords
|
||||||
var ox = lx;
|
var ox = lx;
|
||||||
var oy = ly;
|
var oy = ly;
|
||||||
root.output_layout.outputCoords(wlr_output, &ox, &oy);
|
server.root.output_layout.outputCoords(wlr_output, &ox, &oy);
|
||||||
|
|
||||||
// Check surfaces in the reverse order they are rendered in:
|
// Check surfaces in the reverse order they are rendered in:
|
||||||
// 1. overlay layer (+ popups)
|
// 1. overlay layer (+ popups)
|
||||||
|
@ -643,8 +641,7 @@ fn processMotion(self: *Self, device: *wlr.InputDevice, time: u32, delta_x: f64,
|
||||||
view.applyPending();
|
view.applyPending();
|
||||||
},
|
},
|
||||||
.resize => |data| {
|
.resize => |data| {
|
||||||
const config = &self.seat.input_manager.server.config;
|
const border_width = if (data.view.draw_borders) server.config.border_width else 0;
|
||||||
const border_width = if (data.view.draw_borders) config.border_width else 0;
|
|
||||||
|
|
||||||
// Set width/height of view, clamp to view size constraints and output dimensions
|
// Set width/height of view, clamp to view size constraints and output dimensions
|
||||||
const box = &data.view.pending.box;
|
const box = &data.view.pending.box;
|
||||||
|
@ -671,9 +668,6 @@ fn processMotion(self: *Self, device: *wlr.InputDevice, time: u32, delta_x: f64,
|
||||||
|
|
||||||
/// Pass an event on to the surface under the cursor, if any.
|
/// Pass an event on to the surface under the cursor, if any.
|
||||||
fn passthrough(self: *Self, time: u32) void {
|
fn passthrough(self: *Self, time: u32) void {
|
||||||
const root = &self.seat.input_manager.server.root;
|
|
||||||
const config = self.seat.input_manager.server.config;
|
|
||||||
|
|
||||||
var sx: f64 = undefined;
|
var sx: f64 = undefined;
|
||||||
var sy: f64 = undefined;
|
var sy: f64 = undefined;
|
||||||
if (self.surfaceAt(self.wlr_cursor.x, self.wlr_cursor.y, &sx, &sy)) |surface| {
|
if (self.surfaceAt(self.wlr_cursor.x, self.wlr_cursor.y, &sx, &sy)) |surface| {
|
||||||
|
@ -687,12 +681,12 @@ fn passthrough(self: *Self, time: u32) void {
|
||||||
self.seat.wlr_seat.pointerNotifyEnter(surface, sx, sy);
|
self.seat.wlr_seat.pointerNotifyEnter(surface, sx, sy);
|
||||||
self.seat.wlr_seat.pointerNotifyMotion(time, sx, sy);
|
self.seat.wlr_seat.pointerNotifyMotion(time, sx, sy);
|
||||||
|
|
||||||
const follow_mode = config.focus_follows_cursor;
|
const follow_mode = server.config.focus_follows_cursor;
|
||||||
if (follow_mode == .strict or (follow_mode == .normal and focus_change)) {
|
if (follow_mode == .strict or (follow_mode == .normal and focus_change)) {
|
||||||
if (View.fromWlrSurface(surface)) |view| {
|
if (View.fromWlrSurface(surface)) |view| {
|
||||||
self.seat.focusOutput(view.output);
|
self.seat.focusOutput(view.output);
|
||||||
self.seat.focus(view);
|
self.seat.focus(view);
|
||||||
root.startTransaction();
|
server.root.startTransaction();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ const std = @import("std");
|
||||||
const wlr = @import("wlroots");
|
const wlr = @import("wlroots");
|
||||||
const wl = @import("wayland").server.wl;
|
const wl = @import("wayland").server.wl;
|
||||||
|
|
||||||
|
const server = &@import("main.zig").server;
|
||||||
const util = @import("util.zig");
|
const util = @import("util.zig");
|
||||||
|
|
||||||
const Seat = @import("Seat.zig");
|
const Seat = @import("Seat.zig");
|
||||||
|
@ -37,8 +38,7 @@ pub fn init(self: *Self, seat: *Seat, wlr_drag_icon: *wlr.Drag.Icon) void {
|
||||||
|
|
||||||
fn handleDestroy(listener: *wl.Listener(*wlr.Drag.Icon), wlr_drag_icon: *wlr.Drag.Icon) void {
|
fn handleDestroy(listener: *wl.Listener(*wlr.Drag.Icon), wlr_drag_icon: *wlr.Drag.Icon) void {
|
||||||
const self = @fieldParentPtr(Self, "destroy", listener);
|
const self = @fieldParentPtr(Self, "destroy", listener);
|
||||||
const root = &self.seat.input_manager.server.root;
|
|
||||||
const node = @fieldParentPtr(std.SinglyLinkedList(Self).Node, "data", self);
|
const node = @fieldParentPtr(std.SinglyLinkedList(Self).Node, "data", self);
|
||||||
root.drag_icons.remove(node);
|
server.root.drag_icons.remove(node);
|
||||||
util.gpa.destroy(node);
|
util.gpa.destroy(node);
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ const std = @import("std");
|
||||||
const wlr = @import("wlroots");
|
const wlr = @import("wlroots");
|
||||||
const wl = @import("wayland").server.wl;
|
const wl = @import("wayland").server.wl;
|
||||||
|
|
||||||
|
const server = &@import("main.zig").server;
|
||||||
const util = @import("util.zig");
|
const util = @import("util.zig");
|
||||||
|
|
||||||
const Seat = @import("Seat.zig");
|
const Seat = @import("Seat.zig");
|
||||||
|
@ -33,7 +34,6 @@ const default_seat_name = "default";
|
||||||
|
|
||||||
const log = std.log.scoped(.input_manager);
|
const log = std.log.scoped(.input_manager);
|
||||||
|
|
||||||
server: *Server,
|
|
||||||
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: *wlr.Idle,
|
idle: *wlr.Idle,
|
||||||
|
@ -60,12 +60,11 @@ new_virtual_keyboard: wl.Listener(*wlr.VirtualKeyboardV1) =
|
||||||
wl.Listener(*wlr.VirtualKeyboardV1).init(handleNewVirtualKeyboard),
|
wl.Listener(*wlr.VirtualKeyboardV1).init(handleNewVirtualKeyboard),
|
||||||
// zig fmt: on
|
// zig fmt: on
|
||||||
|
|
||||||
pub fn init(self: *Self, server: *Server) !void {
|
pub fn init(self: *Self) !void {
|
||||||
const seat_node = try util.gpa.create(std.TailQueue(Seat).Node);
|
const seat_node = try util.gpa.create(std.TailQueue(Seat).Node);
|
||||||
errdefer util.gpa.destroy(seat_node);
|
errdefer util.gpa.destroy(seat_node);
|
||||||
|
|
||||||
self.* = .{
|
self.* = .{
|
||||||
.server = server,
|
|
||||||
// These are automatically freed when the display is destroyed
|
// These are automatically freed when the display is destroyed
|
||||||
.idle = try wlr.Idle.create(server.wl_server),
|
.idle = try wlr.Idle.create(server.wl_server),
|
||||||
.input_inhibit_manager = try wlr.InputInhibitManager.create(server.wl_server),
|
.input_inhibit_manager = try wlr.InputInhibitManager.create(server.wl_server),
|
||||||
|
@ -156,7 +155,7 @@ fn handleInhibitDeactivate(
|
||||||
|
|
||||||
// Calling arrangeLayers() like this ensures that any top or overlay,
|
// Calling arrangeLayers() like this ensures that any top or overlay,
|
||||||
// keyboard-interactive surfaces will re-grab focus.
|
// keyboard-interactive surfaces will re-grab focus.
|
||||||
var output_it = self.server.root.outputs.first;
|
var output_it = server.root.outputs.first;
|
||||||
while (output_it) |output_node| : (output_it = output_node.next) {
|
while (output_it) |output_node| : (output_it = output_node.next) {
|
||||||
output_node.data.arrangeLayers();
|
output_node.data.arrangeLayers();
|
||||||
}
|
}
|
||||||
|
@ -169,7 +168,7 @@ fn handleInhibitDeactivate(
|
||||||
seat_node.data.mode_id = seat_node.data.prev_mode_id;
|
seat_node.data.mode_id = seat_node.data.prev_mode_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.server.root.startTransaction();
|
server.root.startTransaction();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This event is raised by the backend when a new input device becomes available.
|
/// This event is raised by the backend when a new input device becomes available.
|
||||||
|
|
|
@ -22,6 +22,7 @@ const wlr = @import("wlroots");
|
||||||
const wl = @import("wayland").server.wl;
|
const wl = @import("wayland").server.wl;
|
||||||
const xkb = @import("xkbcommon");
|
const xkb = @import("xkbcommon");
|
||||||
|
|
||||||
|
const server = &@import("main.zig").server;
|
||||||
const util = @import("util.zig");
|
const util = @import("util.zig");
|
||||||
|
|
||||||
const Seat = @import("Seat.zig");
|
const Seat = @import("Seat.zig");
|
||||||
|
@ -60,8 +61,7 @@ pub fn init(self: *Self, seat: *Seat, input_device: *wlr.InputDevice) !void {
|
||||||
|
|
||||||
if (!wlr_keyboard.setKeymap(keymap)) return error.SetKeymapFailed;
|
if (!wlr_keyboard.setKeymap(keymap)) return error.SetKeymapFailed;
|
||||||
|
|
||||||
const config = &seat.input_manager.server.config;
|
wlr_keyboard.setRepeatInfo(server.config.repeat_rate, server.config.repeat_delay);
|
||||||
wlr_keyboard.setRepeatInfo(config.repeat_rate, config.repeat_delay);
|
|
||||||
|
|
||||||
wlr_keyboard.events.key.add(&self.key);
|
wlr_keyboard.events.key.add(&self.key);
|
||||||
wlr_keyboard.events.modifiers.add(&self.modifiers);
|
wlr_keyboard.events.modifiers.add(&self.modifiers);
|
||||||
|
@ -149,9 +149,8 @@ fn handleBuiltinMapping(self: Self, keysym: xkb.Keysym) bool {
|
||||||
switch (@enumToInt(keysym)) {
|
switch (@enumToInt(keysym)) {
|
||||||
@enumToInt(xkb.Keysym.XF86Switch_VT_1)...@enumToInt(xkb.Keysym.XF86Switch_VT_12) => {
|
@enumToInt(xkb.Keysym.XF86Switch_VT_1)...@enumToInt(xkb.Keysym.XF86Switch_VT_12) => {
|
||||||
log.debug("switch VT keysym received", .{});
|
log.debug("switch VT keysym received", .{});
|
||||||
const backend = self.seat.input_manager.server.backend;
|
if (server.backend.isMulti()) {
|
||||||
if (backend.isMulti()) {
|
if (server.backend.getSession()) |session| {
|
||||||
if (backend.getSession()) |session| {
|
|
||||||
const vt = @enumToInt(keysym) - @enumToInt(xkb.Keysym.XF86Switch_VT_1) + 1;
|
const vt = @enumToInt(keysym) - @enumToInt(xkb.Keysym.XF86Switch_VT_1) + 1;
|
||||||
const log_server = std.log.scoped(.server);
|
const log_server = std.log.scoped(.server);
|
||||||
log_server.notice("switching to VT {}", .{vt});
|
log_server.notice("switching to VT {}", .{vt});
|
||||||
|
|
|
@ -24,6 +24,7 @@ const wl = @import("wayland").server.wl;
|
||||||
const xkb = @import("xkbcommon");
|
const xkb = @import("xkbcommon");
|
||||||
|
|
||||||
const command = @import("command.zig");
|
const command = @import("command.zig");
|
||||||
|
const server = &@import("main.zig").server;
|
||||||
const util = @import("util.zig");
|
const util = @import("util.zig");
|
||||||
|
|
||||||
const DragIcon = @import("DragIcon.zig");
|
const DragIcon = @import("DragIcon.zig");
|
||||||
|
@ -88,8 +89,8 @@ pub fn init(self: *Self, input_manager: *InputManager, name: [*:0]const u8) !voi
|
||||||
self.* = .{
|
self.* = .{
|
||||||
.input_manager = input_manager,
|
.input_manager = input_manager,
|
||||||
// This will be automatically destroyed when the display is destroyed
|
// This will be automatically destroyed when the display is destroyed
|
||||||
.wlr_seat = try wlr.Seat.create(input_manager.server.wl_server, name),
|
.wlr_seat = try wlr.Seat.create(server.wl_server, name),
|
||||||
.focused_output = &self.input_manager.server.root.noop_output,
|
.focused_output = &server.root.noop_output,
|
||||||
};
|
};
|
||||||
self.wlr_seat.data = @ptrToInt(self);
|
self.wlr_seat.data = @ptrToInt(self);
|
||||||
|
|
||||||
|
@ -202,7 +203,7 @@ pub fn setFocusRaw(self: *Self, new_focus: FocusTarget) void {
|
||||||
if (build_options.xwayland and self.focused.view.impl == .xwayland_view)
|
if (build_options.xwayland and self.focused.view.impl == .xwayland_view)
|
||||||
self.focused.view.impl.xwayland_view.xwayland_surface.activate(false);
|
self.focused.view.impl.xwayland_view.xwayland_surface.activate(false);
|
||||||
if (self.focused.view.pending.focus == 0 and !self.focused.view.pending.fullscreen) {
|
if (self.focused.view.pending.focus == 0 and !self.focused.view.pending.fullscreen) {
|
||||||
self.focused.view.pending.target_opacity = self.input_manager.server.config.opacity.unfocused;
|
self.focused.view.pending.target_opacity = server.config.opacity.unfocused;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -216,7 +217,7 @@ pub fn setFocusRaw(self: *Self, new_focus: FocusTarget) void {
|
||||||
if (build_options.xwayland and target_view.impl == .xwayland_view)
|
if (build_options.xwayland and target_view.impl == .xwayland_view)
|
||||||
target_view.impl.xwayland_view.xwayland_surface.activate(true);
|
target_view.impl.xwayland_view.xwayland_surface.activate(true);
|
||||||
if (!target_view.pending.fullscreen) {
|
if (!target_view.pending.fullscreen) {
|
||||||
target_view.pending.target_opacity = self.input_manager.server.config.opacity.focused;
|
target_view.pending.target_opacity = server.config.opacity.focused;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
.layer => |target_layer| std.debug.assert(self.focused_output == target_layer.output),
|
.layer => |target_layer| std.debug.assert(self.focused_output == target_layer.output),
|
||||||
|
@ -264,8 +265,6 @@ pub fn setFocusRaw(self: *Self, new_focus: FocusTarget) void {
|
||||||
pub fn focusOutput(self: *Self, output: *Output) void {
|
pub fn focusOutput(self: *Self, output: *Output) void {
|
||||||
if (self.focused_output == output) return;
|
if (self.focused_output == output) return;
|
||||||
|
|
||||||
const root = &self.input_manager.server.root;
|
|
||||||
|
|
||||||
var it = self.status_trackers.first;
|
var it = self.status_trackers.first;
|
||||||
while (it) |node| : (it = node.next) node.data.sendOutput(.unfocused);
|
while (it) |node| : (it = node.next) node.data.sendOutput(.unfocused);
|
||||||
|
|
||||||
|
@ -306,7 +305,7 @@ pub fn handleMapping(
|
||||||
modifiers: wlr.Keyboard.ModifierMask,
|
modifiers: wlr.Keyboard.ModifierMask,
|
||||||
released: bool,
|
released: bool,
|
||||||
) bool {
|
) bool {
|
||||||
const modes = &self.input_manager.server.config.modes;
|
const modes = &server.config.modes;
|
||||||
for (modes.items[self.mode_id].mappings.items) |mapping| {
|
for (modes.items[self.mode_id].mappings.items) |mapping| {
|
||||||
if (std.meta.eql(modifiers, mapping.modifiers) and keysym == mapping.keysym and released == mapping.release) {
|
if (std.meta.eql(modifiers, mapping.modifiers) and keysym == mapping.keysym and released == mapping.release) {
|
||||||
// Execute the bound command
|
// Execute the bound command
|
||||||
|
@ -409,7 +408,7 @@ fn handleStartDrag(
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
node.data.init(self, wlr_drag_icon);
|
node.data.init(self, wlr_drag_icon);
|
||||||
self.input_manager.server.root.drag_icons.prepend(node);
|
server.root.drag_icons.prepend(node);
|
||||||
}
|
}
|
||||||
self.cursor.mode = .passthrough;
|
self.cursor.mode = .passthrough;
|
||||||
}
|
}
|
||||||
|
|
|
@ -115,7 +115,7 @@ pub fn init(self: *Self) !void {
|
||||||
try self.decoration_manager.init(self);
|
try self.decoration_manager.init(self);
|
||||||
try self.root.init();
|
try self.root.init();
|
||||||
// Must be called after root is initialized
|
// Must be called after root is initialized
|
||||||
try self.input_manager.init(self);
|
try self.input_manager.init();
|
||||||
try self.control.init(self);
|
try self.control.init(self);
|
||||||
try self.status_manager.init(self);
|
try self.status_manager.init(self);
|
||||||
try self.layout_manager.init(self);
|
try self.layout_manager.init(self);
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
|
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
|
||||||
|
const server = &@import("../main.zig").server;
|
||||||
|
|
||||||
const Error = @import("../command.zig").Error;
|
const Error = @import("../command.zig").Error;
|
||||||
const Seat = @import("../Seat.zig");
|
const Seat = @import("../Seat.zig");
|
||||||
|
|
||||||
|
@ -29,7 +31,6 @@ pub fn borderWidth(
|
||||||
if (args.len < 2) return Error.NotEnoughArguments;
|
if (args.len < 2) return Error.NotEnoughArguments;
|
||||||
if (args.len > 2) return Error.TooManyArguments;
|
if (args.len > 2) return Error.TooManyArguments;
|
||||||
|
|
||||||
const server = seat.input_manager.server;
|
|
||||||
server.config.border_width = try std.fmt.parseInt(u32, args[1], 10);
|
server.config.border_width = try std.fmt.parseInt(u32, args[1], 10);
|
||||||
server.root.arrangeAll();
|
server.root.arrangeAll();
|
||||||
server.root.startTransaction();
|
server.root.startTransaction();
|
||||||
|
@ -44,7 +45,7 @@ pub fn backgroundColor(
|
||||||
if (args.len < 2) return Error.NotEnoughArguments;
|
if (args.len < 2) return Error.NotEnoughArguments;
|
||||||
if (args.len > 2) return Error.TooManyArguments;
|
if (args.len > 2) return Error.TooManyArguments;
|
||||||
|
|
||||||
seat.input_manager.server.config.background_color = try parseRgba(args[1]);
|
server.config.background_color = try parseRgba(args[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn borderColorFocused(
|
pub fn borderColorFocused(
|
||||||
|
@ -56,7 +57,7 @@ pub fn borderColorFocused(
|
||||||
if (args.len < 2) return Error.NotEnoughArguments;
|
if (args.len < 2) return Error.NotEnoughArguments;
|
||||||
if (args.len > 2) return Error.TooManyArguments;
|
if (args.len > 2) return Error.TooManyArguments;
|
||||||
|
|
||||||
seat.input_manager.server.config.border_color_focused = try parseRgba(args[1]);
|
server.config.border_color_focused = try parseRgba(args[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn borderColorUnfocused(
|
pub fn borderColorUnfocused(
|
||||||
|
@ -68,7 +69,7 @@ pub fn borderColorUnfocused(
|
||||||
if (args.len < 2) return Error.NotEnoughArguments;
|
if (args.len < 2) return Error.NotEnoughArguments;
|
||||||
if (args.len > 2) return Error.TooManyArguments;
|
if (args.len > 2) return Error.TooManyArguments;
|
||||||
|
|
||||||
seat.input_manager.server.config.border_color_unfocused = try parseRgba(args[1]);
|
server.config.border_color_unfocused = try parseRgba(args[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parse a color in the format #RRGGBB or #RRGGBBAA
|
/// Parse a color in the format #RRGGBB or #RRGGBBAA
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
|
||||||
|
const server = &@import("../main.zig").server;
|
||||||
const util = @import("../util.zig");
|
const util = @import("../util.zig");
|
||||||
|
|
||||||
const Mode = @import("../Mode.zig");
|
const Mode = @import("../Mode.zig");
|
||||||
|
@ -34,7 +35,7 @@ pub fn declareMode(
|
||||||
if (args.len < 2) return Error.NotEnoughArguments;
|
if (args.len < 2) return Error.NotEnoughArguments;
|
||||||
if (args.len > 2) return Error.TooManyArguments;
|
if (args.len > 2) return Error.TooManyArguments;
|
||||||
|
|
||||||
const config = &seat.input_manager.server.config;
|
const config = &server.config;
|
||||||
const new_mode_name = args[1];
|
const new_mode_name = args[1];
|
||||||
|
|
||||||
if (config.mode_to_id.get(new_mode_name) != null) return;
|
if (config.mode_to_id.get(new_mode_name) != null) return;
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
|
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
|
||||||
|
const server = &@import("../main.zig").server;
|
||||||
|
|
||||||
const Error = @import("../command.zig").Error;
|
const Error = @import("../command.zig").Error;
|
||||||
const Seat = @import("../Seat.zig");
|
const Seat = @import("../Seat.zig");
|
||||||
|
|
||||||
|
@ -39,9 +41,8 @@ pub fn enterMode(
|
||||||
return Error.Other;
|
return Error.Other;
|
||||||
}
|
}
|
||||||
|
|
||||||
const config = seat.input_manager.server.config;
|
|
||||||
const target_mode = args[1];
|
const target_mode = args[1];
|
||||||
const mode_id = config.mode_to_id.get(target_mode) orelse {
|
const mode_id = server.config.mode_to_id.get(target_mode) orelse {
|
||||||
out.* = try std.fmt.allocPrint(
|
out.* = try std.fmt.allocPrint(
|
||||||
allocator,
|
allocator,
|
||||||
"cannot enter non-existant mode '{}'",
|
"cannot enter non-existant mode '{}'",
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
|
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
|
||||||
|
const server = &@import("../main.zig").server;
|
||||||
|
|
||||||
const Error = @import("../command.zig").Error;
|
const Error = @import("../command.zig").Error;
|
||||||
const Seat = @import("../Seat.zig");
|
const Seat = @import("../Seat.zig");
|
||||||
|
|
||||||
|
@ -28,5 +30,5 @@ pub fn exit(
|
||||||
out: *?[]const u8,
|
out: *?[]const u8,
|
||||||
) Error!void {
|
) Error!void {
|
||||||
if (args.len > 1) return Error.TooManyArguments;
|
if (args.len > 1) return Error.TooManyArguments;
|
||||||
seat.input_manager.server.wl_server.terminate();
|
server.wl_server.terminate();
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
|
||||||
|
const server = &@import("../main.zig").server;
|
||||||
const util = @import("../util.zig");
|
const util = @import("../util.zig");
|
||||||
|
|
||||||
const Error = @import("../command.zig").Error;
|
const Error = @import("../command.zig").Error;
|
||||||
|
@ -40,7 +41,7 @@ pub fn floatFilterAdd(
|
||||||
) Error!void {
|
) Error!void {
|
||||||
try appendFilter(
|
try appendFilter(
|
||||||
allocator,
|
allocator,
|
||||||
&seat.input_manager.server.config.float_filter,
|
&server.config.float_filter,
|
||||||
args,
|
args,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -53,7 +54,7 @@ pub fn csdFilterAdd(
|
||||||
) Error!void {
|
) Error!void {
|
||||||
try appendFilter(
|
try appendFilter(
|
||||||
allocator,
|
allocator,
|
||||||
&seat.input_manager.server.config.csd_filter,
|
&server.config.csd_filter,
|
||||||
args,
|
args,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
|
||||||
|
const server = &@import("../main.zig").server;
|
||||||
const util = @import("../util.zig");
|
const util = @import("../util.zig");
|
||||||
|
|
||||||
const Config = @import("../Config.zig");
|
const Config = @import("../Config.zig");
|
||||||
|
@ -32,8 +33,6 @@ pub fn focusFollowsCursor(
|
||||||
if (args.len < 2) return Error.NotEnoughArguments;
|
if (args.len < 2) return Error.NotEnoughArguments;
|
||||||
if (args.len > 2) return Error.TooManyArguments;
|
if (args.len > 2) return Error.TooManyArguments;
|
||||||
|
|
||||||
const server = seat.input_manager.server;
|
|
||||||
|
|
||||||
server.config.focus_follows_cursor =
|
server.config.focus_follows_cursor =
|
||||||
std.meta.stringToEnum(Config.FocusFollowsCursorMode, args[1]) orelse return Error.UnknownOption;
|
std.meta.stringToEnum(Config.FocusFollowsCursorMode, args[1]) orelse return Error.UnknownOption;
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
|
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
|
||||||
|
const server = &@import("../main.zig").server;
|
||||||
|
|
||||||
const Direction = @import("../command.zig").Direction;
|
const Direction = @import("../command.zig").Direction;
|
||||||
const Error = @import("../command.zig").Error;
|
const Error = @import("../command.zig").Error;
|
||||||
const Output = @import("../Output.zig");
|
const Output = @import("../Output.zig");
|
||||||
|
@ -34,21 +36,20 @@ pub fn focusOutput(
|
||||||
if (args.len > 2) return Error.TooManyArguments;
|
if (args.len > 2) return Error.TooManyArguments;
|
||||||
|
|
||||||
const direction = std.meta.stringToEnum(Direction, args[1]) orelse return Error.InvalidDirection;
|
const direction = std.meta.stringToEnum(Direction, args[1]) orelse return Error.InvalidDirection;
|
||||||
const root = &seat.input_manager.server.root;
|
|
||||||
|
|
||||||
// If the noop output is focused, there are no other outputs to switch to
|
// If the noop output is focused, there are no other outputs to switch to
|
||||||
if (seat.focused_output == &root.noop_output) {
|
if (seat.focused_output == &server.root.noop_output) {
|
||||||
std.debug.assert(root.outputs.len == 0);
|
std.debug.assert(server.root.outputs.len == 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Focus the next/prev output in the list if there is one, else wrap
|
// Focus the next/prev output in the list if there is one, else wrap
|
||||||
const focused_node = @fieldParentPtr(std.TailQueue(Output).Node, "data", seat.focused_output);
|
const focused_node = @fieldParentPtr(std.TailQueue(Output).Node, "data", seat.focused_output);
|
||||||
seat.focusOutput(switch (direction) {
|
seat.focusOutput(switch (direction) {
|
||||||
.next => if (focused_node.next) |node| &node.data else &root.outputs.first.?.data,
|
.next => if (focused_node.next) |node| &node.data else &server.root.outputs.first.?.data,
|
||||||
.previous => if (focused_node.prev) |node| &node.data else &root.outputs.last.?.data,
|
.previous => if (focused_node.prev) |node| &node.data else &server.root.outputs.last.?.data,
|
||||||
});
|
});
|
||||||
|
|
||||||
seat.focus(null);
|
seat.focus(null);
|
||||||
root.startTransaction();
|
server.root.startTransaction();
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,8 @@ const mem = std.mem;
|
||||||
const wl = @import("wayland").server.wl;
|
const wl = @import("wayland").server.wl;
|
||||||
const util = @import("../util.zig");
|
const util = @import("../util.zig");
|
||||||
|
|
||||||
|
const server = &@import("../main.zig").server;
|
||||||
|
|
||||||
const Error = @import("../command.zig").Error;
|
const Error = @import("../command.zig").Error;
|
||||||
const Seat = @import("../Seat.zig");
|
const Seat = @import("../Seat.zig");
|
||||||
|
|
||||||
|
@ -46,7 +48,6 @@ pub fn defaultLayout(
|
||||||
if (args.len < 2) return Error.NotEnoughArguments;
|
if (args.len < 2) return Error.NotEnoughArguments;
|
||||||
if (args.len > 2) return Error.TooManyArguments;
|
if (args.len > 2) return Error.TooManyArguments;
|
||||||
|
|
||||||
const server = seat.input_manager.server;
|
|
||||||
server.config.default_layout_namespace = try util.gpa.dupe(u8, args[1]);
|
server.config.default_layout_namespace = try util.gpa.dupe(u8, args[1]);
|
||||||
var it = server.root.all_outputs.first;
|
var it = server.root.all_outputs.first;
|
||||||
while (it) |node| : (it = node.next) {
|
while (it) |node| : (it = node.next) {
|
||||||
|
|
|
@ -21,6 +21,7 @@ const wlr = @import("wlroots");
|
||||||
const xkb = @import("xkbcommon");
|
const xkb = @import("xkbcommon");
|
||||||
|
|
||||||
const c = @import("../c.zig");
|
const c = @import("../c.zig");
|
||||||
|
const server = &@import("../main.zig").server;
|
||||||
const util = @import("../util.zig");
|
const util = @import("../util.zig");
|
||||||
|
|
||||||
const Error = @import("../command.zig").Error;
|
const Error = @import("../command.zig").Error;
|
||||||
|
@ -47,7 +48,7 @@ pub fn map(
|
||||||
const modifiers = try parseModifiers(allocator, args[2 + offset], out);
|
const modifiers = try parseModifiers(allocator, args[2 + offset], out);
|
||||||
const keysym = try parseKeysym(allocator, args[3 + offset], out);
|
const keysym = try parseKeysym(allocator, args[3 + offset], out);
|
||||||
|
|
||||||
const mode_mappings = &seat.input_manager.server.config.modes.items[mode_id].mappings;
|
const mode_mappings = &server.config.modes.items[mode_id].mappings;
|
||||||
|
|
||||||
const new = try Mapping.init(keysym, modifiers, optionals.release, args[4 + offset ..]);
|
const new = try Mapping.init(keysym, modifiers, optionals.release, args[4 + offset ..]);
|
||||||
errdefer new.deinit();
|
errdefer new.deinit();
|
||||||
|
@ -96,7 +97,7 @@ pub fn mapPointer(
|
||||||
.action = action,
|
.action = action,
|
||||||
};
|
};
|
||||||
|
|
||||||
const mode_pointer_mappings = &seat.input_manager.server.config.modes.items[mode_id].pointer_mappings;
|
const mode_pointer_mappings = &server.config.modes.items[mode_id].pointer_mappings;
|
||||||
if (pointerMappingExists(mode_pointer_mappings, modifiers, event_code)) |current| {
|
if (pointerMappingExists(mode_pointer_mappings, modifiers, event_code)) |current| {
|
||||||
mode_pointer_mappings.items[current] = new;
|
mode_pointer_mappings.items[current] = new;
|
||||||
} else {
|
} else {
|
||||||
|
@ -105,7 +106,7 @@ pub fn mapPointer(
|
||||||
}
|
}
|
||||||
|
|
||||||
fn modeNameToId(allocator: *std.mem.Allocator, seat: *Seat, mode_name: []const u8, out: *?[]const u8) !usize {
|
fn modeNameToId(allocator: *std.mem.Allocator, seat: *Seat, mode_name: []const u8, out: *?[]const u8) !usize {
|
||||||
const config = seat.input_manager.server.config;
|
const config = &server.config;
|
||||||
return config.mode_to_id.get(mode_name) orelse {
|
return config.mode_to_id.get(mode_name) orelse {
|
||||||
out.* = try std.fmt.allocPrint(
|
out.* = try std.fmt.allocPrint(
|
||||||
allocator,
|
allocator,
|
||||||
|
@ -255,7 +256,7 @@ pub fn unmap(
|
||||||
const modifiers = try parseModifiers(allocator, args[2 + offset], out);
|
const modifiers = try parseModifiers(allocator, args[2 + offset], out);
|
||||||
const keysym = try parseKeysym(allocator, args[3 + offset], out);
|
const keysym = try parseKeysym(allocator, args[3 + offset], out);
|
||||||
|
|
||||||
const mode_mappings = &seat.input_manager.server.config.modes.items[mode_id].mappings;
|
const mode_mappings = &server.config.modes.items[mode_id].mappings;
|
||||||
const mapping_idx = mappingExists(mode_mappings, modifiers, keysym, optionals.release) orelse return;
|
const mapping_idx = mappingExists(mode_mappings, modifiers, keysym, optionals.release) orelse return;
|
||||||
|
|
||||||
var mapping = mode_mappings.swapRemove(mapping_idx);
|
var mapping = mode_mappings.swapRemove(mapping_idx);
|
||||||
|
@ -279,7 +280,7 @@ pub fn unmapPointer(
|
||||||
const modifiers = try parseModifiers(allocator, args[2], out);
|
const modifiers = try parseModifiers(allocator, args[2], out);
|
||||||
const event_code = try parseEventCode(allocator, args[3], out);
|
const event_code = try parseEventCode(allocator, args[3], out);
|
||||||
|
|
||||||
const mode_pointer_mappings = &seat.input_manager.server.config.modes.items[mode_id].pointer_mappings;
|
const mode_pointer_mappings = &server.config.modes.items[mode_id].pointer_mappings;
|
||||||
const mapping_idx = pointerMappingExists(mode_pointer_mappings, modifiers, event_code) orelse return;
|
const mapping_idx = pointerMappingExists(mode_pointer_mappings, modifiers, event_code) orelse return;
|
||||||
|
|
||||||
_ = mode_pointer_mappings.swapRemove(mapping_idx);
|
_ = mode_pointer_mappings.swapRemove(mapping_idx);
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
|
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
|
||||||
|
const server = &@import("../main.zig").server;
|
||||||
|
|
||||||
const Error = @import("../command.zig").Error;
|
const Error = @import("../command.zig").Error;
|
||||||
const Seat = @import("../Seat.zig");
|
const Seat = @import("../Seat.zig");
|
||||||
const View = @import("../View.zig");
|
const View = @import("../View.zig");
|
||||||
|
@ -36,8 +38,6 @@ pub fn opacity(
|
||||||
if (args.len < 6) return Error.NotEnoughArguments;
|
if (args.len < 6) return Error.NotEnoughArguments;
|
||||||
if (args.len > 6) return Error.TooManyArguments;
|
if (args.len > 6) return Error.TooManyArguments;
|
||||||
|
|
||||||
const server = seat.input_manager.server;
|
|
||||||
|
|
||||||
// Focused opacity
|
// Focused opacity
|
||||||
server.config.opacity.focused = try std.fmt.parseFloat(f32, args[1]);
|
server.config.opacity.focused = try std.fmt.parseFloat(f32, args[1]);
|
||||||
if (server.config.opacity.focused < 0.0 or server.config.opacity.focused > 1.0)
|
if (server.config.opacity.focused < 0.0 or server.config.opacity.focused > 1.0)
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
|
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
|
||||||
|
const server = &@import("../main.zig").server;
|
||||||
|
|
||||||
const Direction = @import("../command.zig").Direction;
|
const Direction = @import("../command.zig").Direction;
|
||||||
const Error = @import("../command.zig").Error;
|
const Error = @import("../command.zig").Error;
|
||||||
const Output = @import("../Output.zig");
|
const Output = @import("../Output.zig");
|
||||||
|
@ -34,20 +36,19 @@ pub fn sendToOutput(
|
||||||
if (args.len > 2) return Error.TooManyArguments;
|
if (args.len > 2) return Error.TooManyArguments;
|
||||||
|
|
||||||
const direction = std.meta.stringToEnum(Direction, args[1]) orelse return Error.InvalidDirection;
|
const direction = std.meta.stringToEnum(Direction, args[1]) orelse return Error.InvalidDirection;
|
||||||
const root = &seat.input_manager.server.root;
|
|
||||||
|
|
||||||
if (seat.focused == .view) {
|
if (seat.focused == .view) {
|
||||||
// If the noop output is focused, there is nowhere to send the view
|
// If the noop output is focused, there is nowhere to send the view
|
||||||
if (seat.focused_output == &root.noop_output) {
|
if (seat.focused_output == &server.root.noop_output) {
|
||||||
std.debug.assert(root.outputs.len == 0);
|
std.debug.assert(server.root.outputs.len == 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send to the next/prev output in the list if there is one, else wrap
|
// Send to the next/prev output in the list if there is one, else wrap
|
||||||
const current_node = @fieldParentPtr(std.TailQueue(Output).Node, "data", seat.focused_output);
|
const current_node = @fieldParentPtr(std.TailQueue(Output).Node, "data", seat.focused_output);
|
||||||
const destination_output = switch (direction) {
|
const destination_output = switch (direction) {
|
||||||
.next => if (current_node.next) |node| &node.data else &root.outputs.first.?.data,
|
.next => if (current_node.next) |node| &node.data else &server.root.outputs.first.?.data,
|
||||||
.previous => if (current_node.prev) |node| &node.data else &root.outputs.last.?.data,
|
.previous => if (current_node.prev) |node| &node.data else &server.root.outputs.last.?.data,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Move the view to the target output
|
// Move the view to the target output
|
||||||
|
@ -57,6 +58,6 @@ pub fn sendToOutput(
|
||||||
seat.focus(null);
|
seat.focus(null);
|
||||||
seat.focused_output.arrangeViews();
|
seat.focused_output.arrangeViews();
|
||||||
destination_output.arrangeViews();
|
destination_output.arrangeViews();
|
||||||
root.startTransaction();
|
server.root.startTransaction();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
|
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
|
||||||
|
const server = &@import("../main.zig").server;
|
||||||
|
|
||||||
const Error = @import("../command.zig").Error;
|
const Error = @import("../command.zig").Error;
|
||||||
const Seat = @import("../Seat.zig");
|
const Seat = @import("../Seat.zig");
|
||||||
|
|
||||||
|
@ -33,9 +35,8 @@ pub fn setRepeat(
|
||||||
const rate = try std.fmt.parseInt(u31, args[1], 10);
|
const rate = try std.fmt.parseInt(u31, args[1], 10);
|
||||||
const delay = try std.fmt.parseInt(u31, args[2], 10);
|
const delay = try std.fmt.parseInt(u31, args[2], 10);
|
||||||
|
|
||||||
const config = &seat.input_manager.server.config;
|
server.config.repeat_rate = rate;
|
||||||
config.repeat_rate = rate;
|
server.config.repeat_delay = delay;
|
||||||
config.repeat_delay = delay;
|
|
||||||
|
|
||||||
var it = seat.keyboards.first;
|
var it = seat.keyboards.first;
|
||||||
while (it) |node| : (it = node.next) {
|
while (it) |node| : (it = node.next) {
|
||||||
|
|
Loading…
Reference in a new issue