[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: Gtk2::Gdk::Window->foreign_new, help needed



Oh, thanks alot. Staring at the same lines of code for a while makes you
blind ;-) Thank you Torsten.

I've got the old code running now and i am wondering if it is possible
to select a foreign window and get the mouse movement in this window via
event. At the moment i am using this dirty code to select a window and
print out the mouse movement.

It works pretty well but is not really a solution because it'll never
reach the gtk main loop...

Does anyone know a better solution to get the mouse movement just via a
normal event? As you see i was trying to use a drawing area and get the
events but this is not working.

Thank you all.



#! /usr/bin/perl
use strict;
use Gtk2;

Gtk2->init;

my @anids=();

my @xwininfo_resp = `xwininfo -tree`;
foreach(@xwininfo_resp){
	chomp;
	if ($_ =~ /.*(0x[a-f0-9]+) .*/){
		my $id = $1;
		#~ print "Checking Window: $_\n";
		#~ print "Detected-Id: $id Window\n"; 
		push(@anids, Gtk2::Gdk::Window->foreign_new(hex($id)));
		#~ print "--------------------------------------\n";	
	}
}

my $counter = 0;
my @drawing_areas; 

my $area = new Gtk2::DrawingArea;
$area->set_events ([qw/exposure-mask
                    leave-notify-mask
               button-press-mask
               pointer-motion-mask
               pointer-motion-hint-mask/]);

$area->signal_connect (motion_notify_event => \&motion_notify_event);
$area->signal_connect (key_press_event => \&key_press_event);

foreach my $root (@anids){
	if($root && $root->is_viewable){
		my ($w, $h) = $root->get_size;			
		next unless ($w > 10 && $h > 10);
		my $state = $root->get_state;
		next if $state eq 'GDK_WINDOW_STATE_WITHDRAWN';

			while(1){			
				my ($window, $win_x, $win_y) = $root->at_pointer;
				my ($w, $h) = $window->get_size;			
				print $window." ".$win_x." ".$win_y."\n";
				my ($x_start, $y_start) = $window->get_position;
				print $area." at size ".$w." and ".$h."\n";
				#~ &draw_rect($window, [$x_start-5,$y_start-5,$w-5,$h-5],'red');			
				$area->show_all;
				sleep 1;
			}

		#~ my $pixbuf = Gtk2::Gdk::Pixbuf->get_from_drawable ($root,
Gtk2::Gdk::Colormap->get_system, 0, 0, 0, 0, $w, $h);
		#~ $pixbuf->get_from_drawable ($root, undef, 0, 0, 0, 0, $w, $h) if
defined($pixbuf); 
		#~ 
		#~ $pixbuf->save ("screenshot_$counter.png", 'png') if
defined($pixbuf);
		#~ print "$root - State = $state - Number = $counter\n";
	 
		$counter++;
	}
}

my %allocated_colors;
sub button_press_event {
  my $widget = shift;    # GtkWidget      *widget
  my $event = shift;    # GdkEventButton *event

  print join ' ', $event->coords,"\n";
  return 1;
}


sub motion_notify_event {
my $widget=shift;
my $event=shift;

 my ($x, $y, $state);

  if ($event->is_hint) {
    (undef, $x, $y, $state) = $event->window->get_pointer;
  } else {
    $x = $event->x;
    $y = $event->y;
    $state = $event->state;
  }

print "value of x and y are $x and $y \n" ;

  if ($state >= "button1-mask" ) {
		print "value of x and y and button1 are $x and $y \n" ;
  }
  if ($state >= "button2-mask" ) {
		print "value of x and y and button2 are $x and $y \n" ;
  }

  return 1; #was TRUE in source (was scribble.pl)
}

sub draw_rect {
    my($widget,$coords,$color) = @_;
   # see Gdk::Gdk::Window, Gtk2::Gdk::Drawable, Gtk2::Gdk::GC

    my $colormap = Gtk2::Gdk::Colormap->get_system;

    my $gc = new Gtk2::Gdk::GC($widget);
    $gc->set_foreground(get_color($colormap, $color));

    $widget->draw_rectangle($gc,0, @$coords);
}
		
sub get_color {
    my ($colormap, $name) = @_;
    my $ret;

    if ($ret = $allocated_colors{$name}) {
        return $ret;
    }

    my $color = Gtk2::Gdk::Color->parse($name);
    $colormap->alloc_color($color,1,1);

    $allocated_colors{$name} = $color;

    return $color;
}

Gtk2->main; 








Am Mittwoch, den 02.07.2008, 21:16 +0200 schrieb Torsten Schoenfeld:
> Mario Kemper wrote:
> 
> > #! /usr/bin/perl
> > use strict;
> > use Gtk2;
> 
> I think you're missing the '-init' argument here.  Or manually: Gtk2->init.
> 
> For doing stuff with windows, you might also want to take a look at Gnome2::Wnck:
> 
> <http://gtk2-perl.sourceforge.net/doc/pod/Gnome2/Wnck/index.html>
> 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]