—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