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.
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 –
Warum verwenden Sie GTK überhaupt dafür? Einfach mit Xlib aufrufen und den Baum des Root-Fensters abfragen. –
Ich versuche nicht, ein Tool von Grund auf zu schreiben, ich versuche, eine Funktion zu einer bestehenden, großen Gtk3-App hinzuzufügen. – TheAmigo