2016-06-21 15 views
2

Ich habe ein Perl Gtk3-Skript, in dem ich eine Liste aller offenen X11-Fenster auf der aktuellen Anzeige erhalten möchte.Wie listet man alle X11-Fenster mit Gtk3 auf :: Gdk

Bisher habe ich:

#!/usr/bin/perl -w 
package Gtk3::Gdk::X11; 
use strict; 
use Glib::Object::Introspection; 
Glib::Object::Introspection->setup(basename => 'GdkX11', version => '3.0', package => 'Gtk3::Gdk'); 

package main; 
use strict; 
use Gtk3 -init; 
use Data::Dumper; 
my $x_root = Gtk3::Gdk::x11_get_default_root_xwindow(); 
print "x_root = " . Dumper $x_root; 
my $gdk_screen = Gtk3::Gdk::Screen::get_default(); 
print "gdk_screen = " . Dumper $gdk_screen; 
my $wm_name = $gdk_screen->get_window_manager_name; 
print "wm_name = '$wm_name'\n"; 
my $gdk_display = Gtk3::Gdk::Display::open(':0'); 
print "gdk_display = " . Dumper $gdk_display; 
my $gdk_root = Gtk3::Gdk::X11Window::foreign_new_for_display($x_root, $gdk_display, $x_root); 
print "gdk_root = " . Dumper $gdk_root; 
my $a_net_client_list = Gtk3::Gdk::atom_intern('_NET_CLIENT_LIST', 1); 
print "a_net_client_list = " . Dumper $a_net_client_list; 
my $a_window = Gtk3::Gdk::atom_intern('WINDOW', 1); 
print "a_window = " . Dumper $a_window; 
my $wins = Gtk3::Gdk::property_get($gdk_root, $a_net_client_list, $a_window, 0, 1024, 0); 
print "wins = " . Dumper $wins; 

Aber das ergibt:

x_root = $VAR1 = 2443; 
gdk_screen = $VAR1 = bless({}, 'Gtk3::Gdk::X11Screen'); 
wm_name = 'Xfwm4' 
gdk_display = $VAR1 = bless({}, 'Gtk3::Gdk::X11Display'); 
gdk_root = $VAR1 = bless({}, 'Gtk3::Gdk::X11Window'); 
a_net_client_list = $VAR1 = bless(do{\(my $o = 129)}, 'Gtk3::Gdk::Atom'); 
a_window = $VAR1 = bless(do{\(my $o = 33)}, 'Gtk3::Gdk::Atom'); 
** 
ERROR:gperl-i11n-marshal-struct.c:43:struct_to_sv: assertion failed: (!own) 
Aborted (core dumped) 

Wenn es eine Möglichkeit in Perl zu verwenden libwnck3, die funktionieren könnte.

+0

Ich bin nicht vertraut mit der Programmierung in Gtk3, so kann ich nicht mit dem besonderen Fehler helfen, den Sie bekommen .. aber ich habe ein Dienstprogramm ['wmctrl'] verwendet (http://linux.die.net/man/1/ wmctrl) das alle geöffneten Fenster auflisten kann. Es ist [in C programmiert] (https://packages.debian.org/source/jessie/wmctrl), daher sollte es möglich sein, den Teil des Codes, der die Fenster auflistet, per XS oder Inline :: C in Perl zu portieren –

+0

Warum verwenden Sie GTK überhaupt dafür? Einfach mit Xlib aufrufen und den Baum des Root-Fensters abfragen. –

+0

Ich versuche nicht, ein Tool von Grund auf zu schreiben, ich versuche, eine Funktion zu einer bestehenden, großen Gtk3-App hinzuzufügen. – TheAmigo

Antwort

1

ich eine Lösung gefunden (obwohl meine nicht eine bevorzugte):

#!/usr/bin/perl -w 
use strict; 
use Gtk3 -init; 
use Glib::Object::Introspection; 
Glib::Object::Introspection->setup(basename => 'GdkX11', version => '3.0', package => 'Gtk3::Gdk'); 
Glib::Object::Introspection->setup(basename => 'Wnck', version => '3.0', package => 'Wnck'); 

my $screen = Wnck::Screen::get_default(); 
$screen->force_update; 
for my $win (@{$screen->get_windows}) { 
     my $name = $win->get_name; 
     my $ws = $win->get_workspace; 
     my $w = $ws ? $ws->get_number : -1; 
     printf "(%04d, %04d) %04dx%04d:%2s $name\n", $win->get_geometry, $w; 
} 

Der Grund, warum ich lieber nicht Wnck verwenden, weil the documentation sagt: the use of this library is relatively expensive in terms of resources. Meine Anwendung benötigt nicht die meisten Funktionen, die Wnck bietet, also ist es ein wenig übertrieben.

Verwandte Themen