简体   繁体   English

在X根窗口上绘图

[英]Drawing on the X root window

I'd like to be able to draw on the root window in Linux. 我希望能够在Linux的根窗口上绘图。 Ie make an OSD. 即制作OSD。

I'm using Gnome. 我正在使用Gnome。

Code samples or links to them would be appreciated. 代码示例或链接到他们将不胜感激。

It is possible, but you will not see anything in GNOME. 这是可能的,但你不会在GNOME中看到任何东西。 Nautilus, GNOME's file manager, opens its own window on top of root X window to display icons. NOMElus,GNOME的文件管理器,在根X窗口顶部打开自己的窗口以显示图标。 Because of that the root X window is fully covered... so there is no point in drawing on it. 因为根X窗口被完全覆盖...所以绘制它没有意义。

If you want to make OSD, either you should use a library like XOSD , or open your own X window and make it translucent. 如果你想制作OSD,你应该使用像XOSD这样的库,或者打开你自己的X窗口并使其半透明。 In fact, XOSD's source code should be a good example of how to do this. 事实上,XOSD的源代码应该是如何做到这一点的一个很好的例子。

Whole library seems to be implemented in one file: xosd.c . 整个库似乎在一个文件中实现: xosd.c

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;
#------------------------------------------

I can find desktop, verified by xwininfo. 我可以找到桌面,由xwininfo验证。 But, I lost the code which can draw desktop, seems used "set_back_pixmap". 但是,我丢失了可以绘制桌面的代码,似乎使用了“set_back_pixmap”。

Now cairo can draw on any windows very simply, just use 现在cairo可以非常简单地在任何窗口上绘图,只需使用即可

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

But, this does not work on desktop. 但是,这在桌面上不起作用。 Perhaps due to kernel update? 也许是由于内核更新? Or I messed up now on Ubuntu 10.04-3. 或者我现在搞砸了Ubuntu 10.04-3。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM