在X根窗口上绘图

时间:2009-12-19 23:22:06

标签: linux x11

我希望能够在Linux的根窗口上绘图。 即做一个OSD。

我正在使用Gnome。

代码示例或指向它们的链接将不胜感激。

2 个答案:

答案 0 :(得分:12)

有可能,但你不会在GNOME中看到任何东西。 NOMElus,GNOME的文件管理器,在根X窗口顶部打开自己的窗口以显示图标。因为根X窗口被完全覆盖......所以绘制它没有意义。

如果您想制作OSD,您应该使用像XOSD这样的库,或者打开自己的X窗口并使其半透明。事实上,XOSD的源代码应该是如何做到这一点的一个很好的例子。

整个库似乎在一个文件中实现:xosd.c

答案 1 :(得分:0)

use X11::Protocol;

my $x = X11::Protocol->new();
my $desktop;

my ($root,undef,@kids)=$x->QueryTree($x->{'root'});
printf "%10x:\tRoot\n", $root;
foreach (@kids){
my $gdkw = Gtk2::Gdk::Window->foreign_new($_);
printf ("%10x:\tDesktop\n",$gdkw->get_xid),$desktop=$gdkw,last if $gdkw->get_type_hint eq 'desktop';
}
$desktop=Gtk2::Gdk::Window->foreign_new($root) if ! $desktop;
#------------------------------------------

我可以找到桌面,由xwininfo验证。 但是,我丢失了可以绘制桌面的代码,似乎使用了“set_back_pixmap”。

现在cairo可以非常简单地在任何窗口上绘图,只需使用

$cr = Gtk2::Gdk::Cairo::Context->create ($drawable);

但是,这在桌面上不起作用。 也许是由于内核更新?或者我现在搞砸了Ubuntu 10.04-3。