hyprland: add quadrants layout
This commit is contained in:
@@ -2,18 +2,63 @@ local M = {}
|
|||||||
|
|
||||||
function M.setup(ctx)
|
function M.setup(ctx)
|
||||||
local _ENV = ctx
|
local _ENV = ctx
|
||||||
|
local configure_quadrants_master
|
||||||
|
local focus_workspace
|
||||||
|
local move_window_to_workspace
|
||||||
|
|
||||||
local function is_nstack_layout(layout)
|
local function is_nstack_layout(layout)
|
||||||
return layout == columns_layout or layout == grid_layout
|
return layout == columns_layout or layout == grid_layout
|
||||||
end
|
end
|
||||||
|
|
||||||
local function hyprland_layout(layout)
|
local function hyprland_layout(layout)
|
||||||
if layout == grid_layout then
|
if layout == quadrants_layout then
|
||||||
|
return large_main_layout
|
||||||
|
elseif layout == grid_layout then
|
||||||
return columns_layout
|
return columns_layout
|
||||||
end
|
end
|
||||||
return layout
|
return layout
|
||||||
end
|
end
|
||||||
|
|
||||||
|
configure_quadrants_master = function()
|
||||||
|
if quadrants_arranging or current_layout ~= quadrants_layout then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local workspace = active_workspace()
|
||||||
|
if not is_normal_workspace(workspace) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local windows = tiled_windows(workspace)
|
||||||
|
if #windows == 0 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
sort_windows_by_visual_position(windows)
|
||||||
|
|
||||||
|
quadrants_arranging = true
|
||||||
|
dispatch(hl.dsp.focus({ window = window_selector(windows[1]) }))
|
||||||
|
dispatch(hl.dsp.layout("orientationleft"))
|
||||||
|
dispatch(hl.dsp.layout("mfact exact 0.5"))
|
||||||
|
|
||||||
|
for _ = 1, #windows do
|
||||||
|
dispatch(hl.dsp.layout("removemaster"))
|
||||||
|
end
|
||||||
|
|
||||||
|
if #windows >= 3 then
|
||||||
|
dispatch(hl.dsp.layout("addmaster"))
|
||||||
|
end
|
||||||
|
|
||||||
|
quadrants_arranging = false
|
||||||
|
focus_workspace(workspace.id)
|
||||||
|
end
|
||||||
|
|
||||||
local function update_nstack_count()
|
local function update_nstack_count()
|
||||||
|
if current_layout == quadrants_layout then
|
||||||
|
configure_quadrants_master()
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
if not enable_nstack or not is_nstack_layout(current_layout) then
|
if not enable_nstack or not is_nstack_layout(current_layout) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@@ -93,12 +138,16 @@ function M.setup(ctx)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function set_layout(layout)
|
local function set_layout(layout)
|
||||||
|
local workspace = active_workspace()
|
||||||
workspace_layouts[workspace_key()] = layout
|
workspace_layouts[workspace_key()] = layout
|
||||||
current_layout = layout
|
current_layout = layout
|
||||||
hl.config({ general = { layout = hyprland_layout(layout) } })
|
hl.config({ general = { layout = hyprland_layout(layout) } })
|
||||||
write_layout_state()
|
write_layout_state()
|
||||||
|
|
||||||
if is_nstack_layout(layout) then
|
if layout == quadrants_layout then
|
||||||
|
dismiss_monocle_notice()
|
||||||
|
schedule_nstack_count_update()
|
||||||
|
elseif is_nstack_layout(layout) then
|
||||||
dismiss_monocle_notice()
|
dismiss_monocle_notice()
|
||||||
schedule_nstack_count_update()
|
schedule_nstack_count_update()
|
||||||
else
|
else
|
||||||
@@ -127,7 +176,10 @@ function M.setup(ctx)
|
|||||||
hl.config({ general = { layout = hyprland_layout(current_layout) } })
|
hl.config({ general = { layout = hyprland_layout(current_layout) } })
|
||||||
write_layout_state()
|
write_layout_state()
|
||||||
|
|
||||||
if is_nstack_layout(current_layout) then
|
if current_layout == quadrants_layout then
|
||||||
|
dismiss_monocle_notice()
|
||||||
|
schedule_nstack_count_update()
|
||||||
|
elseif is_nstack_layout(current_layout) then
|
||||||
dismiss_monocle_notice()
|
dismiss_monocle_notice()
|
||||||
schedule_nstack_count_update()
|
schedule_nstack_count_update()
|
||||||
else
|
else
|
||||||
@@ -210,11 +262,11 @@ function M.setup(ctx)
|
|||||||
dispatch(hl.dsp.window.swap({ direction = direction }))
|
dispatch(hl.dsp.window.swap({ direction = direction }))
|
||||||
end
|
end
|
||||||
|
|
||||||
local function focus_workspace(workspace_id)
|
focus_workspace = function(workspace_id)
|
||||||
dispatch(hl.dsp.focus({ workspace = tostring(workspace_id), on_current_monitor = true }))
|
dispatch(hl.dsp.focus({ workspace = tostring(workspace_id), on_current_monitor = true }))
|
||||||
end
|
end
|
||||||
|
|
||||||
local function move_window_to_workspace(workspace_id, follow, window)
|
move_window_to_workspace = function(workspace_id, follow, window)
|
||||||
local target_window = window or hl.get_active_window()
|
local target_window = window or hl.get_active_window()
|
||||||
local target_selector = window_selector(target_window)
|
local target_selector = window_selector(target_window)
|
||||||
dispatch(hl.dsp.window.move({ workspace = tostring(workspace_id), follow = false, window = target_selector }))
|
dispatch(hl.dsp.window.move({ workspace = tostring(workspace_id), follow = false, window = target_selector }))
|
||||||
@@ -556,6 +608,7 @@ function M.setup(ctx)
|
|||||||
|
|
||||||
ctx.is_nstack_layout = is_nstack_layout
|
ctx.is_nstack_layout = is_nstack_layout
|
||||||
ctx.hyprland_layout = hyprland_layout
|
ctx.hyprland_layout = hyprland_layout
|
||||||
|
ctx.configure_quadrants_master = configure_quadrants_master
|
||||||
ctx.update_nstack_count = update_nstack_count
|
ctx.update_nstack_count = update_nstack_count
|
||||||
ctx.schedule_nstack_count_update = schedule_nstack_count_update
|
ctx.schedule_nstack_count_update = schedule_nstack_count_update
|
||||||
ctx.dismiss_monocle_notice = dismiss_monocle_notice
|
ctx.dismiss_monocle_notice = dismiss_monocle_notice
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ local shell_ui_command = "hypr_shell_ui"
|
|||||||
local columns_layout = "nStack"
|
local columns_layout = "nStack"
|
||||||
local large_main_layout = "master"
|
local large_main_layout = "master"
|
||||||
local grid_layout = "grid"
|
local grid_layout = "grid"
|
||||||
|
local quadrants_layout = "quadrants"
|
||||||
local monocle_layout = "monocle"
|
local monocle_layout = "monocle"
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -33,11 +34,13 @@ return {
|
|||||||
columns_layout = columns_layout,
|
columns_layout = columns_layout,
|
||||||
large_main_layout = large_main_layout,
|
large_main_layout = large_main_layout,
|
||||||
grid_layout = grid_layout,
|
grid_layout = grid_layout,
|
||||||
|
quadrants_layout = quadrants_layout,
|
||||||
monocle_layout = monocle_layout,
|
monocle_layout = monocle_layout,
|
||||||
layout_cycle = { columns_layout, large_main_layout, grid_layout },
|
layout_cycle = { columns_layout, large_main_layout, quadrants_layout, grid_layout },
|
||||||
layout_names = {
|
layout_names = {
|
||||||
[columns_layout] = "Columns",
|
[columns_layout] = "Columns",
|
||||||
[large_main_layout] = "Large main",
|
[large_main_layout] = "Large main",
|
||||||
|
[quadrants_layout] = "Quadrants",
|
||||||
[grid_layout] = "Grid",
|
[grid_layout] = "Grid",
|
||||||
[monocle_layout] = "Monocle",
|
[monocle_layout] = "Monocle",
|
||||||
},
|
},
|
||||||
@@ -56,6 +59,7 @@ return {
|
|||||||
workspace_layouts = {},
|
workspace_layouts = {},
|
||||||
minimized_windows = {},
|
minimized_windows = {},
|
||||||
tabbed_workspace_groups = {},
|
tabbed_workspace_groups = {},
|
||||||
|
quadrants_arranging = false,
|
||||||
window_picker_mode = nil,
|
window_picker_mode = nil,
|
||||||
window_picker_candidates = {},
|
window_picker_candidates = {},
|
||||||
stack_update_timer = nil,
|
stack_update_timer = nil,
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ ensure_hyprland_instance
|
|||||||
layouts=(
|
layouts=(
|
||||||
"nStack Columns"
|
"nStack Columns"
|
||||||
"master Large main"
|
"master Large main"
|
||||||
|
"quadrants Quadrants"
|
||||||
"grid Grid"
|
"grid Grid"
|
||||||
"monocle Monocle"
|
"monocle Monocle"
|
||||||
)
|
)
|
||||||
@@ -64,7 +65,7 @@ for entry in "${layouts[@]}"; do
|
|||||||
label="${entry#*$'\t'}"
|
label="${entry#*$'\t'}"
|
||||||
|
|
||||||
if [[ "$label" == "$selection" ]]; then
|
if [[ "$label" == "$selection" ]]; then
|
||||||
hyprctl dispatch "_G.im_hyprland_set_layout(\"$layout\")" >/dev/null
|
hyprctl -q eval "_G.im_hyprland_set_layout(\"$layout\")"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|||||||
Reference in New Issue
Block a user