[過去ログ] SDLスレ (987レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
556: 529 [sage] 04/08/31 00:29 ID:mI6iYA96(2/2) AAS
うお、失礼。
誤:>>529
529(8): 名前は開発中のものです。 [sage] 04/08/26 22:50 ID:JtN6FZlL(2/2) AAS
あ、よく見たらビルドできてました。
いや、SDLからIMEの文字列を取得しようと思ったんですが、そのままだと
メッセージが取得できないらしくて、少しソースを書き換える必要が出てきたんですよ。
何にせよとりあえずはこれでうまく出来そうです。ありがとうございました。
正:>>554
554(1): 529 [sage] 04/08/31 00:00 ID:QiRAdHy6(1) AAS
自己解決した。
変な書き込みするから混乱しましたよ(笑
557: sgi_rocks [sage] 04/08/31 04:06 ID:hQvLtj9A(1) AAS
SDL_SysWMinfoではなくて、各々のOSからのメッセージが入ってる構造体の方を、
SDL_PeekEventかなんかで定期的にチェックするのが良いのかも、と思っています。

最初はSDL_SysWMinfoのwindowのIDを使って、イベント自体を自分でマップしようとしていたのですが、
どうもSDL自体がマップしようとしてるイベント等と衝突する可能性もありそうなので、
イベント自体はすべてSDLに任せといて、SDL_Event構造体にある、SDL_WMMsg(やったっけ?)のwindow
に対するメッセージをチェックしつつ、もしそれがIM関連だった場合のみIM関連のものを実行するのが良いかもしれません。

実際にテストでやってみて、できたらまた書きます。
OpenGL使ってる場合は、別にコンテキストが用意されてるみたいなのですが、
WindowsでのOpenGLの扱いがどうなってるかは良くわからないので時間かかるかもしれませんが・・・。
558
(1): 531 ◆pm4Rr1N8T6 [sage] 04/09/01 04:52 ID:Iu2ojuI1(1/2) AAS
GUI を使うってのは、ウィンドウシステム(この場合 Windows)標準のテキストボックスを使うって意味で、
子ウィンドウ(この場合テキストボックス)を作るために SDL_SysWMinfo を使ってるって意味で言ってたんだけど、
アプローチが違うから伝わってなかったみたいでごめん。

で、Windows 側でテキストボックス(エディットコントロール)を置いてみたんだけど、
どーしてもキーボードからの文字入力ができない。
まあよく考えると DirectX や OpenGL を使ってプライマリに描画されると
子ウィンドウは消えてしまうから元々この方法じゃ駄目かも知れないけど、
貼り付けや切り取りなんかはできるのに
一切の文字の入力ができないのはやっぱりおかしい。

と思ってソース読んでみたら、SDL め、
メッセージループでキーボードイベントを SDL の中に取り込んだあと
Windows 標準のウィンドウプロシージャーに渡さず破棄してる。
当然ウィンドウにキーボードイベントは通達されず、文字入力は不可能。
ALT+F4 での終了や ALT+SPACE でのメニュー出現が動かないのもこのせい。

そこで SDL_WMmsg を使ってみようとしたんだけど、
SDL で拾えなかったものだけを扱ってるもんだから
Windows 固有のキーボードイベントは破棄されててどうやっても取得できない。
もう一段ウィンドウプロシージャを噛ませるしか無いかな。
こりゃ大変だ……
559: 531 ◆pm4Rr1N8T6 [sage] 04/09/01 04:56 ID:Iu2ojuI1(2/2) AAS
な、長すぎる。なんかスレ違いになってきてごめん。どっか別の場所に移動するよ。
560
(2): 名前は開発中のものです。 [sage] 04/09/01 10:29 ID:Ph6g14fm(1) AAS
なんとなく。
Anthyのライブラリを使って自前で漢字変換するようにすればよいのではないかと思った。
sdlskkも同じような方式だっけ?なら同じようなのを増やしても意味無いな・・・。
561: 名前は開発中のものです。 [sage] 04/09/01 22:55 ID:M+Pa7IBI(1) AAS
>>560
意味あると思うよ。
skkは操作系がかなり独特だから対象ユーザが限られるけど、
Anthyなら普段は別のIMEを使用している人もそれほど違和感なく使えると思うし。
562
(1): sgi_rocks [sage] 04/09/02 04:11 ID:fDohgGN6(1) AAS
>>558
ゲームのWindowと別のWindowを作ってそこで入力するのであれば、
それは既にやった事があります。(gtk+-2.xを使いました)
ゲームのWindow内に直接入力したいな、と思ってます。
恐らく、SDL_ttfを使うことになると思います。

>>560
自分で変換エンジンを作ってしまうのもよいのですが、
なるべく、ユーザーが使っているIMをそのまま使えるようにしようと思っていたので、
cannaやanthyではなく、XIMやIIIMFを操作する方法を探っています。

ただ、anthyなどを使って変換してしまうのも一つの手段ですし、
比較的簡単にできるかもしれませんね。

今少し時間がなかったりするので何もできてないのですが、
とりあえず私はXIMを操作する方向でやってみる予定です。
563: 531 ◆pm4Rr1N8T6 [sage] 04/09/05 01:18 ID:O4WY3ynx(1) AAS
うごご、やっとなんとか動くもんができたよーん。
外部リンク[zip]:gamdev.org
中身の test.zip の中にサンプル入れてある。
現在 Win32 用の処理のみ。
自分で IME 処理を実装することもできるから、
フリーな IME があったら自分で機能を追加できるよ。
まだテストが不十分だからあちこちにバグがありそう。注意!

>>562
いや、Windows 標準の入力機構を使おうとしたってこと。
Windows では、テキスト入力部分もウィンドウの一種として扱われてるんだよ。

あと、SDL_ttf は仕様レベルでのバグもあるし、
文字描画エンジンをユーザーが選ぶことができなくなるからできれば使いたくないなあ。
一応、上のライブラリでは単純な変換状況取得しかできないようになってる。
ライブラリの使い方サンプルプログラムでは SDL_ttf を使って描画した。
564
(5): 名前は開発中のものです。 [sage] 04/09/05 21:21 ID:gDPcDraA(1) AAS
562ではないですが、SDL_EventからXEventへ変換して、
それをXFilterEventしてやればXIMでも大丈夫なような気がしてきたのでちょいやってみます。
565: 531 ◆pm4Rr1N8T6 [sage] 04/09/05 22:36 ID:Po72KKsf(1) AAS
外部リンク[zip]:gamdev.org
ソースがぐちゃぐちゃだったのであちこち修正。
ついでにバグを潰して間に合わせだった仕様も結構変えてしまった。
昨日のを落としてた人ごめんなさい。

>>564
がんばれー
566
(1): 564 [sage] 04/09/07 02:23 ID:aIh9QYNB(1) AAS
それっぽく動いたけど、キー取りこぼすし、終了できないし。
プロトコルとかまで調べないといかんかなぁ。。。
だれかXIMの挙動に詳しい人っている?
567: 531 ◆pm4Rr1N8T6 [sage] 04/09/07 03:52 ID:s0fkyrDg(1/2) AAS
うーん、VMware に FreeBSD 入れてみようと頑張ったけど
インストール途中でこけるなあ。

とりあえず、MacOS 9 と MacOS X の入ったマシンを一台ずつ持ってるから、
そっちで Mac 版を作ってみるよ。
Mac の IME のインターフェイスは Text Service Manager ってんだっけ。
568
(1): 531 ◆pm4Rr1N8T6 [sage] 04/09/07 03:58 ID:s0fkyrDg(2/2) AAS
外部リンク[zip]:gamdev.org
昨日バグ潰したんだった。
あと、README のメッセージに関する説明を細かくしておいた。
仕様を確定させたつもりは無いから、
ウィンドウシステム固有の問題とかあったら連絡お願い。
569
(3): sgi_rocks [sage] 04/09/08 00:55 ID:hVzmkiI8(1/2) AAS
>>568
基本的な仕様は現在ので良いと思います。
ひとつ提案があるとすれば、SDL_PollEventでイベントがなかった場合にIM関連のイベントを調べるのではなく、
User DefineなイベントをSDLのイベントキューに入れて、SDL_PollEventのループ内で他のイベントと同じように
処理できるようになればよいかな、と思いました。

>>566
私も531さんの仕様に沿った形で、XIMでの実装していたのですが、なかなか難しいですね(汗。
というのも、win32.cのように、自分でprocを作って、そっちで必要なものを処理した後、
SDLのprocにメッセージを渡す、というような形が取れれば一番良いと思うのですが、
X Window Systemでは、イベントが起こるたびに呼ばれるコールバック関数を設定する、というのはなく、
SDLが常にイベントを見るためにループしてるので、どうやってイベントをSDLより先に取得するかで悩んでます。
一応、XReparentWindowとかいう関数で、無理やり自分の作ったwindowをSDLの描写windowの親にして、
wmwindowの方はXUnmapWindow関数でマップをはずす事でなんとかSDLより先にイベントを取れるようになったのですが、
今度はXIMの仕様でなかなかわからなくて・・・。

XIMでは変換だけIMに任す、というのはできないらしく、必ず
何を入力しているのか、というのがXIMによって描写されてしまっている感じがします。
なので、変換中の文字列が取得できるにしても、すでにXIMによって画面に描写されている感じになってしまうかもしれません。
もしXやXIMに詳しい方がいらっしゃれば、その辺り教えて頂けると嬉しいです。
570
(1): sgi_rocks [sage] 04/09/08 01:07 ID:hVzmkiI8(2/2) AAS
長くてすいません(汗。
なんかサイトとか立ち上げた方が良い気がしてきたりしますがどうでしょう?
571
(3): 564 [sage] 04/09/08 03:05 ID:/gyCnV3K(1) AAS
あ、かぶってしまった >>569
外部リンク[zip]:gamdev.org
kinput2 + canna で一応動いた。test/main.cは書換え無しでほぼ同じ挙動をするはず。
skkinputでは動かなかった。
on-the-spot とかいうスタイルを使えば描画も全部アプリケーション側でいけるはず。

いちいち全部描画をアプリケーションでやるのは面倒なこともあるかもしれんので、
ネイティブなIMEウィンドウで描画する方法もあったらいいかもしれんと思う。 >>仕様

>>570
たしかに、あったら助かるかも。
572
(1): sgi_rocks [sage] 04/09/08 10:28 ID:Z7GwucVh(1/3) AAS
>>571
すごいです。Fedora Core 2(XIM + canna)で試しましたが、Windowsと同じように動作しました。
on-the-spotだとコールバック関数設定できたんですか(汗。思いつかなかったです。

一応サイトを作ってみました。
もし良かったら使って下さい。
外部リンク:p56.aaacafe.ne.jp
573
(1): sgi_rocks [sage] 04/09/08 10:35 ID:Z7GwucVh(2/3) AAS
>>571
すごいです。Fedora Core 2(XIM + canna)で試しましたが、Windowsと同じように動作しました。
on-the-spotだとコールバック関数設定できたんですか(汗。思いつかなかったです。

一応サイトを作ってみました。
もし良かったら使って下さい。
外部リンク:p56.aaacafe.ne.jp
574: 名前は開発中のものです。 [sage] 04/09/08 12:44 ID:4F4ga2pg(1/4) AAS
>>569
> どうやってイベントをSDLより先に取得するかで悩んでます。
一応こんなもんがあるよ。
外部リンク[html]:www.tacoworks.jp
ただ、これを使っても、SDL 自体の処理がタコで
ユーザーにイベントを回してこないことがある。
win32.c では SDL が一部のイベントを握り潰していたから
自分で Win32API 側のイベントを奪い取るしか無かった。
あと、アプリケーション開発側のユーザーが
SDL_inputmethod と同時に自前で SDL_SetEventFilter() を使った場合、
きちんと古い SDL_EventFilter を呼んでくれない危険性もあるね。
575: 名前は開発中のものです。 [sage] 04/09/08 13:09 ID:4F4ga2pg(2/4) AAS
>>571
おお、やった!
っていうか SDL_EventFilter 使ってたんだね。

> ネイティブなIMEウィンドウで描画する方法もあったらいいかもしれんと思う。 >>仕様
SDL_rwops や SDL_rotozoom みたいに本体と分離できないかな。
SDL_inputmethod 自体に描画を入れるのを嫌がってるのは
ユーザーに何らかの制約を課したくないだけだからなんだけど、
ほら、使わない場合にまでわざわざ SDL_ttf を入れるのって面倒じゃない。
もっとプリミティブな部分を前面に押し出していった方が
ユーザーとしても使いやすいと思ってたんだけど、そうでもないのかな。
そういう意味で
>>569
> User DefineなイベントをSDLのイベントキューに入れて、SDL_PollEventのループ内で他のイベントと同じように
> 処理できるようになればよいかな
とも考えてたんだけど、
IME 処理は SDL 本体のイベントループと別の場所で
単純に処理できた方が楽だと思ってわざと今の仕様にした。
仕様に関しては他の人の意見も参考にしたい。

>>572
あらら、SourceForge.jp にでもプロジェクト立てればいいやと思ってたんだけど、
それは大体出来てからでいいかな。
っていうか LGPL で問題無い?

>>573
おちけつ

ちょっと家に帰ったらテストプログラム修正する。
576
(1): 531,575 ◆pm4Rr1N8T6 [ID が pg sage] 04/09/08 13:11 ID:4F4ga2pg(3/4) AAS
トリップ忘れ。上司が後ろを通って焦ってしまった。
577: sgi_rocks [sage] 04/09/08 13:58 ID:Z7GwucVh(3/3) AAS
>>576
確かにSDL_inputmethod自体は描写に関するものは一切含まないようにしておいて、
もしそれが必要でありそうなら、SDL_inputmethodに対するラッパーを書く方が良いかもしれませんね。

sourceforge.jpはまったく頭に無かったです。
もしそっちでできるのであればそっちの方が良さそうですね。

SDLでIMを使いたいな、と思ったのもゲームを作ってたのが原因なので、
今作ってるものにSDL_inputmethodを使ってみます。
578: 564 [sage] 04/09/08 16:06 ID:5bciN7sZ(1) AAS
あー、ネイティブっていうのは、OSネイティブのIMっていう意味。
WindowsだったらMS-IMEの変換ウィンドウっていう意味で。

それだったらどう?
579
(1): 531 ◆pm4Rr1N8T6 [sage] 04/09/08 18:28 ID:4F4ga2pg(4/4) AAS
うーん、調べた限りだと、Windows の仕様では DirectX なんかで
プライマリバッファに描画するようにした時、
どうしても OS ネイティブなウィンドウがプライマリバッファで上書きされてしまうみたい。
Windows の場合は変換中の文字列も一つのウィンドウの中の表示という扱いで、
プライマリバッファに上書きされてしまうから、そういう条件下ではどうしても自前描画になるっぽい。

基本的な知識が足りてないから曖昧な言い方になってしまった。
わかりづらい説明ですまん。
結局 OS 自体に入力部分を描画させるのは難しいみたい。

俺の知識不足である可能性も充分に有り得るから、
誰か解決方法知ってる人がいたら情報お願い。
580: ('A`) [sage] 04/09/08 21:41 ID:il2D+HG0(1) AAS
みなさんすごいですな。影ながら応援しとります。
自分は面倒くさいのでgtk windowid hackで取り込んで
テキストウィジェット貼り付けただけですませてもたですよ('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)

外部リンク[gz]:drizzt.kilobug.org
外部リンク[zip]:www.maccormack.net
1-
あと 407 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.024s