• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:グラフィックスの出力ができません(Xlib,FreeBSD,KDE))

Xlibを使用した線の描画ができない問題

このQ&Aのポイント
  • Xlibを使用して線を描画するプログラムを作成しましたが、線が表示されません。
  • 他のサンプルプログラムでは線が表示されるため、コードに間違いがある可能性があります。
  • FreeBSDやKDEの環境で試しましたが、線が描画されません。どうすれば解決できるでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • kochory
  • ベストアンサー率45% (167/370)
回答No.1

よくありますねこれ。 XMapWindowは処理にけっこう時間がかかるようで、 この命令のすぐあとに描画命令を置くと、 ウインドウのマップのための処理中に 描画命令が流れてしまって、 マップされたウインドウには描画されてない ということが起こるようです。 一番簡単な対策は、XMapWindowの直後にXFlushを置いて、 さらにそのあとsleep命令や空ループなどを置いて ウインドウのマッピングが完了するであろう時間分 待つというものです。 が、これじゃあまりにもかっこ悪いので、私自身は 空ループの代わりに、Exposureイベントを拾うまで XNextEventを繰り返すループを置くことで、 ウインドウのマッピングを確認するようにしています。

noname#245945
質問者

お礼

御指南の通り sleep(1); を入れると表示されるようになりました。 また、 XNextEvent(display,&e); を入れても、今度は高速に線が描画されました。 最初にウィンドウが現れるときにもExposeイベントは飛んで来るのですね、勉強になりました。 順を追って説明していただいたのでわかりやすかったです。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • X11に関して質問です。ウィンドウの属性の情報。

    ウィンドウの属性の情報を知るプログラムを教えてください。 参考ページ:http://xjman.dsl.gr.jp/man/man3/XGetWindowAttributes.3x.html XGetWindowAttributes関数の使い方がよくわかりません。 XWindowAttributes構造体の一つ目のメンバの値を端末に表示するにはどうすればいいでしょうか? #include <X11/Xlib.h> #include <X11/Xutil.h> #include <stdio.h> #include <stdlib.h> int main() { Display *display; Window w; GC gc; XEvent event; XWindowAttributes *window_attributes_return; /* ディスプレイ・サーバに接続 */ display = XOpenDisplay(NULL); if(display == NULL){ fprintf(stderr, "Cannot open display.\n"); exit(1); } /* ウィンドウを生成 */ w = XCreateSimpleWindow(display, DefaultRootWindow(display), 50, 50, 400, 300, 1, BlackPixel(display, 0), WhitePixel(display, 0)); XSelectInput(display, w, ExposureMask); XMapWindow(display, w); /* GCの生成 */ gc = XCreateGC(display, w, 0, 0); /* リクエスト送信 */ XFlush(display); /* イベントループ */ while(1){ XNextEvent(display, &event); switch(event.type){ case Expose: XDrawLine(display, w, gc, 0, 0, 300, 300); /* ウィンドウの属性の情報を知る?? */ XGetWindowAttributes(display, w, window_attributes_return); printf("%d", window_attributes_return.x); break; } } /* Xサーバとの接続を解除 */ XCloseDisplay(display); return 0; }

  • Xlibでウィンドウを作る

    https://ja.wikipedia.org/wiki/Xlibに載っているプログラムで質問です。 ただウィンドウを表示させたい場合に /*イベントループ*/ の部分は必要なのでしょうか? この部分をなくすとウィンドウが表示されません。 イベントループがなくてもウィンドウを表示させることはできますか? /* ウィンドウに四角形を描画する簡単な Xlib アプリケーション */ #include <X11/Xlib.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { Display *d; int s; Window w; XEvent e; /* サーバとのコネクションを開く */ d=XOpenDisplay(NULL); if(d==NULL) { printf("Cannot open display\n"); exit(1); } s=DefaultScreen(d); /* ウィンドウ生成 */ w=XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 100, 100, 1, BlackPixel(d, s), WhitePixel(d, s)); /* 受け付けるイベントの種類を選択 */ XSelectInput(d, w, ExposureMask | KeyPressMask); /* ウィンドウを可視化 */ XMapWindow(d, w); /* イベントループ */ while(1) { XNextEvent(d, &e); /* ウィンドウの描画と再描画 */ if(e.type==Expose) { XFillRectangle(d, w, DefaultGC(d, s), 20, 20, 10, 10); XDrawString(d, w, DefaultGC(d, s), 50, 50, "Hello, World!",strlen("Hello, World!")); } /* キー押下で終了 */ if(e.type==KeyPress) break; } /* サーバとのコネクションを閉じる */ XCloseDisplay(d); return 0; }

  • X11に関して質問です。ウィンドウIDの表示。

    /* ウィンドウIDを表示 */ printf("%d\n", w); の部分でウィンドウID(XCreateSimpleWindow関数が返す値)を表示したいのですがエラーが出ます。 表示するにはどうすればよいでしょうか? #include <X11/Xlib.h> #include <X11/Xutil.h> #include <stdio.h> #include <stdlib.h> int main() { Display *display; Window w; /* ディスプレイ・サーバに接続 */ display = XOpenDisplay(NULL); if(display == NULL){ fprintf(stderr, "Cannot open display.\n"); exit(1); } /* ウィンドウを生成 */ w = XCreateSimpleWindow(display, DefaultRootWindow(display), 50, 50, 400, 300, 1, BlackPixel(display, 0), WhitePixel(display, 0)); /* ウィンドウIDを表示 */ printf("%d\n", w); return 0; } ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー エラー内容 ウィンドウ生成要求.c: In function ‘main’: ウィンドウ生成要求.c:24:2: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘Window’ [-Wformat=] printf("%d\n", w);

  • vine Linux4.2 X-windowのコンパイルについて

    vine Linux4.2を利用しており、X-Windowを使ってコンパイルを行ったところ エラーが多発してコンパイルできません。何か考えられる原因、あるいは解決策を御教授願えませんでしょうか。 プログラム sample.c #include <X11/Xlib.h> #define WIN_W 400 /* ウィンドウの幅 */ #define WIN_H 300 /* ウィンドウの高さ */ #define WIN_X 100 /* ウィンドウ表示位置(X) */ #define WIN_Y 100 /* ウィンドウ表示位置(Y) */ #define BORDER 2 /* ボーダの幅 */ int main( void ) { Display* dpy; /* ディスプレイ ( X サーバのこと) */ Window root; /* ルートウィンドウ ( デスクトップ ) */ Window win; /* 表示するウィンドウ */ int screen; /* スクリーン */ unsigned long black, white; /* 黒と白のピクセル値 */ XEvent evt; /* イベント構造体変数 */ /* Xサーバと接続する */ dpy = XOpenDisplay( "" ); /* ディスプレイ変数の取得 */ root = DefaultRootWindow( dpy ); screen = DefaultScreen( dpy ); /* 白、黒のピクセル値を取得 */ white = WhitePixel( dpy, screen ); black = BlackPixel( dpy, screen ); /* ウィンドウを作成する。この時点ではまだ画面に表示されない。*/ win = XCreateSimpleWindow( dpy, root, WIN_X, WIN_Y, WIN_W, WIN_H, BORDER, black, white); /* Xサーバから通知してもらうイベントを指定 ここではキー押下イベントを選択している */ XSelectInput( dpy, win, KeyPressMask ); /* ウィンドウを画面に表示する(マップする)。 */ XMapWindow( dpy, win ); /* XMoveWindow( dpy, win, WIN_X, WIN_Y ); */ /* Xサーバへのリクエストバッファをフラッシュする。 */ /* XFlush( dpy ); */ /* Xサーバからイベントを読みこんで随時処理していくイベントループ */ while( 1 ) { XNextEvent( dpy, &evt ); switch ( evt.type ) { case KeyPress: /* リソースの解放 */ XDestroyWindow( dpy, win ); XCloseDisplay( dpy ); return 0; } } } コンパイルコマンドについては gcc -I /usr/X11R6/include -L /usr/X11R6/lib -o sample sample.c -lX11 で行いました。 エラーについては /usr/X11R6/include/X11/Xlib.h:1083: 警告: data definition has no type or storage class /usr/X11R6/include/X11/Xlib.h:1085: error: 文法エラー before '*' token /usr/X11R6/include/X11/Xlib.h:1085: error: conflicting types for `font' /usr/X11R6/include/X11/Xlib.h:231: error: previous declaration of `font' /usr/X11R6/include/X11/Xlib.h:1085: 警告: data definition has no type or storage class /usr/X11R6/include/X11/Xlib.h:1085: error: 文法エラー before '}' token /usr/X11R6/include/X11/Xlib.h:1085: 警告: data definition has no type or storage class のような感じで大量にでてきています。よろしくお願いします。プログラムはネットから取ってきたものなので間違ってはいないと思います・・・。

  • Xlibでwindow型の定義はどこにありますか?

    Xlibに関する質問です。(使っているOSはLinuxの"Ubuntu 14.04.5 LTS"です。) window型の定義はどこにありますか? 下記のStandard Header Files(標準のヘッダファイル)を探しましたが見当たりませんでした。 <X11/Xlib.h> <X11/X.h> <X11/Xcms.h> <X11/Xutil.h> <X11/Xresource.h> <X11/Xatom.h> <X11/cursorfont.h> <X11/keysymdef.h> <X11/keysym.h> <X11/Xlibint.h> <X11/Xproto.h> <X11/Xprotostr.h> <X11/X10.h> Display型はXlib.hにそれらしいのがありました。 誰か知っている方教えてください。

  • Xlib.h Not Found

    postgreSQL7.1.3 RedHatLinux7.1J Tcl/Tkインターフェースのlibpgtclをインストールしようと思い、 configure→makeと進んだところ、makeにて /usr/include/tk.h:83:29: X11/Xlib.h: No such file or directory というエラーが出てしまいます。 findで全てのディレクトリーを調べてみましたが、確かにどこにもありません。 どうやったらXlib.hをインストールできるのでしょうか。

  • getcharをしながらwhile文で出力すると一つ多く出力されるので

    getcharをしながらwhile文で出力すると一つ多く出力されるのです・・・。 変な現象に遭遇しました。1文字入力して「入力した文字は~です。」とxが入力されるまで繰り返してくださいというプログラムを書きました↓ #include <stdio.h> main() { char a; do { a = getchar(); printf("入力した文字は%cです。",a); } while(a != 'x'); } ところが実行して、たとえばキーボードのaを押してenterキーを押すと 入力した文字はaです。入力した文字は です。 と表示されるのです!!「入力した文字はaです。」だけでいいのに1つ多く出力されます。このソースは間違ってますか? すみません、教えてください(涙)

  • Oracle8i for Sun SPARC Solarsi R.8.1.6 のインストールについて

    インストールをoracleユーザで実行するとエラーが表示され、 セットアップウィザードが表示されません。 どこが間違っているのでしょうか? エラーの内容は、 Xlib:connection to "163.59.205.74:0.0" refused server Xlib:Client is not authorized to connect to server java.lang.InternalError:Can't connect to X11 window server using '163.59.205.74:0.0' as the value of the DISPLAY variable. と表示されます。 どうもoracleユーザの環境変数"DISPLAY"が悪いようです。 起動は、サーバに直接接続された1つのモニターで行っていますし、 IPはそのインストールを行うサーバのIPアドレスをセットしています。 また、oracleユーザで"echo $DISPLAY"と入力すれば、 "163.59.205.74:0.0"と表示されます。 ついでに、"xhost +163.59.205.74"と入力すれば、 Xlib: connection to "163.59.205.74:0.0" refused by server Xlib: Client is not authorized to connect to Server xhost: unable to open display "163.59.205.74:0.0" と表示されます。

  • 描画出力にあたって

    単純に直線や円などを画面に描画するプログラムなのですが 参考サイトの通りに記述しても画像や文字の出力は出来るのですが線や円の描画が出来ません。 指定した位置に線、円、四角形等を画面に描画するとき 下に表記したソースに足りない宣言とかありましたら教えてください よろしくお願いします #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ ChangeWindowMode(TRUE) ; if( DxLib_Init() == -1) return -1; int white,red,g_blue; white = GetColor(255,255,255); red = GetColor(255,0,0); g_blue = GetColor(0,255,255); DrawLine(10,10,630,10,white); DrawBox(10,50,310,100,g_blue,false); DrawBox(10,150,310,200,g_blue,true); DrawCircle(500,300,100,red,true); WaitKey(); DxLib_End(); return 0; } なお参考にしたサイトは http://l.huu.cc/g/#0 です

  • cygwinでのgcc

    畏れ入ります。 UNIXどタコですm(__)m 最近CYGWINで簡単にUNIXが体験できるということで早速インストールしました。 KDEとGNOME無事起動しました。 で、実は図書館で「Xlibで簡単プログラミング」というのを借りてきたので、ちょっと遊んでみようと思いとりあえずc言語がコンパイル、実行できるかどうかやってみたのですがうまくいきませんでした。 #include <stdio.h> int main(){ printf("HelloWorld \n"); } のようなプログラムをvimで作成するところまではうまくいきました。homeディレクトリに作成されていました。 それで gcc hello.c とやればよいのですよね?! 実は文字がたくさん出て、コンパイルできたのかどうか・・・?そして、a.outというファイルができるのですよね?間違っていますでしょうか? とりあえず、できていません・・・(>_<) ./a.out としても、no fileです・・・ なにか間違っていますでしょうか?

このQ&Aのポイント
  • D582/Fパソコンの裏面にはDVIコネクタ端子がありますが、2560×1440解像度が出力可能なのか気になります。
  • D582/F製品ガイド171ページによると、DVIコネクタにDual Link対応ディスプレイを接続する場合は2560×1440解像度が可能となっていますが、実際に出力されるかどうかは不明です。
  • D582/Fパソコンのチップ種類はintel(R)HD Graphics Familyであり、アダプター文字列はintel(R)HD Graphics 2500です。
回答を見る