repo: rxvt-unicode-sixel action: commit revision: path_from: revision_from: 10e82b6331669e6c03b3e11fd7adc6755b6ae5db: path_to: revision_to:
commit 10e82b6331669e6c03b3e11fd7adc6755b6ae5db Author: Marc LehmannDate: Tue Jun 5 11:00:40 2012 +0000 *** empty log message *** diff --git a/src/command.C b/src/command.C
--- a/src/command.C
+++ b/src/command.C
@@ -1463,11 +1463,19 @@ rxvt_term::x_cb (XEvent &ev)
while (XCheckTypedWindowEvent (dpy, ev.xconfigure.window, ConfigureNotify, &ev))
;
+ bool want_position_change = SHOULD_INVOKE (HOOK_POSITION_CHANGE);
+
#ifdef HAVE_BG_PIXMAP
- bool moved = false;
if (bg_window_position_sensitive ())
+ want_position_change = true;
+#endif
+
+ bool moved = false;
+
+ if (want_position_change)
{
int x, y;
+
if (ev.xconfigure.send_event)
{
x = ev.xconfigure.x;
@@ -1476,11 +1484,17 @@ rxvt_term::x_cb (XEvent &ev)
else
get_window_origin (x, y);
+ if (x != parent_x || y != parent_y)
+ {
+ HOOK_INVOKE ((this, HOOK_POSITION_CHANGE, DT_INT, x, DT_INT, y, DT_END));
+ parent_x = x;
+ parent_y = y;
+ }
+
if (bg_set_position (x, y)
|| !(bg_flags & BG_IS_VALID))
moved = true;
}
-#endif
if (szHint.width != ev.xconfigure.width || szHint.height != ev.xconfigure.height)
{
diff --git a/src/hookinc.h b/src/hookinc.h
--- a/src/hookinc.h +++ b/src/hookinc.h @@ -45,6 +45,8 @@ def (WM_PROTOCOLS) def (PROPERTY_NOTIFY) def (RESIZE_ALL_WINDOWS) + def (SIZE_CHANGE) + def (POSITION_CHANGE) def (XIM_PREEDIT_START) def (XIM_PREEDIT_DONE) diff --git a/src/main.C b/src/main.C
--- a/src/main.C
+++ b/src/main.C
@@ -1080,6 +1080,8 @@ rxvt_term::resize_all_windows (unsigned int newwidth, unsigned int newheight, in
window_vt_x, window_vt_y,
vt_width, vt_height);
+ HOOK_INVOKE ((this, HOOK_SIZE_CHANGE, DT_INT, newwidth, DT_INT, newheight, DT_END));
+
#ifdef HAVE_BG_PIXMAP
if (bg_window_size_sensitive ())
update_background ();
diff --git a/src/perl/background b/src/perl/background
--- a/src/perl/background
+++ b/src/perl/background
@@ -1,6 +1,6 @@
#! perl
-our $EXPR = 'resize (blur (load "/root/pix/das_fette_schwein.jpg", 1 + (counter 1) % 10, 10), w, h)';
+our $EXPR = 'move load "/root/pix/das_fette_schwein.jpg", &x, &y';
#$EXPR = 'blur root, 10, 10'
#$EXPR = 'blur move (root, -x, -y), 5, 5'
#resize load "/root/pix/das_fette_schwein.jpg", w, h
@@ -20,21 +20,21 @@ use Safe;
*repeat_pad = \&urxvt::RepeatPad;
*repeat_mirror = \&urxvt::RepeatReflect;
- sub load {
+ sub load($) {
my ($path) = @_;
$new->{load}{$path} = $old->{load}{$path} || $self->new_img_from_file ($path);
}
- sub root {
+ sub root() {
die "root op not supported, exg, we need you";
}
- sub resize {
+ sub resize($$$) {
$_[0]->scale ($_[1], $_[2])
}
- sub move {
+ sub move($$$) {
# TODO: must be simpler
$_[0]->transform ($_[0]->w, $_[0]->h, $_[1],
1, 0, -$_[2],
@@ -43,11 +43,11 @@ use Safe;
)
}
- sub rotate {
+ sub rotate($$$$) {
$_[0]->rotate ($_[0], $_[1], $_[2], $_[3] * (3.14159265 / 180))
}
- sub blur {
+ sub blur($$$) {
my ($img, $rh, $rv) = @_;
$img = $img->clone;
@@ -55,7 +55,7 @@ use Safe;
$img
}
- sub contrast {
+ sub contrast($$;$$;$) {
my ($img, $r, $g, $b, $a) = @_;
($g, $b) = ($r, $r) if @_ < 4;
$a = 1 if @_ < 5;
@@ -64,7 +64,7 @@ use Safe;
$img
}
- sub brightness {
+ sub brightness($$;$$;$) {
my ($img, $r, $g, $b, $a) = @_;
($g, $b) = ($r, $r) if @_ < 4;
$a = 1 if @_ < 5;
@@ -73,17 +73,17 @@ use Safe;
$img
}
- sub x { $new->{position_sensitive} = 1; $x }
- sub y { $new->{position_sensitive} = 1; $y }
- sub w { $new->{size_sensitive} = 1; $w }
- sub h { $new->{size_sensitive} = 1; $h }
- sub now { urxvt::NOW }
+ sub x() { $new->{position_sensitive} = 1; $x }
+ sub y() { $new->{position_sensitive} = 1; $y }
+ sub w() { $new->{size_sensitive} = 1; $w }
+ sub h() { $new->{size_sensitive} = 1; $h }
+ sub now() { urxvt::NOW }
- sub again {
+ sub again($) {
$new->{again} = $_[0];
}
- sub counter {
+ sub counter($) {
$new->{again} = $_[0];
$self->{counter}++ + 0
}
@@ -119,11 +119,27 @@ sub recalculate {
my $img = eval { $self->{expr}->() };
warn $@ if $@;#d#
+ my $repeat;
+
if (my $again = $state->{again}) {
- warn $again;#d#
+ $repeat = 1;
$state->{again} = urxvt::timer->new->after ($again)->cb (sub { $self->recalculate });
}
+ if (delete $state->{position_sensitive}) {
+ $repeat = 1;
+ $self->enable (position_change => sub { $_[0]->recalculate });
+ } else {
+ $self->disable ("position_change");
+ }
+
+ if (delete $state->{size_sensitive}) {
+ $repeat = 1;
+ $self->enable (size_change => sub { $_[0]->recalculate });
+ } else {
+ $self->disable ("size_change");
+ }
+
# TODO: install handlers for geometry changes &c
warn $img;
diff --git a/src/rxvt.h b/src/rxvt.h
--- a/src/rxvt.h +++ b/src/rxvt.h @@ -1264,6 +1264,8 @@ struct rxvt_term : zero_initialized, rxvt_vars, rxvt_screen vectorallocated; // free these memory blocks with free() + int parent_x, parent_y; // parent window position relative to root, only updated on demand + char *locale; char charsets[4]; char *v_buffer; /* pointer to physical buffer */ diff --git a/src/rxvtperl.xs b/src/rxvtperl.xs
--- a/src/rxvtperl.xs
+++ b/src/rxvtperl.xs
@@ -980,7 +980,19 @@ rxvt_term::destroy ()
void
rxvt_term::set_should_invoke (int htype, int inc)
CODE:
- THIS->perl.should_invoke [htype] += inc;
+ uint8_t &count = THIS->perl.should_invoke [htype];
+ uint8_t prev = count;
+ count += inc;
+ if (!prev != !count)
+ {
+ // hook status changed, react
+ switch (htype)
+ {
+ case HOOK_POSITION_CHANGE:
+ if (count)
+ THIS->get_window_origin (THIS->parent_x, THIS->parent_y);
+ }
+ }
int
rxvt_term::grab_button (int button, U32 modifiers, Window window = THIS->vt)
@@ -1247,10 +1259,17 @@ rxvt_term::parent ()
OUTPUT:
RETVAL
-Window
-rxvt_term::vt ()
+int
+rxvt_term::parent_x ()
+ CODE:
+ RETVAL = THIS->parent_x;
+ OUTPUT:
+ RETVAL
+
+int
+rxvt_term::parent_y ()
CODE:
- RETVAL = THIS->vt;
+ RETVAL = THIS->parent_y;
OUTPUT:
RETVAL
@@ -1940,18 +1959,11 @@ rxvt_term::XTranslateCoordinates (Window src, Window dst, int x, int y)
void
rxvt_term::get_geometry ()
PPCODE:
- Window wdummy;
- int x, y;
- XWindowAttributes wattr;
- XGetWindowAttributes (THIS->dpy, THIS->parent, &wattr);
- XTranslateCoordinates (THIS->dpy, THIS->parent, wattr.root,
- -wattr.border_width, -wattr.border_width,
- &x, &y, &wdummy);
EXTEND (SP, 4);
- PUSHs (sv_2mortal (newSViv (x)));
- PUSHs (sv_2mortal (newSViv (y)));
- PUSHs (sv_2mortal (newSViv (wattr.width)));
- PUSHs (sv_2mortal (newSViv (wattr.height)));
+ PUSHs (sv_2mortal (newSViv (THIS->parent_x)));
+ PUSHs (sv_2mortal (newSViv (THIS->parent_y)));
+ PUSHs (sv_2mortal (newSViv (THIS->szHint.width)));
+ PUSHs (sv_2mortal (newSViv (THIS->szHint.height)));
#if HAVE_IMG
-----END OF PAGE-----