More scratchpad fixes (#109)

* :reset() calls :abort() anyways

* This is no longer needed

* Reduce code duplication

* A more sane name for 'current_tag_on_toggled_scratchpad'

* Don't redefine the functions on every call

* Set stickly to false

* Fix client turning on despite already being on when sticky = true

* Don't set sticky to false when the animation starts, otherwise the client in some cases will immediately disappear

* Set client.sticky = false in helpers.client.turn_off instead

* Remove unused parameter

* Better comment

* Only turn off the client when both animations have ended + stop calling :reset() on the animations

* Correctly animate non floating clients

* Fix scratchpad animations for setups with more than 1 screen

* Try to fix turn off when using multiple screens
This commit is contained in:
Kasper 2021-09-14 03:22:34 +03:00 committed by GitHub
parent d2e834ae9e
commit 7277f57730
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 145 additions and 125 deletions

View File

@ -18,6 +18,7 @@ function _client.turn_off(c, current_tag)
end
end
c:tags(ctags)
c.sticky = false
end
--- Turn on passed client (add current tag to window's tags)

View File

@ -64,9 +64,8 @@ function Scratchpad:apply(c)
end
end
--- Turns the scratchpad on
function Scratchpad:turn_on()
local function animate(c, anim, axis)
--- The turn on animation
local function animate_turn_on(self, c, anim, axis)
-- Check for the following scenerio:
-- Toggle on scratchpad at tag 1
-- Toggle on scratchpad at tag 2
@ -102,10 +101,11 @@ function Scratchpad:turn_on()
self.in_anim = false
anim:unsubscribe()
anim.ended:unsubscribe()
anim:reset()
end)
end
end
--- Turns the scratchpad on
function Scratchpad:turn_on()
local c = self:find()[1]
local anim_x = self.rubato.x
local anim_y = self.rubato.y
@ -124,10 +124,10 @@ function Scratchpad:turn_on()
c.sticky = self.sticky
if anim_x then
animate(c, anim_x, "x")
animate_turn_on(self, c, anim_x, "x")
end
if anim_y then
animate(c, anim_y, "y")
animate_turn_on(self, c, anim_y, "y")
end
helpers.client.turn_on(c)
@ -166,10 +166,10 @@ function Scratchpad:turn_on()
c:activate({})
if anim_x then
animate(c, anim_x, "x")
animate_turn_on(self, c, anim_x, "x")
end
if anim_y then
animate(c, anim_y, "y")
animate_turn_on(self, c, anim_y, "y")
end
self:emit_signal("inital_apply", c)
@ -191,10 +191,10 @@ function Scratchpad:turn_on()
if helpers.client.is_child_of(c1, pid) then
self:apply(c1)
if anim_x then
animate(c1, anim_x, "x")
animate_turn_on(self, c1, anim_x, "x")
end
if anim_y then
animate(c1, anim_y, "y")
animate_turn_on(self, c1, anim_y, "y")
end
self:emit_signal("inital_apply", c1)
client.disconnect_signal("manage", inital_apply)
@ -205,16 +205,54 @@ function Scratchpad:turn_on()
end
end
--- Turns the scratchpad off
function Scratchpad:turn_off()
local c = self:find()[1]
if c and not self.in_anim then
local function animate(anim, initial_pos, axis)
local current_tag_on_toggled_scratchpad = c.screen.selected_tag
--- Called when the turn off animation has ended
local function on_animate_turn_off_end(self, c, anim, tag, turn_off_on_end)
anim:unsubscribe()
anim.ended:unsubscribe()
if turn_off_on_end then
-- When toggling off a scratchpad that's present on multiple tags
-- depsite still being unminizmied on the other tags it will become invisible
-- as it's position could be outside the screen from the animation
c:geometry({
x = self.geometry.x + c.screen.geometry.x,
y = self.geometry.y + c.screen.geometry.y,
width = self.geometry.width,
height = self.geometry.height,
})
helpers.client.turn_off(c, tag)
self:emit_signal("turn_off", c)
self.in_anim = false
end
end
--- The turn off animation
local function animate_turn_off(self, c, anim, axis, turn_off_on_end)
local screen_on_toggled_scratchpad = c.screen
local tag_on_toggled_scratchpad = screen_on_toggled_scratchpad.selected_tag
if c.floating == false then
-- Save the client geometry before floating it
local non_floating_x = c.x
local non_floating_y = c.y
local non_floating_width = c.width
local non_floating_height = c.height
-- Can't animate non floating clients
c.floating = true
-- Set the client geometry back to what it was before floating it
c:geometry({
x = non_floating_x,
y = non_floating_y,
width = non_floating_width,
height = non_floating_height,
})
end
if axis == "x" then
anim.pos = c.x
else
@ -237,59 +275,36 @@ function Scratchpad:turn_off()
-- Toggle on scratchpad at tag 2
-- Toggle off scratchpad at tag 1
-- Switch to tag 2
-- The client will remain on tag 1
-- The client will be removed from tag 2
if
c.screen.selected_tag ~= current_tag_on_toggled_scratchpad
then
self.in_anim = false
anim:abort()
anim:reset()
anim:unsubscribe()
anim.ended:unsubscribe()
if axis == "x" then
anim.pos = self.geometry.x
else
anim.pos = self.geometry.y
end
helpers.client.turn_off(
c,
current_tag_on_toggled_scratchpad
)
self:apply(c)
self:emit_signal("turn_off", c)
-- Outcome: The client will remain on tag 1 and will instead be removed from tag 2
if screen_on_toggled_scratchpad.selected_tag ~= tag_on_toggled_scratchpad then
on_animate_turn_off_end(self, c, anim, tag_on_toggled_scratchpad, true)
end
end)
anim:set(anim:initial())
anim.ended:subscribe(function()
self.in_anim = false
anim:reset()
anim:unsubscribe()
anim.ended:unsubscribe()
helpers.client.turn_off(c)
-- When toggling off a scratchpad that's present on multiple tags
-- depsite still being unminizmied on the other tags it will become invisible
-- as it's position could be outside the screen from the animation
self:apply(c)
self:emit_signal("turn_off", c)
on_animate_turn_off_end(self, c, anim, nil, turn_off_on_end)
end)
end
c.sticky = false
end
--- Turns the scratchpad off
function Scratchpad:turn_off()
local c = self:find()[1]
if c and not self.in_anim then
-- Get the tweens
local anim_x = self.rubato.x
local anim_y = self.rubato.y
local anim_x_duration = (anim_x and anim_x.duration) or 0
local anim_y_duration = (anim_y and anim_y.duration) or 0
local turn_off_on_end = (anim_x_duration >= anim_y_duration) and true or false
if anim_x then
animate(anim_x, self.geometry.x, "x")
animate_turn_off(self, c, anim_x, "x", turn_off_on_end)
end
if anim_y then
animate(anim_y, self.geometry.y, "y")
animate_turn_off(self, c, anim_y, "y", not turn_off_on_end)
end
if not anim_x and not anim_y then
@ -305,6 +320,9 @@ function Scratchpad:toggle()
local c = self:find()[1]
if self.dont_focus_before_close then
if c then
if c.sticky and #c:tags() > 0 then
is_turn_off = true
else
local current_tag = c.screen.selected_tag
for k, tag in pairs(c:tags()) do
if tag == current_tag then
@ -315,6 +333,7 @@ function Scratchpad:toggle()
end
end
end
end
else
is_turn_off = client.focus
and awful.rules.match(client.focus, self.rule)