Gtk2
view release on metacpan or search on metacpan
gtk-demo/changedisplay.pl view on Meta::CPAN
# GdkScreen *current_screen;
#};
#
# These enumerations provide symbolic names for the columns
# in the two GtkListStore models.
#
use constant DISPLAY_COLUMN_NAME => 0;
use constant DISPLAY_COLUMN_DISPLAY => 1;
use constant DISPLAY_NUM_COLUMNS => 2;
use constant SCREEN_COLUMN_NUMBER => 0;
use constant SCREEN_COLUMN_SCREEN => 1;
use constant SCREEN_NUM_COLUMNS => 2;
#
# Finds the toplevel window under the mouse pointer, if any.
#
sub find_toplevel_at_pointer {
my $display = shift;
# my $pointer_window = $display->get_window_at_pointer;
use Data::Dumper;
my ($pointer_window, undef, undef) = $display->get_window_at_pointer;
#
# The user data field of a GdkWindow is used to store a pointer
# to the widget that created it.
#
if ($pointer_window) {
my $ptr = $pointer_window->get_user_data;
if ($ptr) {
my $widget = Glib::Object->new_from_pointer ($ptr);
return $widget ? $widget->get_toplevel : undef;
} else {
return undef;
}
} else {
return undef;
}
}
sub button_release_event_cb {
# my ($widget, $event, $clicked_ref) = @_;
my (undef, undef, $clicked_ref) = @_;
$$clicked_ref = TRUE;
return TRUE;
}
#
# Asks the user to click on a window, then waits for them click
# the mouse. When the mouse is released, returns the toplevel
# window under the pointer, or NULL, if there is none.
#
sub query_for_toplevel {
my ($screen, $prompt) = @_;
my $display = $screen->get_display;
my $toplevel = undef;
my $popup = Gtk2::Window->new ('popup');
$popup->set_screen ($screen);
$popup->set_modal (TRUE);
$popup->set_position ('center');
my $frame = Gtk2::Frame->new;
$frame->set_shadow_type ('out');
$popup->add ($frame);
my $label = Gtk2::Label->new ($prompt);
$label->set_padding (10, 10);
$frame->add ($label);
$popup->show_all;
my $cursor = Gtk2::Gdk::Cursor->new_for_display ($display, 'crosshair');
if (Gtk2::Gdk->pointer_grab ($popup->window, FALSE,
'button-release-mask',
undef,
$cursor,
0) eq 'success') #'GDK_GRAB_SUCCESS')
{
my $clicked = FALSE;
$popup->signal_connect (button_release_event => \&button_release_event_cb, \$clicked);
#
# Process events until clicked is set by button_release_event_cb.
# We pass in may_block=TRUE since we want to wait if there
# are no events currently.
#
while (!$clicked) {
Glib::MainContext->default->iteration (TRUE);
}
$toplevel = find_toplevel_at_pointer ($screen->get_display);
# don't move yourself
$toplevel = undef if defined $toplevel and $toplevel == $popup;
}
$popup->destroy;
Gtk2::Gdk->flush; # Really release the grab
return $toplevel;
}
# Prompts the user for a toplevel window to move, and then moves
# that window to the currently selected display
#
sub query_change_display {
my $info = shift;
my $screen = $info->{window}->get_screen;
my $toplevel = query_for_toplevel ($screen,
"Please select the toplevel\n"
. "to move to the new screen");
if ($toplevel) {
$toplevel->set_screen ($info->{current_screen});
} else {
$screen->get_display->beep;
}
}
#
# Fills in the screen list based on the current display
#
sub fill_screens {
my $info = shift;
$info->{screen_model}->clear;
if ($info->{current_display}) {
my $n_screens = $info->{current_display}->get_n_screens;
for (my $i = 0; $i < $n_screens; $i++) {
my $screen = $info->{current_display}->get_screen ($i);
my $iter = $info->{screen_model}->append;
$info->{screen_model}->set ($iter,
SCREEN_COLUMN_NUMBER, $i,
SCREEN_COLUMN_SCREEN, $screen);
$info->{screen_selection}->select_iter ($iter)
if $i == 0;
}
}
}
#
# Called when the user clicks on a button in our dialog or
# closes the dialog through the window manager. Unless the
# "Change" button was clicked, we destroy the dialog.
#
sub response_cb {
my ($dialog, $response_id, $info) = @_;
if ($response_id eq 'ok') {
query_change_display ($info);
} else {
$dialog->destroy;
( run in 0.734 second using v1.01-cache-2.11-cpan-364913b4093 )