Gtk2-Ex-WidgetBits

 view release on metacpan or  search on metacpan

devel/position-menuitem.pl  view on Meta::CPAN

#!/usr/bin/perl -w

# Copyright 2010, 2011 Kevin Ryde

# This file is part of Gtk2-Ex-WidgetBits.
#
# Gtk2-Ex-WidgetBits is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 3, or (at your option) any later
# version.
#
# Gtk2-Ex-WidgetBits is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License along
# with Gtk2-Ex-WidgetBits.  If not, see <http://www.gnu.org/licenses/>.

use strict;
use warnings;
use Gtk2 '-init';
use Gtk2::Ex::WidgetBits;

use FindBin;
my $progname = $FindBin::Script;

my $toplevel = Gtk2::Window->new ('toplevel');
$toplevel->signal_connect (destroy => sub { Gtk2->main_quit });

my $menubar = Gtk2::MenuBar->new;
$toplevel->add ($menubar);

my $topitem = Gtk2::MenuItem->new ('Menu');
$menubar->append ($topitem);

my $menu = Gtk2::Menu->new;
# $topitem->set_submenu ($menu);

my $zitem;
$menu->signal_connect
  (show => sub {
     # my $tearoff = Gtk2::TearoffMenuItem->new;
     # $tearoff->show;
     # $menu->append ($tearoff);
     # $menu->set (reserve_toggle_size => 0);
     # print "$progname: tearoff border ", $tearoff->get_border_width,
     #   ",", $tearoff->get_border_width, "\n";

     {
       my $item = Gtk2::MenuItem->new ('ZZZZZZZZZZZZ');
       $item->show;
       $menu->append ($item);
     }

     $zitem = Gtk2::MenuItem->new ('ZZZZZZZZZZZZ');
     $zitem->show;
     $menu->append ($zitem);
   });

$menu->popup (undef, undef, undef, undef,
              1, 0);

my $submenu = Gtk2::Menu->new;
$zitem->set_submenu ($submenu);

my $item;
$submenu->signal_connect
  (show => sub {
     {
       my $item = Gtk2::MenuItem->new ('SSSSSSSSSS');
       $item->show;
       $submenu->append ($item);
     }
     $item = Gtk2::MenuItem->new ('SSSSSSSSS');
     $item->show;
     $submenu->append ($item);
                          });

Glib::Timeout->add
  (2000,
   sub {
     {
       my ($x,$y) = Gtk2::Ex::WidgetBits::get_root_position ($menu);
       print "menu    $x,$y   $menu\n";
       my $window = $menu->window;
       print "window  $window\n";
     }
     {
       $submenu = $zitem->get_submenu;
       my ($x,$y) = Gtk2::Ex::WidgetBits::get_root_position ($submenu);
       print "submenu $x,$y   $submenu\n";
       my $window = $submenu->window;
       print "window  $window\n";
     }
     if ($item) {
       my $alloc = $item->allocation;
       { local $,=' '; print "item alloc",$alloc->values,"\n"; }
       my ($x,$y) = Gtk2::Ex::WidgetBits::get_root_position ($item);
       print "item    $x,$y  ",$item->get('label'),"\n";
       my $parent = $item->get_parent;
       print "parent  $parent\n";
       my $window = $item->window;
       my $rootwin = $menu->get_screen->get_root_window;
       for (my $w = $window; $w != $rootwin; $w = $w->get_parent) {
         local $,=' ';
         print "win  $w",$w->XID,$w->get_position,($w->get_geometry)[0,1],"\n";
       }
       system "xwininfo -children -id ".$window->XID;
     }
     exit 1;
     # return Glib::SOURCE_REMOVE;
   });

#$toplevel->show_all;
Gtk2->main;
exit 0;



( run in 0.870 second using v1.01-cache-2.11-cpan-364913b4093 )