Implement per-tag primary_count and primary_ratio
By default, each tag mask will use the default count and ratio. If the mask gets modified by any of the commands, it gets added to a hash map. When changing tag masks, the current count and ratio are stored, and they're used again later if you switch back to that mask. This commit also adds primary_count and primary_ratio to the general settings for the config, so users can set a default count/ratio to use.
This commit is contained in:
parent
8e93395360
commit
1df6820b1d
5 changed files with 75 additions and 7 deletions
|
|
@ -25,10 +25,15 @@ wl_surface: ?*wl.Surface = null,
|
|||
layer_surface: ?*zwlr.LayerSurfaceV1 = null,
|
||||
|
||||
/// Proportion of output width taken by the primary stack
|
||||
primary_ratio: f32 = 0.55,
|
||||
primary_ratio: f32,
|
||||
|
||||
/// Number of windows in the primary stack
|
||||
primary_count: u8 = 1,
|
||||
primary_count: u8,
|
||||
|
||||
/// Per-tagmask layout overrides
|
||||
/// These only get added when the user modifies primary count or ratio
|
||||
/// Any tagmask NOT in this map keeps using the defaults from Config
|
||||
tag_layout_overrides: std.AutoHashMapUnmanaged(u32, TagLayoutOverride) = .{},
|
||||
|
||||
/// Tags are 32-bit bitfield. A window can be active on one(?) or more tags.
|
||||
tags: u32 = 0x0001,
|
||||
|
|
@ -46,6 +51,12 @@ windows: wl.list.Head(Window, .link),
|
|||
|
||||
link: wl.list.Link,
|
||||
|
||||
/// Struct used for tagmask-specific count/ratio overrides
|
||||
pub const TagLayoutOverride = struct {
|
||||
primary_count: u8,
|
||||
primary_ratio: f32,
|
||||
};
|
||||
|
||||
pub const PendingManage = struct {
|
||||
width: ?u31 = null,
|
||||
height: ?u31 = null,
|
||||
|
|
@ -64,6 +75,8 @@ pub fn create(context: *Context, river_output_v1: *river.OutputV1) !*Output {
|
|||
output.* = .{
|
||||
.context = context,
|
||||
.river_output_v1 = river_output_v1,
|
||||
.primary_count = context.config.primary_count,
|
||||
.primary_ratio = context.config.primary_ratio,
|
||||
.windows = undefined, // we will initialize this shortly
|
||||
.link = undefined, // Handled by the wl.list
|
||||
};
|
||||
|
|
@ -82,6 +95,7 @@ pub fn destroy(output: *Output) void {
|
|||
window.destroy();
|
||||
}
|
||||
|
||||
output.tag_layout_overrides.deinit(utils.allocator);
|
||||
output.deinitWallpaperLayerSurface();
|
||||
output.river_output_v1.destroy();
|
||||
utils.allocator.destroy(output);
|
||||
|
|
@ -425,9 +439,6 @@ pub fn manage(output: *Output) void {
|
|||
output.y = y;
|
||||
}
|
||||
|
||||
if (output.pending_manage.tags) |tags| {
|
||||
output.tags = tags;
|
||||
}
|
||||
if (output.pending_manage.primary_ratio) |primary_ratio| {
|
||||
// Ratios outside of this range could cause crashes (when doing the layout calculation)
|
||||
output.primary_ratio = std.math.clamp(primary_ratio, 0.10, 0.90);
|
||||
|
|
@ -436,6 +447,24 @@ pub fn manage(output: *Output) void {
|
|||
// Don't allow less than 1 primary
|
||||
output.primary_count = @max(1, primary_count);
|
||||
}
|
||||
if (output.pending_manage.tags) |new_tags| {
|
||||
// Save current layout for the old tagmask
|
||||
output.tag_layout_overrides.put(utils.allocator, output.tags, .{
|
||||
.primary_count = output.primary_count,
|
||||
.primary_ratio = output.primary_ratio,
|
||||
}) catch @panic("Out of memory");
|
||||
|
||||
// Restore layout for the new tagmask, or fall back to config defaults
|
||||
if (output.tag_layout_overrides.get(new_tags)) |tag_layout_override| {
|
||||
output.primary_count = tag_layout_override.primary_count;
|
||||
output.primary_ratio = tag_layout_override.primary_ratio;
|
||||
} else {
|
||||
output.primary_count = output.context.config.primary_count;
|
||||
output.primary_ratio = output.context.config.primary_ratio;
|
||||
}
|
||||
|
||||
output.tags = new_tags;
|
||||
}
|
||||
|
||||
// Calculate layout before managing windows
|
||||
output.calculatePrimaryStackLayout();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue