Xlibに関する質問ー01ー

このエントリーをはてなブックマークに追加
497デフォルトの名無しさん:2008/03/03(月) 23:14:01
自分でライブラリ作っちゃえば良い
498デフォルトの名無しさん:2008/03/05(水) 03:41:39
Xlib を勉強しているのですが、Xt 等の上層ライブラリはC++が前提なのでしょうか?
また、Xt 等を使う場合Xlib は必要無く Xt を使うだけでプログラムが書けるのでしょうか?
プログラミング自体初心者などで良く分かりません。

このままXlib を勉強するのか、それともXt 等の上層ライブラリとそれに必要な言語(C++)
等を、勉強するか悩んでいます。
499デフォルトの名無しさん:2008/03/05(水) 21:48:44
Xlib や Xt だけなら C でOK。
Xt だけ覚えても、細かいウィンドウ処理をする場合には Xlib が必要になるので
両方勉強しておいた方がいいよ。
500デフォルトの名無しさん:2008/03/05(水) 23:57:14
ありがとうございます。
Xlibは、「X Window ハンドブック」で勉強しているのですが、Xtでお勧めの本はありますか?
日本語の書籍が希望です。
501デフォルトの名無しさん:2008/03/06(木) 00:22:04
>>500
トッパンのシリーズ。XlibもXtもみんなある。
502デフォルトの名無しさん:2008/03/06(木) 00:41:16
私の教科書だったのは「X Toolkit プログラミングテクニック」と
「実践 X-Window Ver.11 プログラミング Xlib と X ツールキット」。
まだ手に入るのかな?
503デフォルトの名無しさん:2008/03/06(木) 01:06:57
教科書がないと勉強できない人とか役に立つの?
504デフォルトの名無しさん:2008/03/06(木) 11:48:34
世の中には教科書を与えても勉強しない人がいる
505デフォルトの名無しさん:2008/03/06(木) 13:05:43
>>503
教科書を読まずにネットに転がっているサンプルコードを改変するだけ
のバカプログラマよりは、はるかにいい。
506デフォルトの名無しさん:2008/03/06(木) 13:54:38
マニュアルもドキュメントも教科書だろ?
なら、教科書が無いと俺には難しい。

役に立たなくてごめんなさい
507デフォルトの名無しさん:2008/03/07(金) 14:27:46
>>503
教科書を馬鹿にする者は、教科書に泣くぞ。
508デフォルトの名無しさん:2008/05/13(火) 23:05:49
似たような質問でてるけど、答えが出てないので、

バックグランドで走らせているシェルスクリプトから、
X上でキーボードの状態を入手する方法ありませんか?
(xev見たいな機能をWindowを出さないで実行するとかでもOK)

