break;
case PropertyNotify:
- if (ev.xproperty.atom == xa[XA_VT_SELECTION]
- && ev.xproperty.state == PropertyNewValue)
- selection_property (ev.xproperty.window, ev.xproperty.atom);
+ if (!HOOK_INVOKE ((this, HOOK_PROPERTY_NOTIFY, DT_XEVENT, &ev, DT_END)))
+ if (ev.xproperty.atom == xa[XA_VT_SELECTION]
+ && ev.xproperty.state == PropertyNewValue)
+ selection_property (ev.xproperty.window, ev.xproperty.atom);
break;
def (CLIENT_MESSAGE)
def (WM_DELETE_WINDOW)
def (WM_PROTOCOLS)
+ def (PROPERTY_NOTIFY)
def (CUSTOM_REND) // hovering over custom rendition, generate enter/leave maybe?
0, $self->{tabheight},
$self->width, $self->height - $self->{tabheight}
);
+}
+
+sub copy_properties {
+ my ($self) = @_;
+ my $tab = $self->{cur};
my $wm_normal_hints = $self->XInternAtom ("WM_NORMAL_HINTS");
+ my %our_props = map +($_ => undef), $self->XListProperties ($self->parent);
+
for my $atom ($tab->XListProperties ($tab->parent)) {
my ($type, $format, $items) = $self->XGetWindowProperty ($tab->parent, $atom);
+
+ delete $our_props{$atom};
if ($atom == $wm_normal_hints) {
my (@hints) = unpack "l!*", $items;
$self->XChangeWindowProperty ($self->parent, $atom, $type, $format, $items);
}
- $self->refresh;
+ $self->XDeleteProperty ($self->parent, $_) for keys %our_props;
}
sub make_current {
$self->{cur} = $tab;
$self->configure;
+ $self->copy_properties;
$tab->focus_in;
$tab->XMapWindow ($tab->parent);
delete $tab->{activity};
sub tab_start {
my ($self, $tab) = @_;
+ $tab->XChangeInput ($tab->parent, urxvt::PropertyChangeMask);
+
push @{ $self->{tabs} }, $tab;
# $tab->{name} ||= scalar @{ $self->{tabs} };
()
}
+sub tab_property_notify {
+ my ($self, $tab, $event) = @_;
+
+ $self->copy_properties
+ if $event->{window} == $tab->parent;
+
+ ()
+}
+
sub tab_activity {
my ($self, $tab) = @_;
# simply proxies all interesting calls back to the tabbed class.
{
- for my $hook qw(start destroy key_press) {
+ for my $hook qw(start destroy key_press property_notify) {
eval qq{
sub on_$hook {
my \$parent = \$_[0]{term}{parent}
break;
+ case PropertyNotify:
+ setuv (window, xe->xproperty.window);
+ setuv (atom, xe->xproperty.atom);
+ setuv (time, xe->xproperty.time);
+ setiv (state, xe->xproperty.state);
+ break;
+
case ClientMessage:
setuv (window, xe->xclient.window);
setuv (message_type, xe->xclient.message_type);
setuv (l2, xe->xclient.data.l[2]);
setuv (l3, xe->xclient.data.l[3]);
setuv (l4, xe->xclient.data.l[4]);
+ break;
}
XPUSHs (sv_2mortal (newRV_noinc ((SV *)hv)));
void
XMoveResizeWindow (rxvt_term *term, Window window, int x, int y, unsigned int width, unsigned int height)
- C_ARGS: term->display->display, (Window)window, x, y, width, height
+ C_ARGS: term->display->display, window, x, y, width, height
+
+void
+rxvt_term::XChangeInput (Window window, U32 add_events, U32 del_events = 0)
+ CODE:
+{
+ XWindowAttributes attr;
+ XGetWindowAttributes (THIS->display->display, window, &attr);
+ XSelectInput (THIS->display->display, window, attr.your_event_mask | add_events & ~del_events);
+}
void
rxvt_term::XTranslateCoordinates (Window src, Window dst, int x, int y)
=item on_configure_notify $term, $event
+=item on_property_notify $term, $event
+
=item on_key_press $term, $event, $keysym, $octets
=item on_key_release $term, $event, $keysym