2011-08-23 49 views
6

我不知道如何直接與開羅(C語言)繪製根窗口在X11環境,以使小部件。我已經複製了tint2代碼的一些部分,但是它非常龐大,我得到的唯一結果並不令人滿意。 我會很高興有一個完整的工作示例代碼,或至少一些提示或小程序來學習。 謝謝你們!如何直接在桌面上繪製?

+0

我不知道,如果直接在桌面上繪製是做到這一點的最好辦法。你知道你可以在X11中使用沒有邊框/標題欄的窗口,並將它們設置爲永遠不會最小化..並且位於堆棧的底部。我認爲這是大多數小部件所做的。 –

+0

這裏有一個類似的線程有一個鏈接,我的幫助: http://stackoverflow.com/questions/1934442/drawing-on-the-x-root-window – CommonSense

+0

但如果這就是你想要看什麼xosd和xsnow ..雖然他們不使用開羅,只是xlib。 –

回答

6

「底部」窗口是根窗口。問題是,在某些桌面環境中,我們在根窗口頂部有窗口,所以如果您更改根窗口,則不會看到您的更改:您需要更改頂部的窗口。

這個程序做了你問什麼:在根窗口的平局。爲了測試它,我建議你:

  • CTRL + ALT + F1
  • 以root身份登錄
  • 停止您的桌面環境( 「/etc/init.d/gdm停止」,「在/ etc/init.d中/ KDM停止」或任何需要在你的發行版)
  • X -noreset -retro &
  • DISPLAY =:0.0的xterm &
  • DISPLAY =:0.0的metacity &

然後,再回到X(Ctrl + Alt + F7或可能F8),並運行該程序。

如果您希望藉助Nautilus的頂部窗口,你需要找出它的窗口ID,然後用它作爲‘W’的變量。該「xwininfo」命令可以幫助你測試...

#include <assert.h> 
#include <stdio.h> 
#include <X11/Xlib.h> 
#include <cairo.h> 
#include <cairo-xlib.h> 

int width, height; 

void draw(cairo_t *cr) { 
    int quarter_w = width/4; 
    int quarter_h = height/4; 
    cairo_set_source_rgb(cr, 1.0, 0.0, 0.0); 
    cairo_rectangle(cr, quarter_w, quarter_h, quarter_w * 2, quarter_h * 2); 
    cairo_fill(cr); 
} 

int main() { 
    Display *d = XOpenDisplay(NULL); 
    assert(d); 

    int s = DefaultScreen(d); 
    Window w = RootWindow(d, s); 
    width = DisplayWidth(d, s); 
    height = DisplayHeight(d, s); 

    cairo_surface_t *surf = cairo_xlib_surface_create(d, w, 
            DefaultVisual(d, s), 
            width, height); 
    cairo_t *cr = cairo_create(surf); 

    XSelectInput(d, w, ExposureMask); 

    draw(cr); 

    XEvent ev; 
    while (1) { 
    XNextEvent(d, &ev); 
     printf("Event!\n"); 
     if (ev.type == Expose) { 
      draw(cr); 
     } 
    } 

    cairo_destroy(cr); 
    cairo_surface_destroy(surf); 
    XCloseDisplay(d); 
    return 0; 
} 
+0

這對我有用。我能夠通過使用xwininfo獲取窗口ID,然後將RootWindow()行更改爲:'Window w =(Window)0x2400041;',使用您自己的值作爲ID 。我注意到的一件事是它不適用於每個窗口。使用桌面和Chrome的ID不起作用。你有什麼想法,爲什麼? – gsingh2011

+0

其實,有趣的是,當我更換標籤頁時,我在Chrome上看到紅色方塊,並在瞬間消失... – gsingh2011

+0

我的猜測是應用程序只是繪製在矩形的頂部。你不能真正開始繪製另一個應用程序的窗口,因爲你不知道他們什麼時候再次繪製所做的事情。如果你想用桌面背景做一些奇特的事情,那麼我建議你看一下任何應用程序的源代碼,然後對其進行修改。或者只是殺了它:) – pzanoni