Re: Gtk2::Gdk::Window->foreign_new, help needed
- From: Mario Kemper <mario kemper googlemail com>
- To: gtk-perl-list gnome org
- Subject: Re: Gtk2::Gdk::Window->foreign_new, help needed
- Date: Thu, 03 Jul 2008 12:49:21 +0200
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]