私はウィジェットを作るためにCairo(C言語)を使ったX11環境のルートウィンドウに直接描画する方法を知っています。私はtint2のコードのいくつかの部分をコピーしましたが、それはかなり巨大で、私が持っている唯一の結果は満足できません。 私は、完全な作業サンプルコード、または少なくともいくつかのヒントや、勉強するための小さなプログラムを持っていることを嬉しく思っています。 ありがとう!デスクトップに直接描画する方法は?
答えて
「ボトム」ウィンドウがルートウィンドウです。問題は、いくつかのデスクトップ環境では、ルートウィンドウの上にウィンドウがあるため、ルートウィンドウを変更すると変更が表示されないことです。上にあるウィンドウを変更する必要があります。
このプログラムは、あなたが求めていることを行います。ルートウィンドウに描画します。それをテストするために、私はあなたをお勧め:
- 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;
}
これは私のために働いた。 xwininfoを使ってウィンドウIDを取得し、RootWindow()行を 'Window w =(Window)0x2400041;'に変更することで別のウィンドウ(擬似テキスト)を描画することができました。 。私が気づいたことは、すべてのウィンドウでうまくいかないことです。デスクトップとChromeのIDを使用しても機能しませんでした。理由は何ですか? – gsingh2011
実際には興味深いことに、タブを変更するとChromeの赤い四角形が表示され、瞬時に消える... – gsingh2011
私の推測では、アプリケーションはちょうどあなたの矩形の上に描画されています。他のアプリのウィンドウで描画を開始することはできません。なぜなら、自分が行ったことの上に再び描画するタイミングを知らないからです。あなたがデスクトップの背景ですばらしいことをしたいのであれば、そこに描画するアプリケーションのソースコードを見て、それを変更することをお勧めします。または単にそれを殺す:) – pzanoni
- 1. wxpythonで直接画面に描画する方法は?
- 2. UIImageを描画する方法または-drawRectに直接描画する方法:
- 3. パネルに直接描画する
- 4. すべてのウィンドウの上に直接描画する描画
- 5. ImageData配列に画像を直接描画する方法 - HTML5/Javascript
- 6. C++ DirectShow W32直接フレームに描画
- 7. 個人用wikiに直接描画
- 8. gpuから直接画面上に描画する
- 9. デスクトップの画像から直接ブログにドラッグ&ドロップできるブログツール
- 10. デスクトップの背景に描画する(WIN32)
- 11. デスクトップの壁紙を置き換える/デスクトップに描画する
- 12. 数字/グラフィックを画面に直接描画しますか?
- 13. Windowsデスクトップで直接ペイントする
- 14. MatlabはC++ GUIの中に直接描画します
- 15. OpenGlをビットマップに直接描画する(表示なし)
- 16. Java Swingアプリケーションをビデオに直接描画するアプローチ
- 17. Three.jsでWebGLエリアにUIエレメントを直接描画する
- 18. WPFでビットマップ(BitmapSource、WriteableBitmap)に直接描画する方法は?私はどうしたらGDI +のWinformsで
- 19. デスクトップ上のアイコンの下に描画
- 20. 描画線でグリッド項目を接続する方法は?
- 21. デスクトップ上でマウスポインタで描画します
- 22. GTKまたはGDKを使用して直接画面に描画
- 23. スクリーン/クライアント座標にテクスチャを直接描画
- 24. Lionのデスクトップにはどのように描画しますか?
- 25. ムービークリップの描画を直接管理します。 AS3
- 26. iphone:フリーハンドで描画するときにやり直し/元に戻す方法
- 27. IBOutletをUITableViewControllerからカスタムセルに直接接続する方法は?
- 28. 直線描画のScroller
- 29. 垂直ラインダウンテーブルビューを描画
- 30. パスワードフィールドを描画する方法Ember.TextFieldを描画する方法ですか?
デスクトップに直接描画するのがこれを行う最善の方法であるかどうかわかりません。あなたは、X11に枠線/タイトルバーがないウィンドウを持つことができ、決して最小化しないように設定し、スタックの一番下に置くことができます。私はそれがほとんどのウィジェットがやっていることだと思います。 –
ここにリンクして同様のスレッドが私の助けていることだ: http://stackoverflow.com/questions/1934442/drawing-on-the-x-root-window – CommonSense
が、それはあなたがxosdを見て、何をしたいかどう彼らはカイロを使いませんが、xlibだけです。 –