スクリプト実行から○○秒以内に、
X上(どこでも)で、特定のキーが押された場合に、指定したアプリケーションを実行する。
みたいなことがやりたいです。
509デフォルトの名無しさん:2008/05/14(水) 00:32:09
「Xで特定のキーが押されたことを通知するプログラム」を作り、シェルスクリプトから起動すればいいのでは?
フォーカスがないときにどうやって取得するのかは、知らん。
510デフォルトの名無しさん:2008/05/14(水) 13:28:07
この手の質問は「何々しようとして〜やってみたが××が思った通りにならない」
とでも書かれていればレスしやすいんだけどな
とりあえずヘッダでも眺めてみたら?
511508:2008/05/14(水) 20:51:00
Xevent拾おうと思ったけど、フォーカスがない場合は、無理っぽい。
Xlib全然関係ないけど、/dev/input/event0 を一定時間ごとに監視ってのを
やろうかと思ったけど、番号event*が固定されない上に、スマートに検出が難しかった感じです。
Xをフックして、キー入力を拾う方法とかないですかね?
512デフォルトの名無しさん:2008/05/14(水) 22:04:22
そもそもX端末のキーなのか実行端末のキーなのか、どっちなのかと。
513デフォルトの名無しさん:2008/05/14(水) 22:13:34
Xサーバの動いてる実端末でキーが拾えればOKです。
どっちでもOKってことですね。
タイマー処理中に、特定のキーが押された状態なのをスクリプトから
検知できるとベスト。
514デフォルトの名無しさん:2008/05/15(木) 11:31:10
acpiのイベント辺り参考にならんかな
515デフォルトの名無しさん:2008/05/15(木) 18:27:17
>>508
ウィンドウマネージャのキーアサインをカスタマイズして、外部プログラムを叩くだけで十分じゃね?
516デフォルトの名無しさん:2008/05/15(木) 19:35:50
キーの押下状態取得なら XQueryKeymap() で取得可能。
window無しでxevみたいなことをしたいのであれば、XGrabKey() を使えばおk
517デフォルトの名無しさん:2008/05/15(木) 22:34:37
XQueryKeymap()で取ってきたキーコードに
ビットフラグでフィルタして、
XKeycodeToKeysym()で行けそうですね。
後で、試してみます。
518517:2008/05/16(金) 20:17:41
XQueryKeymapで取得できました。
ちょっと、返り値の形式が特殊だったのに手こずりましたが、、、
説明の分かりにくいこと。
519デフォルトの名無しさん:2008/05/17(土) 06:42:26
せっかくのなので、サンプルコードのうpキボンヌ
520デフォルトの名無しさん:2008/05/17(土) 18:21:59
こんなのをwhileで回して、欲しいキーのコードと比較したらOKでした。
disp=XOpenDisplay(hostname); して

以下を回す。
XQueryKeymap(disp, keys);
for( i = 0; i < 32; ++i ){
  for( j = 0; j < 8 ; j++ ){
    if( keys[i] & ( 1 << j ) ){
      kcode_pushed = i*8 + j;
      KeySym kysim = XKeycodeToKeysym(disp, kcode_pushed, 1);
}
}
}
521デフォルトの名無しさん:2008/05/18(日) 02:25:23
>>519
#include <stdio.h>
#include <X11/Xlib.h>

int
main(int argc,char *argv[])
{
 int i, j;
 char keys_return[32];
 Display *display = XOpenDisplay(NULL);
 if (!display) {
  fprintf(stderr,"Cannot open display\n");
  return 1;
 }

 XQueryKeymap(display, keys_return);
 for (i = 0; i < 32; i++) {
  for (j = 0; j < 8; j++) {
   if (keys_return[i] & (1 << j)) {
    int k;
    KeyCode keycode = i * 8 + j;
    KeySym *keysym = XGetKeyboardMapping(display, keycode, 1, &k);
    if (keysym && *keysym)
     printf("%s\n", XKeysymToString(*keysym));
   }
  }
 }
 return 0;
}
522デフォルトの名無しさん:2008/05/18(日) 07:58:21
サンクスコ、あげ
523デフォルトの名無しさん:2008/05/19(月) 12:13:44
>>521
これだとCPU負荷上がりすぎるんじゃね?
524デフォルトの名無しさん:2008/05/31(土) 17:57:58
どちらかというとポインタの話なのでここでいいか迷ったのですが、質問です。
main(int argc, char *argv[]) 関数内から
makeWindow(int argc, cha *argv[]);のように作ったmakeWindow関数に
makeWindow(argc, argv); のように引数を渡し、

