mirror of
https://github.com/gryf/tabbedalt.git
synced 2026-08-31 18:17:43 +02:00
Compare commits
4
Commits
57f5423dc4
...
1c3555956b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1c3555956b | ||
|
|
ea61d2bb5b | ||
|
|
4530aa33aa | ||
|
|
0940d0cf03 |
@@ -172,6 +172,12 @@
|
|||||||
# tab and disable its hooks
|
# tab and disable its hooks
|
||||||
# - update tab property notifications, don't update it too often, clean up X
|
# - update tab property notifications, don't update it too often, clean up X
|
||||||
# properties variables after use, update only changed X properties
|
# properties variables after use, update only changed X properties
|
||||||
|
#
|
||||||
|
# 2026-08-10 17:20:53
|
||||||
|
# - remove variables in copy_properties to free memory
|
||||||
|
# - call configure() every time on refresh
|
||||||
|
# - removed throttling to suppress tab property notifications, as they need to
|
||||||
|
# be applied as every call there is different atom to process.
|
||||||
|
|
||||||
use Scalar::Util;
|
use Scalar::Util;
|
||||||
|
|
||||||
@@ -285,8 +291,9 @@ sub refresh {
|
|||||||
$self->{tabheight} = $self->{_tabheight};
|
$self->{tabheight} = $self->{_tabheight};
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($old_tabheight != $self->{tabheight}) {
|
|
||||||
$self->configure;
|
$self->configure;
|
||||||
|
|
||||||
|
if ($old_tabheight != $self->{tabheight}) {
|
||||||
$self->copy_properties;
|
$self->copy_properties;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -414,8 +421,8 @@ sub copy_properties {
|
|||||||
my $current = delete $self->{current_properties};
|
my $current = delete $self->{current_properties};
|
||||||
|
|
||||||
# pass 1: copy over properties different or nonexisting
|
# pass 1: copy over properties different or nonexisting
|
||||||
for my $atom ($tab->XListProperties ($tab->parent)) {
|
for my $atom ($tab->XListProperties($tab->parent)) {
|
||||||
my ($type, $format, $items) = $self->XGetWindowProperty ($tab->parent, $atom);
|
my ($type, $format, $items) = $self->XGetWindowProperty($tab->parent, $atom);
|
||||||
|
|
||||||
# fix up size hints
|
# fix up size hints
|
||||||
if ($atom == $wm_normal_hints) {
|
if ($atom == $wm_normal_hints) {
|
||||||
@@ -427,22 +434,29 @@ sub copy_properties {
|
|||||||
$hints[$_] += $self->{tabheight} for (4, 6, 16);
|
$hints[$_] += $self->{tabheight} for (4, 6, 16);
|
||||||
|
|
||||||
$items = pack "l!*", @hints;
|
$items = pack "l!*", @hints;
|
||||||
|
undef @hints;
|
||||||
}
|
}
|
||||||
|
|
||||||
my $cur = delete $current->{$atom};
|
my $cur = delete $current->{$atom};
|
||||||
|
|
||||||
# update if changed, we assume empty items and zero type and format will not happen
|
# update if changed, we assume empty items and zero type and format will not happen
|
||||||
$self->XChangeProperty ($self->parent, $atom, $type, $format, $items)
|
$self->XChangeProperty($self->parent, $atom, $type, $format, $items)
|
||||||
if $cur->[0] != $type or $cur->[1] != $format or $cur->[2] ne $items;
|
if $cur->[0] != $type or $cur->[1] != $format or $cur->[2] ne $items;
|
||||||
|
|
||||||
$self->{current_properties}{$atom} = [$type, $format, $items];
|
$self->{current_properties}{$atom} = [$type, $format, $items];
|
||||||
|
|
||||||
undef $type;
|
undef $type;
|
||||||
undef $format;
|
undef $format;
|
||||||
undef $items;
|
undef $items;
|
||||||
|
undef $atom;
|
||||||
|
undef $cur;
|
||||||
}
|
}
|
||||||
|
|
||||||
# pass 2, delete all extraneous properties
|
# pass 2, delete all extraneous properties
|
||||||
$self->XDeleteProperty ($self->parent, $_) for keys %$current;
|
$self->XDeleteProperty ($self->parent, $_) for keys %$current;
|
||||||
|
|
||||||
|
undef $current;
|
||||||
|
undef $wm_normal_hints;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub make_current {
|
sub make_current {
|
||||||
@@ -807,14 +821,6 @@ sub tab_property_notify {
|
|||||||
return () unless $event->{window} == $tab->parent;
|
return () unless $event->{window} == $tab->parent;
|
||||||
return () unless $tab == $self->{cur};
|
return () unless $tab == $self->{cur};
|
||||||
|
|
||||||
# skip if called too often (within 0.1s)
|
|
||||||
my $now = urxvt::NOW;
|
|
||||||
my $last = $self->{last_property_update} // 0;
|
|
||||||
if ($now - $last < 0.1) {
|
|
||||||
return ();
|
|
||||||
}
|
|
||||||
$self->{last_property_update} = $now;
|
|
||||||
|
|
||||||
# update only the changed property instead of all properties
|
# update only the changed property instead of all properties
|
||||||
my $atom = $event->{atom};
|
my $atom = $event->{atom};
|
||||||
my ($type, $format, $items) = $self->XGetWindowProperty ($tab->parent, $atom);
|
my ($type, $format, $items) = $self->XGetWindowProperty ($tab->parent, $atom);
|
||||||
|
|||||||
Reference in New Issue
Block a user