Gtk2-CV
view release on metacpan or search on metacpan
lib/Gtk2/CV/ImageWindow.pm view on Meta::CPAN
if ($line->{event} eq "video-reconfig") {
$self->update_mpv_window;
}
}
}
} elsif (defined $len or $! != Errno::EAGAIN) {
return 0;
}
1
};
} else {
$@ = "mpv doesn't recognize this '$type' file";
# probably audio, or a real error
}
} else {
$@ = "unrecognized file format '$type'";
}
};#d#
warn "$@" if $@;#d#
if (!$image) {
warn "$@";
$type = "error";
$image = Gtk2::CV::require_image "error.png";
}
if ($image) {
$self->set_image ($image, $type);
$self->{path} = $path;
$self->set_title ("CV: $path");
} else {
$self->clear_image;
}
}
sub reload {
my ($self) = @_;
$self->load_image ($self->{path}) if defined $self->{path};
}
sub check_screen_size {
my ($self) = @_;
my ($left, $right, $top, $bottom) = @{ $self->{frame_extents} || [] };
my $sw = $self->{screen_width} - ($left + $right);
my $sh = $self->{screen_height} - ($top + $bottom);
if ($self->{sw} != $sw || $self->{sh} != $sh) {
($self->{sw}, $self->{sh}) = ($sw, $sh);
($self->{rsw}, $self->{rsh}) = ($sw, $sh);
$self->auto_resize if $self->{image};
}
}
sub update_properties {
my ($self) = @_;
(undef, undef, my @data) = $_[0]->{window}->property_get (
$_[0]{frame_extents_property},
Gtk2::Gdk::Atom->intern ("CARDINAL", 0),
0, 4*4, 0);
# left, right, top, bottom
$self->{frame_extents} = \@data;
$self->check_screen_size;
}
sub request_frame_extents {
my ($self) = @_;
return if $self->{frame_extents};
return unless Gtk2::CV::gdk_net_wm_supports $self->{request_frame_extents_property};
# TODO
# send clientmessage
}
sub do_realize {
my ($self) = @_;
$self->{window} = $self->window;
$self->{drag_gc} = Gtk2::Gdk::GC->new ($self->{window});
$self->{drag_gc}->set_function ('xor');
$self->{drag_gc}->set_rgb_foreground (new Gtk2::Gdk::Color 0xffff, 0xffff, 0xffff);
$self->{drag_gc}->set_line_attributes (1, 'solid', 'round', 'miter');
$self->{screen_width} = $self->{window}->get_screen->get_width;
$self->{screen_height} = $self->{window}->get_screen->get_height;
$self->realize_image;
$self->request_frame_extents;
$self->check_screen_size;
0
}
sub draw_drag_rect {
my ($self, $area) = @_;
my $d = $self->{drag_info}
or return;
my $x1 = min @$d[0,2];
my $y1 = min @$d[1,3];
my $x2 = max @$d[0,2];
my $y2 = max @$d[1,3];
$_ = $self->{sx} * int .5 + $_ / $self->{sx} for ($x1, $x2);
$_ = $self->{sy} * int .5 + $_ / $self->{sy} for ($y1, $y2);
$self->{drag_gc}->set_clip_rectangle ($area)
if $area;
lib/Gtk2/CV/ImageWindow.pm view on Meta::CPAN
return unless $self->{window};
my $w = max (16, min ($self->{rsw}, $w));
my $h = max (16, min ($self->{rsh}, $h));
$self->{dw} = $w;
$self->{dh} = $h;
if ($Gtk2::CV::ImageWindow::SET_ASPECT) {
Gtk2::CV::gdk_window_clear_hints ($self->{window});
$self->{window}->get_screen->get_display->flush;
}
$self->auto_position ($w, $h);
$self->{window}->resize ($w, $h);
if ($Gtk2::CV::ImageWindow::SET_ASPECT) {
my $minaspect = $w / $h;
my $maxaspect = $w / $h;
my $hints = new Gtk2::Gdk::Geometry;
$hints->max_aspect ($maxaspect);
$hints->min_aspect ($minaspect);
$self->set_geometry_hints ($self, $hints, [qw/aspect/]);
$self->{window}->get_screen->get_display->flush;
}
$self->redraw;
}
=item $img->uncrop
Undo any cropping; Show the full image.
=cut
sub uncrop {
my ($self) = @_;
$self->set_subimage ($self->{image});
}
=item $img->crop ($x1, $y1, $x2, $y2)
Crop the image to the specified rectangle.
=cut
sub crop {
my ($self, $x1, $y1, $x2, $y2) = @_;
my $w = max ($x2 - $x1, 1);
my $h = max ($y2 - $y1, 1);
$self->set_subimage (
$self->{subimage}->new_subpixbuf ($x1, $y1, $w, $h)
);
}
sub update_mpv_window {
my ($self) = @_;
# force a resize of the mpv window, otherwise it doesn't receive
# a configureevent :/
$self->{mpv_window}->window->resize (1, 1),
$self->{mpv_window}->window->resize ($self->{w}, $self->{h})
if $self->{mpv_window}
&& $self->{mpv_window}->window;
}
sub do_configure {
my ($self, $event) = @_;
my $window = $self->window;
my ($sw, $sh) = ($self->{sw}, $self->{sh});
my ($x, $y) = ($event->x , $event->y );
my ($w, $h) = ($event->width, $event->height);
$self->{w} = $w;
$self->{h} = $h;
$self->update_mpv_window;
return unless $self->{subimage};
$w = max (16, $w);
$h = max (16, $h);
return if $self->{dw} == $w && $self->{dh} == $h;
$self->{dw} = $w;
$self->{dh} = $h;
$self->schedule_redraw;
}
sub handle_key {
my ($self, $key, $state) = @_;
local $SIG{PIPE} = 'IGNORE'; # for mpv_fh
my $volume = "add ao-volume %s2";
$state *= Gtk2::Accelerator->get_default_mod_mask;
$state -= ["shift-mask"];
if ($state == ["control-mask"]) {
if ($key == $Gtk2::Gdk::Keysyms{p} || $key == $Gtk2::Gdk::Keysyms{P}) {
new Gtk2::CV::PrintDialog
pixbuf => $self->{subimage},
aspect => $self->{dw} / $self->{dh},
autook => $key == $Gtk2::Gdk::Keysyms{P}
;
} elsif ($key == $Gtk2::Gdk::Keysyms{m}) {
$self->{maxpect} = !$self->{maxpect};
$self->auto_resize;
( run in 1.702 second using v1.01-cache-2.11-cpan-39bf76dae61 )