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 )