makeWindow関数内で
makeWindow{
Display *display;
Window window;
・・・          と書いていき、

XSetStandardProperties(display, window, "title", "icon",None, argv, argc, NULL);

のように記述した行でSegmentation faultを起こします。
何が原因なのでしょうか?
525524:2008/05/31(土) 18:14:11
すいません、解決しました。
半日悩んでこんなくらだらないミスなんて・・・orz
526デフォルトの名無しさん:2008/06/27(金) 00:05:05
XlibでCGの描画やってるんだけど
XImageより高速に描画する方法ってある?
比較的軽いシェーディングでもフレームレート落ちるんだが・・・。
XShmImage使うと多少良くなるのかな?
527デフォルトの名無しさん:2008/06/30(月) 00:30:43
空で回してみりゃどっちがネックか分かるじゃん
528526:2008/07/15(火) 00:49:19
>>527
プログラムの動作時間とか計ってみたら
XPutImage,XPutPixelがかなり時間がかかってる。
XImage使う以外で、何か良い方法ありますかね?
529デフォルトの名無しさん:2008/07/15(火) 01:23:05
早いと思うライブラリはどういう処理やってるか調べてみたらa
530デフォルトの名無しさん:2008/07/15(火) 10:51:49
昔がんばってた頃は、SHM付きのXImageが最速だった気がする。
531デフォルトの名無しさん:2008/07/15(火) 11:03:35
XPutPixel使ってる時点で無駄が多い臭い
532526:2008/07/15(火) 16:30:38
レスサンクス

>>529
一度Qt覗いてみたけど挫折したんだよな…。
もう少しがんばってみるかー

>>530
やっぱりmit-shmか。ちょっと調べて実装してみます。

>>531
XPutPixelが遅いってことは
Ximageのdataを直接いじればいいのかな?
これもちょっとやってみますー
533デフォルトの名無しさん:2008/07/16(水) 00:49:54
>>532
Xlibは、一つの関数呼び出しごとに一回のリクエストが走るものと思っておくといい。
つまり、XPutPixel()なんか使った日には一体何回リクエストが走ることになるやら。
だからこそ、線分にしろ長方形にしろ、まとめて描画する(≒リクエストを送る)関数が用意されているわけで。
534526:2008/07/17(木) 15:31:16
一応shmもdata直接いじりも実装できた。
最低限のプログラムでまわすと、実行時間の短縮が目に見えるんだけど
実際シェーディングとかを実装したプログラムに入れてみても、目に見える程違わない…
どこかおかしいのかなぁー

それと、XShmPutImageから投げられる完了イベントってどうやって拾うの?
535デフォルトの名無しさん:2008/07/17(木) 15:38:04
>>534
多分君はXlibの基本がわかってないと思う
536デフォルトの名無しさん:2008/07/18(金) 23:05:04
xlibって遅くない?
xlibつかう位なら、Java Appletで描画した方がまだ早いでしょ。
537デフォルトの名無しさん:2008/07/18(金) 23:43:23
じゃばあぷれっと(笑)
538デフォルトの名無しさん:2008/07/18(金) 23:59:45
Swing は xlib に基づいているわけだが
539デフォルトの名無しさん:2008/07/20(日) 00:41:38
>>536
そのJavaAppletは誰が描画するんだ?
540526:2008/07/22(火) 16:05:20
>>535
Xlibに関しては、描画できればいいや程度だったから
確かに基本はわかってないと思う…。
541デフォルトの名無しさん:2008/07/22(火) 18:28:09
まず完了イベントなんてのが送られてくると思ってる時点で、Xlibがどういうものかすら分かってないと思う
542526:2008/07/23(水) 00:52:41
ttp://h30266.www3.hp.com/odl/vax/japanese/jdwm126/rel/dwmrn013.htm
このサイトみて、わからなかったから質問したんだけど
でも、とりあえずそこには問題ないみたいです。
543デフォルトの名無しさん:2008/07/23(水) 01:36:39
シェーディングとやらが遅いのをXlibの所為にしたいだけだろ
544デフォルトの名無しさん:2008/07/23(水) 12:38:05
>>541
XShmPutImageは完了イベントを発生させることができるんだけど…
545デフォルトの名無しさん:2008/10/02(木) 20:14:30
時代はフレームバッファ
546デフォルトの名無しさん
>>545
そうなるのかなと思って待ってたけど、その時代はこなかったので
諦めてXlibの勉強を最近始めたよ