2009-12-19 7 views
9

Tôi muốn có thể vẽ trên cửa sổ gốc trong Linux. I.e. tạo OSD.Vẽ trên cửa sổ gốc X

Tôi đang sử dụng Gnome.

Mẫu mã hoặc liên kết tới chúng sẽ được đánh giá cao.

Trả lời

8

Có thể, nhưng bạn sẽ không thấy gì trong GNOME. Nautilus, trình quản lý tệp của GNOME, mở cửa sổ riêng của nó trên đầu cửa sổ X gốc để hiển thị các biểu tượng. Do đó cửa sổ X gốc được bao phủ hoàn toàn ... nên không có điểm nào trong việc vẽ lên nó.

Nếu bạn muốn tạo OSD, bạn nên sử dụng thư viện như XOSD hoặc mở cửa sổ X của riêng mình và làm cho nó mờ. Trên thực tế, mã nguồn của XOSD phải là một ví dụ tốt về cách thực hiện điều này.

Toàn bộ thư viện dường như được triển khai trong một tệp: xosd.c.

+0

Cảm ơn bạn, câu trả lời của bạn hữu ích nhất. Tôi muốn vẽ những thứ khác ngoài văn bản, nhưng đây là điểm bắt đầu tốt. – x10

+1

Dưới đây là một số mã mẫu: http://pastebin.com/f58970b0c Và hướng dẫn: http://ldots.org/xosd-guide/using_libxosd.html – x10

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

Tôi có thể tìm thấy máy tính để bàn, được xác minh bởi xwininfo. Nhưng, tôi bị mất mã có thể vẽ máy tính để bàn, có vẻ như được sử dụng "set_back_pixmap".

Bây giờ cairo có thể vẽ trên bất kỳ cửa sổ rất đơn giản, chỉ cần sử dụng

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

Nhưng, điều này không làm việc trên máy tính để bàn. Có lẽ do cập nhật hạt nhân? Hoặc tôi đã làm hỏng trên Ubuntu 10.04-3.