1 package Imager::Screenshot;
3 use vars qw(@ISA $VERSION @EXPORT_OK);
8 @EXPORT_OK = 'screenshot';
15 # try XSLoader first, DynaLoader has annoying baggage
17 XSLoader::load('Imager::Screenshot' => $VERSION);
21 push @ISA, 'DynaLoader';
22 bootstrap Imager::Screenshot $VERSION;
27 # lose the class if called as a method
28 @_ % 2 == 1 and shift;
41 if (defined $opts{hwnd}) {
43 or die "Win32 driver not enabled\n";
44 $result = _win32($opts{hwnd}, $opts{decor}, $opts{left}, $opts{top},
45 $opts{right}, $opts{bottom});
47 elsif (defined $opts{id}) { # X11 window id
49 or die "X11 driver not enabled\n";
50 $result = _x11($opts{display}, $opts{id}, $opts{left}, $opts{top},
51 $opts{right}, $opts{bottom});
53 elsif ($opts{widget}) {
55 my $top = $opts{widget}->toplevel;
56 my $sys = $top->windowingsystem;
57 if ($sys eq 'win32') {
58 unless (defined &_win32) {
59 Imager->_set_error("Win32 Tk and Win32 support not built");
62 $result = _win32(hex($opts{widget}->id), $opts{decor},
63 $opts{left}, $opts{top}, $opts{right}, $opts{bottom});
65 elsif ($sys eq 'x11') {
66 unless (defined &_x11) {
67 Imager->_set_error("X11 Tk and X11 support not built");
71 my $id_hex = $opts{widget}->id;
72 $opts{widget}->can('frame')
73 and $id_hex = $opts{widget}->frame;
75 # is there a way to get the display pointer from Tk?
76 $result = _x11($opts{display}, hex($id_hex), $opts{left}, $opts{top},
77 $opts{right}, $opts{bottom});
80 Imager->_set_error("Unsupported windowing system '$sys'");
86 defined &_win32 ? _win32(0, $opts{decor}, $opts{left}, $opts{top},
87 $opts{right}, $opts{bottom}) :
88 defined &_x11 ? _x11($opts{display}, 0, $opts{left}, $opts{top},
89 $opts{right}, $opts{bottom}) :
90 die "No drivers enabled\n";
94 Imager->_set_error(Imager->_error_as_msg());
110 my $display = _x11_open(@_);
112 Imager->_set_error(Imager->_error_as_msg);
129 Imager::Screenshot - screenshot to an Imager image
133 use Imager::Screenshot 'screenshot';
136 my $img = screenshot();
139 my $img2 = screenshot(hwnd => $hwnd);
142 my $img3 = screenshot(display => $display, id => $window_id);
145 my $display = Imager::Screenshot::x11_open();
146 Imager::Screenshot::x11_close($display);
148 # test for win32 support
149 if (Imager::Screenshot->have_win32) { ... }
151 # test for x11 support
152 if (Imager::Screenshot->have_x11) { ... }
157 Imager::Screenshot captures either a desktop or a specified window and
158 returns the result as an Imager image.
160 Currently the image is always returned as a 24-bit image.
164 =item screenshot hwnd => I<window handle>
166 =item screenshot hwnd => I<window handle>, decor => <capture decorations>
168 Retrieve a screenshot under Win32, if I<window handle> is zero,
171 By default, window decorations are not captured, if the C<decor>
172 parameter is set to true then window decorations are included.
174 =item screenshot id => I<window id>
176 =item screenshot id => I<window id>, display => I<display object>
178 Retrieve a screenshot under X11, if I<id> is zero, capture the root
179 window. I<display object> is a integer version of an X11 C< Display *
180 >, if this isn't supplied C<screenshot()> will attempt connect to the
181 the display specified by $ENV{DISPLAY}.
183 Note: taking a screenshot of a remote display is slow.
187 If no C<id> or C<hwnd> parameter is supplied:
193 if Win32 support is compiled, return screenshot(hwnd => 0).
197 if X11 support is compiled, return screenshot(id => 0).
205 You can also supply the following parameters to retrieve a subset of
228 If left or top is negative, then treat that as from the right/bottom
231 If right ot bottom is zero or negative then treat as from the
232 right/bottom edge of the window.
234 So setting all 4 values to 0 retrieves the whole window.
236 # a 10-pixel wide right edge of the window
237 my $right_10 = screenshot(left => -10, ...);
239 # the top-left 100x100 portion of the window
240 my $topleft_100 = screenshot(right => 100, bottom => 100, ...);
242 # 10x10 pixel at the bottom right corner
243 my $bott_right_10 = screenshot(left => -10, top => -10, ...);
247 Returns true if Win32 support is available.
251 Returns true if X11 support is available.
253 =item Imager::Screenshot::x11_open
255 =item Imager::Screenshot::x11_open I<display name>
257 Attempts to open a connection to either the display name in
258 $ENV{DISPLAY} or the supplied display name. Returns a value suitable
259 for the I<display> parameter of screenshot, or undef.
261 =item Imager::Screenshot::x11_close I<display>
263 Closes a display returned by Imager::Screenshot::x11_open().
269 It's possible to have more than one grab driver available, for
270 example, Win32 and X11, and which is used can have an effect on the
273 Under Win32, if there's a screesaver running, then you grab the
274 results of the screensaver.
276 Grabbing the root window on a rootless server (eg. Cygwin/X) may not
277 grab the background. In fact, when I tested under Cygwin/X I got the
278 xterm window contents even when the Windows screensaver was running.
282 Imager::Screenshot is licensed under the same terms as Perl itself.
286 Tony Cook <tonyc@cpan.org>