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;
73 # is there a way to get the display pointer from Tk?
74 $result = _x11($opts{display}, hex($id_hex), $opts{left}, $opts{top},
75 $opts{right}, $opts{bottom});
78 Imager->_set_error("Unsupported windowing system '$sys'");
84 defined &_win32 ? _win32(0, $opts{decor}, $opts{left}, $opts{top},
85 $opts{right}, $opts{bottom}) :
86 defined &_darwin ? _darwin($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());
98 # RT #24992 - the Imager typemap entry is broken pre-0.56, so
100 return bless { IMG => $result }, "Imager";
112 my $display = _x11_open(@_);
114 Imager->_set_error(Imager->_error_as_msg);
131 Imager::Screenshot - screenshot to an Imager image
135 use Imager::Screenshot 'screenshot';
138 my $img = screenshot();
141 my $img2 = screenshot(hwnd => $hwnd);
144 my $img3 = screenshot(display => $display, id => $window_id);
147 my $display = Imager::Screenshot::x11_open();
148 Imager::Screenshot::x11_close($display);
150 # test for win32 support
151 if (Imager::Screenshot->have_win32) { ... }
153 # test for x11 support
154 if (Imager::Screenshot->have_x11) { ... }
159 Imager::Screenshot captures either a desktop or a specified window and
160 returns the result as an Imager image.
162 Currently the image is always returned as a 24-bit image.
166 =item screenshot hwnd => I<window handle>
168 =item screenshot hwnd => I<window handle>, decor => <capture decorations>
170 Retrieve a screenshot under Win32, if I<window handle> is zero,
173 By default, window decorations are not captured, if the C<decor>
174 parameter is set to true then window decorations are included.
176 =item screenshot id => I<window id>
178 =item screenshot id => I<window id>, display => I<display object>
180 Retrieve a screenshot under X11, if I<id> is zero, capture the root
181 window. I<display object> is a integer version of an X11 C< Display *
182 >, if this isn't supplied C<screenshot()> will attempt connect to the
183 the display specified by $ENV{DISPLAY}.
185 Note: taking a screenshot of a remote display is slow.
187 =item screenshot widget => I<widget>
189 =item screenshot widget => I<widget>, display => I<display>
191 =item screenshot widget => I<widget>, decor => I<capture decorations>
193 Retrieve a screenshot of a Tk widget, under Win32 or X11, depending on
194 how Tk has been built.
196 If Tk was built for X11 then the display parameter applies.
198 If Tk was built for Win32 then the decor parameter applies.
202 If no C<id>, C<hwnd> or C<widget> parameter is supplied:
208 if Win32 support is compiled, return screenshot(hwnd => 0).
212 if X11 support is compiled, return screenshot(id => 0).
220 You can also supply the following parameters to retrieve a subset of
243 If left or top is negative, then treat that as from the right/bottom
246 If right ot bottom is zero or negative then treat as from the
247 right/bottom edge of the window.
249 So setting all 4 values to 0 retrieves the whole window.
251 # a 10-pixel wide right edge of the window
252 my $right_10 = screenshot(left => -10, ...);
254 # the top-left 100x100 portion of the window
255 my $topleft_100 = screenshot(right => 100, bottom => 100, ...);
257 # 10x10 pixel at the bottom right corner
258 my $bott_right_10 = screenshot(left => -10, top => -10, ...);
260 If screenshot() fails, it will return nothing, and the cause of the
261 failure can be retrieved via Imager->errstr, so typical use could be:
263 my $img = screenshot(...) or die Imager->errstr;
267 Returns true if Win32 support is available.
271 Returns true if X11 support is available.
273 =item Imager::Screenshot::x11_open
275 =item Imager::Screenshot::x11_open I<display name>
277 Attempts to open a connection to either the display name in
278 $ENV{DISPLAY} or the supplied display name. Returns a value suitable
279 for the I<display> parameter of screenshot, or undef.
281 =item Imager::Screenshot::x11_close I<display>
283 Closes a display returned by Imager::Screenshot::x11_open().
289 screenshot() sets a number of tags in the images it returns, these are:
295 ss_left - the distance between the left side of the window and the
296 left side of the captured area. The same value as the I<left>
297 parameter when that is positive.
301 ss_top - the distance between the top side of the window the top side
302 of the captured area. The same value at the I<top> parameter when
307 ss_window_width - the full width of the window.
311 ss_window_height - the full height of the window.
315 ss_type - the type of capture done, either "Win32" or "X11".
319 To cheaply get the window size you can capture a single pixel:
321 my $im = screenshot(right => 1, bottom => 1);
322 my $window_width = $im->tags(name => 'ss_window_width');
323 my $window_height = $im->tags(name => 'ss_window_height');
327 It's possible to have more than one grab driver available, for
328 example, Win32 and X11, and which is used can have an effect on the
331 Under Win32, if there's a screesaver running, then you grab the
332 results of the screensaver.
334 Grabbing the root window on a rootless server (eg. Cygwin/X) may not
335 grab the background that you see. In fact, when I tested under
336 Cygwin/X I got the xterm window contents even when the Windows
337 screensaver was running. The root window captured appeared to be that
338 generated by my window manager.
340 Grabbing a window with other windows overlaying it will capture the
341 content of those windows where they hide the window you want to
342 capture. You may want to raise the window to top. This may be a
343 security concern if the overlapping windows contain any sensitive
344 information - true for any screen capture.
348 Imager::Screenshot is licensed under the same terms as Perl itself.
352 Future plans include:
358 OS X support - I need to find out which APIs to use to do this. I
359 found some information on the APIs used for this, but don't have a Mac
364 window name searches - currently screenshot() requires a window
365 identifier of some sort, it would be more usable if we could supply
366 some other identifier, either a window title or a window class name.
372 Tony Cook <tonyc@cpan.org>