2011-08-23 15 views
6

私はウィジェットを作るためにCairo(C言語)を使ったX11環境のルートウィンドウに直接描画する方法を知っています。私はtint2のコードのいくつかの部分をコピーしましたが、それはかなり巨大で、私が持っている唯一の結果は満足できません。 私は、完全な作業サンプルコード、または少なくともいくつかのヒントや、勉強するための小さなプログラムを持っていることを嬉しく思っています。 ありがとう!デスクトップに直接描画する方法は?

+0

デスクトップに直接描画するのがこれを行う最善の方法であるかどうかわかりません。あなたは、X11に枠線/タイトルバーがないウィンドウを持つことができ、決して最小化しないように設定し、スタックの一番下に置くことができます。私はそれがほとんどのウィジェットがやっていることだと思います。 –

+0

ここにリンクして同様のスレッドが私の助けていることだ: http://stackoverflow.com/questions/1934442/drawing-on-the-x-root-window – CommonSense

+0

が、それはあなたがxosdを見て、何をしたいかどう彼らはカイロを使いませんが、xlibだけです。 –

答えて

6

「ボトム」ウィンドウがルートウィンドウです。問題は、いくつかのデスクトップ環境では、ルートウィンドウの上にウィンドウがあるため、ルートウィンドウを変更すると変更が表示されないことです。上にあるウィンドウを変更する必要があります。

このプログラムは、あなたが求めていることを行います。ルートウィンドウに描画します。それをテストするために、私はあなたをお勧め:

  • CTRL + ALT + F1ルートとして
  • ログイン
  • 「は、デスクトップ環境( "/etc/init.d/gdm停止を" 停止は/ etc/init.dディレクトリ/ KDM停止」または任意のディストリビューションで必要とされる)
  • X -noreset -retro &
  • DISPLAY =:0.0 xtermの&
  • DISPLAY =:0.0のmetacity &

次に、X(ctrl + alt + f7またはおそらくf8)に戻り、プログラムを実行します。

ノーチラスの一番上のウィンドウに描画したい場合は、ウィンドウ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;'に変更することで別のウィンドウ(擬似テキスト)を描画することができました。 。私が気づいたことは、すべてのウィンドウでうまくいかないことです。デスクトップとChromeのIDを使用しても機能しませんでした。理由は何ですか? – gsingh2011

+0

実際には興味深いことに、タブを変更するとChromeの赤い四角形が表示され、瞬時に消える... – gsingh2011

+0

私の推測では、アプリケーションはちょうどあなたの矩形の上に描画されています。他のアプリのウィンドウで描画を開始することはできません。なぜなら、自分が行ったことの上に再び描画するタイミングを知らないからです。あなたがデスクトップの背景ですばらしいことをしたいのであれば、そこに描画するアプリケーションのソースコードを見て、それを変更することをお勧めします。または単にそれを殺す:) – pzanoni

関連する問題