hyprland: dispatch windows by address selector
This commit is contained in:
@@ -87,6 +87,13 @@ local function exec(command)
|
|||||||
return hl.dsp.exec_cmd(command)
|
return hl.dsp.exec_cmd(command)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function window_selector(window)
|
||||||
|
if not window or not window.address then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
return "address:" .. tostring(window.address)
|
||||||
|
end
|
||||||
|
|
||||||
local function hyprexpo(action)
|
local function hyprexpo(action)
|
||||||
return function()
|
return function()
|
||||||
if hl.plugin and hl.plugin.hyprexpo and hl.plugin.hyprexpo.expo then
|
if hl.plugin and hl.plugin.hyprexpo and hl.plugin.hyprexpo.expo then
|
||||||
@@ -458,9 +465,14 @@ local function focus_previous_workspace_for_monitor()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function move_window_to_workspace(workspace_id, follow, window)
|
local function move_window_to_workspace(workspace_id, follow, window)
|
||||||
hl.dsp.window.move({ workspace = tostring(workspace_id), follow = follow, window = window })()
|
local target_window = window or hl.get_active_window()
|
||||||
|
local target_selector = window_selector(target_window)
|
||||||
|
hl.dsp.window.move({ workspace = tostring(workspace_id), follow = false, window = target_selector })()
|
||||||
if follow then
|
if follow then
|
||||||
focus_workspace(workspace_id)
|
focus_workspace(workspace_id)
|
||||||
|
if target_selector then
|
||||||
|
hl.dsp.focus({ window = target_selector })()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -543,7 +555,7 @@ local function move_window_to_monitor(direction, follow)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local original_monitor = hl.get_active_monitor()
|
local original_monitor = hl.get_active_monitor()
|
||||||
hl.dsp.window.move({ monitor = direction, follow = follow, window = window })()
|
hl.dsp.window.move({ monitor = direction, follow = follow, window = window_selector(window) })()
|
||||||
|
|
||||||
if not follow and original_monitor then
|
if not follow and original_monitor then
|
||||||
hl.dsp.focus({ monitor = original_monitor })()
|
hl.dsp.focus({ monitor = original_monitor })()
|
||||||
@@ -707,15 +719,16 @@ local function apply_scratchpad_geometry(name, window, target_monitor)
|
|||||||
x = monitor.x + math.floor((monitor.width - width) / 2)
|
x = monitor.x + math.floor((monitor.width - width) / 2)
|
||||||
y = monitor.y + scratchpad_top_margin
|
y = monitor.y + scratchpad_top_margin
|
||||||
end
|
end
|
||||||
|
local selector = window_selector(window)
|
||||||
|
|
||||||
hl.dsp.window.float({ action = "enable", window = window })()
|
hl.dsp.window.float({ action = "enable", window = selector })()
|
||||||
hl.dsp.window.tag({ tag = "+scratchpad", window = window })()
|
hl.dsp.window.tag({ tag = "+scratchpad", window = selector })()
|
||||||
hl.dsp.window.tag({ tag = "+scratchpad-" .. name, window = window })()
|
hl.dsp.window.tag({ tag = "+scratchpad-" .. name, window = selector })()
|
||||||
hl.dsp.window.resize({ x = width, y = height, relative = false, window = window })()
|
hl.dsp.window.resize({ x = width, y = height, relative = false, window = selector })()
|
||||||
hl.dsp.window.move({ x = x, y = y, relative = false, window = window })()
|
hl.dsp.window.move({ x = x, y = y, relative = false, window = selector })()
|
||||||
if def.dropdown then
|
if def.dropdown then
|
||||||
hl.dsp.window.set_prop({ prop = "border_size", value = "0", window = window })()
|
hl.dsp.window.set_prop({ prop = "border_size", value = "0", window = selector })()
|
||||||
hl.dsp.window.set_prop({ prop = "no_shadow", value = "1", window = window })()
|
hl.dsp.window.set_prop({ prop = "no_shadow", value = "1", window = selector })()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -738,7 +751,7 @@ local function show_scratchpad_window(name, window, workspace, target_monitor)
|
|||||||
|
|
||||||
remove_minimized_window(window)
|
remove_minimized_window(window)
|
||||||
move_window_to_workspace(workspace.id, false, window)
|
move_window_to_workspace(workspace.id, false, window)
|
||||||
hl.dsp.focus({ window = window })()
|
hl.dsp.focus({ window = window_selector(window) })()
|
||||||
schedule_scratchpad_geometry(name, window, target_monitor or hl.get_active_monitor())
|
schedule_scratchpad_geometry(name, window, target_monitor or hl.get_active_monitor())
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -824,29 +837,29 @@ local function activate_window_picker_candidate(index)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if mode == "go" then
|
if mode == "go" then
|
||||||
hl.dsp.focus({ window = window })()
|
hl.dsp.focus({ window = window_selector(window) })()
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local workspace = active_workspace()
|
local workspace = active_workspace()
|
||||||
if mode == "bring" and workspace then
|
if mode == "bring" and workspace then
|
||||||
move_window_to_workspace(workspace.id, false, window)
|
move_window_to_workspace(workspace.id, false, window)
|
||||||
hl.dsp.focus({ window = window })()
|
hl.dsp.focus({ window = window_selector(window) })()
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if mode == "minimized" and workspace then
|
if mode == "minimized" and workspace then
|
||||||
remove_minimized_window(window)
|
remove_minimized_window(window)
|
||||||
restore_minimized_window(window, workspace)
|
restore_minimized_window(window, workspace)
|
||||||
hl.dsp.focus({ window = window })()
|
hl.dsp.focus({ window = window_selector(window) })()
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if mode == "replace" then
|
if mode == "replace" then
|
||||||
local focused = hl.get_active_window()
|
local focused = hl.get_active_window()
|
||||||
if focused and focused ~= window then
|
if focused and focused ~= window then
|
||||||
hl.dsp.window.swap({ target = window, window = focused })()
|
hl.dsp.window.swap({ target = window_selector(window), window = window_selector(focused) })()
|
||||||
hl.dsp.focus({ window = window })()
|
hl.dsp.focus({ window = window_selector(window) })()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -943,7 +956,7 @@ local function focus_next_class()
|
|||||||
local next_class = classes[(current_index % #classes) + 1]
|
local next_class = classes[(current_index % #classes) + 1]
|
||||||
local target = first_by_class[next_class]
|
local target = first_by_class[next_class]
|
||||||
if target then
|
if target then
|
||||||
hl.dsp.focus({ window = target })()
|
hl.dsp.focus({ window = window_selector(target) })()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -982,7 +995,7 @@ local function raise_or_spawn(class_fragment, command)
|
|||||||
local fragment = string.lower(class_fragment)
|
local fragment = string.lower(class_fragment)
|
||||||
for _, window in ipairs(hl.get_windows()) do
|
for _, window in ipairs(hl.get_windows()) do
|
||||||
if is_normal_window(window) and window.class and string.find(string.lower(window.class), fragment, 1, true) then
|
if is_normal_window(window) and window.class and string.find(string.lower(window.class), fragment, 1, true) then
|
||||||
hl.dsp.focus({ window = window })()
|
hl.dsp.focus({ window = window_selector(window) })()
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -1012,7 +1025,7 @@ local function restore_last_minimized()
|
|||||||
local window = table.remove(minimized_windows)
|
local window = table.remove(minimized_windows)
|
||||||
if window and window.address and is_minimized_window(window) then
|
if window and window.address and is_minimized_window(window) then
|
||||||
restore_minimized_window(window, workspace)
|
restore_minimized_window(window, workspace)
|
||||||
hl.dsp.focus({ window = window })()
|
hl.dsp.focus({ window = window_selector(window) })()
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user