package Prima::sys::XQuartz; use strict; use warnings; use Prima; sub get_fullscreen_image { my $self = shift; goto FALLBACK unless $^O eq 'darwin'; goto FALLBACK unless $self->sys_action("xquartz.local_display"); my $real_screen_height = $self->sys_action("xquartz.screen_height"); goto FALLBACK unless $real_screen_height; my $grab_mode = $self->sys_action("xquartz.grab_mode"); $self->sys_action("xquartz.grab_mode native"); goto FALLBACK unless $self->sys_action("xquartz.grab_mode") eq 'native'; my $diff = $real_screen_height - $self->height; my $menubar = $self->get_image(0,$self->height - $diff,$self->width,$diff); $self->sys_action("xquartz.grab_mode $grab_mode"); goto FALLBACK unless $menubar; my $fullscreen = $self->get_image(0,0,$self->size); $fullscreen->scaling(ist::None); $fullscreen->height( $real_screen_height ); $fullscreen->put_image( 0, $self-> height, $menubar ); return $fullscreen; FALLBACK: return $self->get_image(0,0,$self->size); } 1; =pod =head1 NAME Prima::sys::XQuartz - MacOSX/XQuartz facilities =head1 DESCRIPTION XQuartz emulates the X11 environment with certain limits, namely, it cannot grab bits from the screen, and it also hides the top-level menu from screen coordinates accessible for X11 clients. For example, a Mac with 1024x768 resolution will only report f.ex. 1024x746 size to Prima. If Prima is compiled with the Cocoa library, the C<get_fullscreen_image> method circumvents these limitations and returns a shot of the whole screen, including the application menu. Note that screen grabbing has to be allowed by the user or the administrator. To do that, Choose the Apple menu, System Preferences, click Security & Privacy, then click Privacy. Click on an icon on the left lower corner to allow changes. Then, in the screen recording tab, add XQuartz to the list of allowed applications. Note that it might not work if you run your application from a (remote) ssh session - I couldn't find how to enable screen grabbing for sshd. =head1 AUTHOR Dmitry Karasik, E<lt>dmitry@karasik.eu.orgE<gt>. =head1 SEE ALSO L<Prima::Dialog::FileDialog> =cut