2009-12-19 71 views
9

我希望能夠在Linux中的根窗口上繪圖。 也就是說製作一個OSD。在X根窗口上繪圖

我正在使用Gnome。

代碼示例或鏈接,將不勝感激。

回答

8

這是可能的,但是在GNOME中你不會看到任何東西。 GNOME的文件管理器Nautilus在root X窗口之上打開自己的窗口來顯示圖標。因爲這個根X窗口是完全覆蓋的......所以沒有必要繪製它。

如果你想製作OSD,你可以使用像XOSD這樣的庫,或者打開你自己的X窗口並使其變得半透明。事實上,XOSD的源代碼應該是如何做到這一點的一個很好的例子。

整個庫似乎在一個文件中實現:xosd.c

+0

謝謝你,你的回答是最有幫助的。 我想繪製除文字以外的東西,但這是一個很好的起點。 – x10 2009-12-19 23:36:42

+1

以下是一些示例代碼: http://pastebin.com/f58970b0c 並且教程: http://ldots.org/xosd-guide/using_libxosd.html – x10 2009-12-19 23:41:16

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」。

現在開羅可以在任何Windows畫得很簡單,只需使用

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

但是,這並不在桌面上工作。 也許是由於內核更新?或者我現在在Ubuntu 10.04-3上搞砸了。