[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 12/05 01:38 / Filesize : 262 KB / Number-of Response : 969
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【GUI】wxWidgets(旧wxWindows) その3【サイザー】



1 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 00:06:30 ]
クロスプラットフォーム GUI ライブラリの wxWidgets (旧 wxWindows)について語りましょう。

本家
 www.wxwidgets.org/
wxWindows日本語プロジェクト
 wxwindowsjp.sourceforge.jp/
Let's wxWidgets
dot-gray.s33.xrea.com/
(*)準備中(*)
www.geocities.co.jp/SiliconValley-Cupertino/8526/
wxWindowsで始めるC++ GUIプログラミング
www.h3.dion.ne.jp/~k5_n/wxwin/
wxWidgets でクロスプラットフォーム GUIアプリを作ろう
namazu.org/~satoru/pub/uu-2004-08/
dW : Linux : wxWindowsの概要
 www-6.ibm.com/jp/developerworks/linux/010413/j_l-wxwin.html
SunWorld Online:wxWindows――無名だが成熟したGUIツールキット
 www.idg.co.jp/sw/back/200102/20010219_01_report.html

116 名前:114 mailto:sage [2007/02/27(火) 01:48:30 ]
>>115
はい。それも考えたんですが、本文の行数が多い場合に縦にスクロールさせると、
行番号表示用の行数とずれてしまうという問題があり、詰まっています。
なにかいい手はないでしょうか?

117 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 10:53:40 ]
>>116
テキストコントロールの内容を変更するたびに、
行頭に行番号を追加するようにすればいいんじゃね?

118 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 17:01:25 ]
114, 116はかなりの初心者かな?

119 名前:114 mailto:sage [2007/02/27(火) 23:27:54 ]
>>118
いままで簡単なスクリプトを書いて仕事(研究員)に使う程度だったのですが、
GUIつきのプログラムを作れば使いやすくなるし、同僚に自慢できるし、
上司によりアピールできるし。。。と思って始めたばかりです。

私のような初心者でも簡単なGUIが作れるという点ではwxwidgetsは素晴らしいと思います。
ただ、少し凝ろうとすると急にハードルが高く感じられます。今回の行番号表示など。
テキストエディタの表示オプションによくあったので、簡単に出来るのではと思ったのですが。


120 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 00:59:27 ]
> 少し凝ろうとすると急にハードルが高く感じられます。

GUIフレームワークって何でもそうです。あらゆるものを御仕着せで用意するのは無理。
用意された機能を利用して実現できればそれでいいわけで、
これくらいはまだすんなり実現できる範疇に入るでしょうよ。

>>116は要はテキストコントロールをスクロールさせたら行番号表示が一緒に
動かないからずれるってことでしょ? それなら行番号表示の方も一緒に動かせればいい。

ということで次のステップはイベント処理ですね。
テキストコントロールのスクロールが発生したときを捕捉して、そのスクロール
量を知り、行番号表示の方に指定量のスクロールをさせる。

121 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 01:09:23 ]
じゃあちょっと難しく感じるかもな。
基本的には、番号用のウインドウを作る→さもメインのパネルの一部かのように組み込む→
(位置を計算して)番号出す→スクロールイベントを取得→表示のアップデート(スクロール)
って流れかねえ。

>テキストエディタの表示オプションによくあったので
なんかこう、GUIをべたーっとした一枚の絵のように考えていたら
簡単にはできないよw

あと、この場合情報としての価値は低いが使用言語も書いたほうがいいよ。

122 名前:114 mailto:sage [2007/02/28(水) 03:32:32 ]
>>120,121
アドバイスありがとうございます。イベント処理はいままで扱ったことが
ないので、調べてみます。

>あと、この場合情報としての価値は低いが使用言語も書いたほうがいいよ。
失礼しました。
Windows XP, ActivePerl-5.8 でwxPerlを使っています。
wxPerlは比較的マイナーなようですね。

123 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 06:37:40 ]
C++ならwxScintillaがつかえるが、他の言語ではラッパーか書かないとだめかも?


124 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 13:10:52 ]
117だけど、wxpythonで作ってみた

import wx
import re

class MyApp(wx.PySimpleApp):
def OnInit(self):
Frame = wx.Frame(None, -1, "Text Edit", size=(400,400))
self.Btn = wx.Button(Frame, -1, "Set Number")
self.Btn.Bind(wx.EVT_BUTTON, self.SetNum)
self.TxtBox = wx.TextCtrl(Frame, -1, "One\nTwo\n", style=wx.TE_MULTILINE)
self.SetNum(wx.Event)
MySizer = wx.BoxSizer(wx.VERTICAL)
MySizer.Add(self.Btn, 0, wx.FIXED_MINSIZE | wx.LEFT | wx.RIGHT | wx.TOP, 20)
MySizer.Add(self.TxtBox, 1, wx.EXPAND | wx.ALL, 20)
Frame.SetSizer(MySizer)
Frame.Show(1)
return 1

(つづく)



125 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 13:13:13 ]
def SetNum(self, event):
Text = self.TxtBox.GetValue()
OldLines = Text.split('\n')
NewLines = []
Count = 1
for OldLine in OldLines:
NewLine = re.sub('^([ \d]+: )?', '%4d: ' % Count, OldLine)
NewLines.append(NewLine)
Count += 1
self.TxtBox.SetValue('\n'.join(NewLines))

app = MyApp()
app.MainLoop()

30分くらいで単純に作ったので、細かいツッコミは無しでお願いします。

126 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 23:55:44 ]
微妙だなw
つか、そのままコピペしたらエラー出たわw
おいバグかよ、って思ったら、インデントの関係だったわ。
(SetNumはMyAppクラス内なのね。)
これだからpythonはw

127 名前:114 mailto:sage [2007/03/01(木) 01:47:35 ]
>>124
ありがとうございます。こういう参考に出来るコードがあればと思っていたところでした。
ぱっと見まだよく分からないんですが、参考にさせてもらいます。

128 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 13:20:33 ]
>>126
すぐに気づけてよかったね。
これだから(ry

129 名前:デフォルトの名無しさん [2007/03/01(木) 16:19:36 ]
Winでテキスト表示が場合によって問答無用でCour何とかいう2k/XPでFontlinkしないと日本語化けるフォント使わないように直ったんですか?

130 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 16:36:26 ]
>>129
日本語でおk

131 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 20:30:47 ]
おれのエスパー能力で解析すると、
「Windowsでテキスト表示のフォントが変わったんですか?」
らしい。

132 名前:デフォルトの名無しさん [2007/03/02(金) 00:17:04 ]
変わるわけねーよ外人だもん。日本語が自分たちのフォントで表示できないことも知らないよ。

133 名前:デフォルトの名無しさん mailto:sage [2007/03/02(金) 00:54:12 ]
俺もエスパーなんだけどunicode使わないようにすれば解決する

134 名前:デフォルトの名無しさん mailto:sage [2007/03/02(金) 03:27:05 ]
エスパーだけど非Unicodeにするとたちまち駄目文字問題が出る。
予言だけど本気でコレの作者に中国人なり日本人なりが頼まないと未来永劫にわたって変更はない。




135 名前:デフォルトの名無しさん mailto:sage [2007/03/02(金) 11:08:47 ]
CourなんとかってCourierのことだな
文字化けしないフォントを使わなくなったのならいいんじゃないか
ちなみにエスパーだけど

136 名前:デフォルトの名無しさん mailto:sage [2007/03/02(金) 13:12:04 ]
じゃあ俺もエスパー。

137 名前:デフォルトの名無しさん mailto:sage [2007/03/02(金) 23:17:02 ]
きてます。きてます。

138 名前:デフォルトの名無しさん mailto:sage [2007/03/03(土) 19:44:35 ]
質問です。SpinCtrlとSliderをセットにしたコンポーネントを作りたくて、
次のようなクラスを作ったのですが、Sliderを動かしたらその値がSpinCtrlに反映させるようにイベントを作ろうとしても上手くできません
.hで
enum
{ SliderPage_Slider = 100, };

class SliderAndSpinCtrlSet: public wxBoxSizer
{
public:
SliderAndSpinCtrlSet(wxWindow *parent, const wxString& title, int sliderID, float val, float min, float max, int spinCtrlID) : wxBoxSizer(wxHORIZONTAL)
{
m_slider = new wxSlider(parent, sliderID,
val, min, max ,
wxDefaultPosition, wxDefaultSize, 0);
m_spinctrl = new wxSpinCtrl(parent, spinCtrlID, wxString::Format(_T("%d"), val),
wxDefaultPosition, wxDefaultSize,
0,
min, max, val);
Add(m_spinctrl, 0, wxALL | wxGROW, 5);
Add(m_slider, 0, wxALL | wxGROW, 5);

}
void OnSlider(wxScrollEvent& event) { hogehoge... }

として、.cppで
BEGIN_EVENT_TABLE(SliderAndSpinCtrlSet, wxBoxSizer)
EVT_COMMAND_SCROLL(SliderPage_Slider, SliderAndSpinCtrlSet::OnSlider)
END_EVENT_TABLE()

としたのですが、エラーになりました。wxBoxSizerにはsm_eventTableなどを持っていないのが原因という事は分かったのですが、代替案が見つからず困っています。

どなたか上手いやり方をご存じないでしょうか?

139 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 02:38:55 ]
wxPanelとかから継承したら?

140 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 03:13:20 ]
>>139
wxPanelだと、独立したウィンドウになってしまいませんか?
ウィンドウ内のコンポーネントとして配置できるような、SpinCtrlとSliderをセットにしたものを作りたいのですが・・・。

141 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 12:29:07 ]
最近wxWidgets忘れてるのでとりあえず思い付いたことを適当に書く
 - wxEventHandlerを継承してないとイベント扱えないのでは
 - DECLARE_EVENT_TABLE必要

まあとにかくEvent Handling Overviewくらいは読めと。

142 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 13:08:40 ]
>>141
wxEvtHanderを継承してみました。

.hで
enum
{ SliderPage_Slider = 100, };

class SliderAndSpinCtrlSet: public wxBoxSizer, wxEvtHandler
{
public:
SliderAndSpinCtrlSet(wxWindow *parent, const wxString& title, int sliderID, float val, float min, float max, int spinCtrlID) : wxBoxSizer(wxHORIZONTAL)
{
m_slider = new wxSlider(parent, sliderID,
val, min, max ,
wxDefaultPosition, wxDefaultSize, 0);
m_spinctrl = new wxSpinCtrl(parent, spinCtrlID, wxString::Format(_T("%d"), val),
wxDefaultPosition, wxDefaultSize,
0,
min, max, val);
Add(m_spinctrl, 0, wxALL | wxGROW, 5);
Add(m_slider, 0, wxALL | wxGROW, 5);

}
void OnSlider(wxScrollEvent& event) { hogehoge... }
DECLARE_EVENT_TABLE()
};
として、.cppで
BEGIN_EVENT_TABLE(SliderAndSpinCtrlSet, wxEvtHander
EVT_COMMAND_SCROLL(SliderPage_Slider, SliderAndSpinCtrlSet::OnSlider)
END_EVENT_TABLE()
としてみましたが、コンパイルは通るものの、スライダーを動かしても何の反応もありません。
どうすればいいんだ・・・。Event Handling Overview今読んでいますが、難しいですね・・・。

143 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 00:42:03 ]
多分、コントロール自身かその親ウィンドウじゃないと、
コントロールからのイベントが到達しないんじゃない?
やっぱ、wxPanel継承して、そのハンドラで受けるのがいいと思う。
そのPanelをひとつのコンポーネントとしてとらえればいいわけだし、
他パネルに配置もできるでしょ?

どうしても嫌なら、wxEvtHandler継承で、
m_slider->Connect(
SliderPage_Slider,
wxEVT_COMMAND_SLIDER_UPDATED,
wxCommandEventHandler(SliderAndSpinCtrlSet::OnSlider),
NULL, this);
とすればできる気がする。動作確認してないけど。


144 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 10:28:39 ]
>>143
wxPanel継承でできました!ありがとうございます。
というかwxPanelをコンポーネントとして配置できる事を知りませんでした。
まだ使い始めたばかりなもので・・・。



145 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 10:54:48 ]
質問です。
ウィンドウを二つ表示しているんですが、
片方で何らかの操作をした結果の値を、もう一方のウィンドウ上に配置したスライダー
等のコンポーネントにリアルタイムに反映させたいのですが、何か方法はないでしょうか。

具体的に言うと、片方はwxGLCanvasを継承したクラスで、その画面上をドラッグすると
ある値が変わるのですが、ドラッグ中にもう一方のウィンドウ(wxPanel)上の
スライダー等の表示をその値を反映したものにリアルタイムに更新したいのです。

しかし、ドラッグ中にスライダー等にSetValueで値をセットしても、そのウィンドウに
フォーカスが移動するまでスライダー等の表示が更新されません。
仕方が無いのでドラッグ中にwxPanelのSetFocus()メソッドを呼んで無理やり更新させていますが、
なんか気持ち悪いです。

他に方法はないでしょうか。

146 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 11:02:26 ]
>>145
すみません。自己解決しました。
Update()関数で更新できました。お騒がせしました(汗)

147 名前:デフォルトの名無しさん [2007/03/10(土) 00:07:38 ]
wxPanelのサイズを実行時に変更するにはどうしたらいいでしょうか?

148 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 00:35:21 ]
実行時に変更じゃわかんねーな
実行後に変更か?それともコンパイル時に指定か?

149 名前:デフォルトの名無しさん [2007/03/10(土) 00:41:52 ]
コンパイル時ではなく,アプリケーションの実行時です.
読み込んだ画像の大きさに合わせて変更するような感じです.
言葉足らずですいません..

150 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 01:14:44 ]
wxWindow::SetClientSizeかなあ

151 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 01:15:07 ]
wxImage image("foo.jpg");
panel->SetSize(image.GetWidth(), image.GetHeight());
みたいな感じでいいんじゃない?

152 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 22:42:36 ]
みなさん。
wxFrameにwxGLCanvasセットしているときって、
なぜかwxMessageBoxの表示が全面に出てこなくて、wxFrameを最小化するか、クイック起動の「デスクトップを表示」をするかしないと、
wxMessageBoxが現れなかったりしませんか?

ちなみに当方wxWidgets1.6.3使用。
1.8.2だと治ってるかなぁ・・・。

153 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 08:48:42 ]
>>152
2.8じゃなくて?

154 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 09:16:38 ]
>>153
そうでした。2.6.3使用で、2.8だと直ってるかな、でした。



155 名前:デフォルトの名無しさん mailto:sage [2007/03/29(木) 09:01:33 ]
Mac の wxPython で使ってみてるんだけど、
wx.DC.GetTextExtent() がラテン文字以外は正しい幅を返してこないようだ。
Windows だとちゃんととれるのに。
これはどこの問題なんだ?

156 名前:デフォルトの名無しさん mailto:sage [2007/04/03(火) 17:10:57 ]
wxWidgetsの問題.諦めよ.

157 名前:デフォルトの名無しさん mailto:sage [2007/04/03(火) 17:52:33 ]
べつに諦めなくても自分で書いて送りつければいいんだけどね。
結構反応はやいよ。時々永遠に放置されるけどw

実装具合はポートによって様々。
一応実装されていても細かいところで違っていて、それを吸収する
クラスを書かないといけないこともある。

158 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 16:41:07 ]
groups.yahoo.co.jp/group/wxmljp/

日本語版メーリングリストが無いから作っといた
テンプレにいれといて

159 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 00:08:15 ]
なぁなぁ
wxWidgetsってさ、UTFの扱いどうなってるな?F8とか押すとさ、たまーにゴミ文字列
挿入されるんだがあれまじキレそうになるからなんとかしたいんだけど
どうすればいい?

160 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 00:49:26 ]
コンパイラをUnicodeにすればいいんでない?

161 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 01:42:17 ]
155だけど、日本語のフォントにしたら日本語についてはちゃんと取れた。
フォントのフォールバックが起こると取れなくなるみたい。
157のいう実装上の差異というところか。直せるのかな。
wxMAC のソースをちょっと覗いてみたら、元のAPIの仕様でそうなってるようにも見える。
Mac 詳しくないのでわかんないけど。

wxて Unicode や XML に詳しい人がコアにいないんじゃないかと思うことがある。
XRC の文法もなんか素人くさいよね。size をリテラルとして指定するとことか。
Uniscribe や TextLayoutManager(だっけ?)相当の機能がつくといいんだけどな。
ワイド文字列でコンパイルしただけじゃUnicode対応とはいえなかろう。

でも古典的な範囲でふつうに使ってる分にはやりやすい。嫌いなわけではないのよ。

あとインプットメソッドまわりは日本人がやらないと絶対始まらないと思うぞ。

162 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 10:10:45 ]
ソース見てきた。Unicode実装してない
嘘Unicode絶対間違って実装してるからバグバグになる。
最悪buffer overflowとかも平気でありありな実装で
こいつら死ねよって今からメール送りまくろうと思ってます。
メインの開発者全員にしねよねハゲゴルァメールを送りつけて気を引き締めて
あげたいであります。

163 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 23:49:22 ]
>>162
そんなことよりパッチ送ってやれ。
どーせ理解できねーんだから。

164 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 04:19:49 ]
ソース見てないけど
Unicodeが問題になることといえばコードの上下関係だけじゃないの?
日本語をソートするとばらばらになるとかでしょ
基底はWindowsAPIをUnicode版に切り替えるだけだから切り替えミスでもしてない限りはOverFlowはないと思うけど
切り替えしてないならアフォだけど
LinuxとMacは単純にUnicodeAPIが無いから非対応という話ではないのか?
ちなみに一からlinuxやMacでUnicode作ろうと思ったら全部書き換えないと無理だろ



165 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 07:36:26 ]
>>164
>LinuxとMacは単純にUnicodeAPIが無い

UnicodeAPI って何だよw
もしかして Windows 以外では UTF-8 とか 16 とか弄れないと思ってるの?

166 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 13:27:31 ]
kernelレベルでデフォルトキャラセットをUnicodeにしないと無理でしょ

167 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 14:31:15 ]
ふぅん、カーネルレベルねぇ...
デフォルトキャラセットとな...
全部書き換えないと無理と...

Linux も Mac も使ったこと無いのに色々知ってるんだ
偉いねえ

168 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 16:54:12 ]
Unicodeはkernelレベルでサポートするべきものだったんだよ!

169 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 16:55:32 ]
な,なんだってーっ!

170 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 17:47:29 ]
>>168
当然そうあるべきだと思うが。
ファイルシステムやカーネルオブジェクト等に使われる名前の
エンコーディングに一貫性が無いとロクなことにならない。

名前のエンコーディングが不明では、文字列として正しく処理をしようが無い。
一方名前にエンコーディング情報も付与することにしたら無駄に
データ量が増えインタフェースも複雑化するだけ。

だから、Windows NTやPlan 9はUnicodeだよな。
Unixが時代遅れなだけ。

171 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 17:59:31 ]
一応書いておくと、カーネルモジュールでもファイルシステムとかは
Unicode 扱えないとちょっとダサイ。でもこれはユーザランドのアプリ
とは関係無い話。

172 名前:171 mailto:sage [2007/04/08(日) 18:04:28 ]
スマン。ボーッとしてたら被った。

>>170
"カーネルオブジェクト等に使われる名前" って何?
ASCII Code の範囲を超える文字を使うケースってあるの?

つか、カーネルモジュールで Unicode サポートが必要なのって
ファイルシステムだけだよね? そして普通の Un*x なら kiconv
とか(似た様な名前の)機構が既に入ってるよね?

>>170 が時代遅れなだけ?

173 名前:171 mailto:sage [2007/04/08(日) 18:12:33 ]
最後ちょっと下らない煽りっぽくなっちゃったが、カーネル内で実装されていようがいまいが、
ユーザランドのアプリで Unicode を使うには全く問題無いよ。全部書き換える必要なんて
全く無い。それと Mac も Linux もデフォで Unicode 使えるようになってるので、その意味
でも問題無い。

174 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 18:35:28 ]
いや別にネットからダウンロードしたUTF-8の文字をバッファにいれてカーネルEUCの状態で表示しようがしまいが勝手だし
そのためのクラス郡はwxWidgetsに用意されてるのだから好きにすればいいのでは?
今の話ってそういう話じゃないよね
Unicodeの入ったバッファの中身をEUCのAPIにパスして文字が化けるんですけどとかそういうこと言ってんでしょ?
そりゃ当たり前だって言ってるだけw



175 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 18:40:56 ]
strcpyとかstrlenとかAPIだよ
Unicodeの中身そのまま渡したらおかしくなるって

176 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 18:42:08 ]
>>174
>EUCのAPI

もっとくやしく。

177 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 18:51:32 ]
Windowsは2個用意してる
strcpyだとstrcpyAとstrcpyWと2種類のAPIが存在してコンパイルする時に何をベースにプログラムを動かすかで
自動的に切り替わるようになってる
linuxやMacはこういう機構が無いのだから完全にカーネル依存になる
基本的にカーネルの扱う文字コード以外ではコンパイルしてはいけない
別の文字コードを扱う時はバッファ内で変換してからすべての処理に引き渡すようにしないといけない

178 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 19:26:12 ]
>カーネル依存になる

だから、ならねっての。
C/C++ の標準ライブラリとカーネルの話をごっちゃにしてるね。
ついでに言うとロケールについても分かっちゃいない。

179 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 19:40:11 ]
kiconvって、kernel内部コードをUTF-8で統一
全てのシステムコールの界面でLC_CTYPEを使ってchar*のエンコード変換を
行うと解釈していいのかな?
それならWindowsの動作に近いんだが。

いや、kernel側にはユーザ側のLC_CTYPEは分からないか。
むしろシステムコールにラッパーかませるべき?どういう実装になってるの?

180 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 19:44:56 ]
話が全然噛み合ってねえな…

181 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 19:45:09 ]
>>177
> strcpyだとstrcpyAとstrcpyW
1. 存在しません。
2. strcpy()はWindows APIではなくC標準のランタイムライブラリです。
3. MSVC++はC標準ランタイムライブラリに対しても、TCHARベースの
 汎用テキストマッピングの仕掛けは提供しています。
 strcpy()の場合は、_tcscpy() -> strcpy() / wcscpy()です。

182 名前:179 mailto:sage [2007/04/08(日) 19:47:41 ]
よくわからないんだけど。
kiconvってカーネルパッチでしょ?
コールゲート通過後の、カーネル空間に入っちゃったただのchar*のデータを
どうエンコード変換すべきか、どうやって判断してるんだ?

Windows APIの場合は、APIのレイヤで全部UTF-16にしてるよ。
その層だと判断できるし、カーネル内部がUTF-16に閉じてクリーンになるから。

183 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 19:51:06 ]
ネット斜め読みしただけで分かった風に書くなよ…

184 名前:179 mailto:sage [2007/04/08(日) 19:56:40 ]
>>183
単純な話なんだから、分かってるのなら答えて欲しいんだけど。
・マルチユーザシステムであるUnixでは、ユーザ毎にLC_CTYPE設定が異なり得る。
 これが前提。
・何もしなければ(少なくとも昔のUnixでは)システムコールにchar*を渡せば
 それは「そのまま」kernelに素通しで渡るはず。つまり、一貫性の無い
 異なるエンコーディングの名前がkernelに渡されることになる。しかも
 kernelに渡ってしまった後はそのエンコーディングを判断するすべが無い。

 ユーザモードで呼ばれるシステムコールのCインタフェース(ラッパ)には
 呼び出し側プロセスの環境のLC_CTYPEが分かっているので、多分ロケールに
 従った変換をかけるならここがベストである、ように俺には見える。

で、
・↑のような変換を行うシステムコールラッパの仕掛けなんですか
・kernel内部はUTF-8で統一されているのですか
というのが質問。
間違っているのなら、どこがどう間違っているのか説明してほしい。



185 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 20:09:41 ]
>>184
何つーかさ、↓こういう質問が出る時点で答えるのを躊躇しちゃうのよ。

>・kernel内部はUTF-8で統一されているのですか

正直、君のレベルに合わせて回答を作るのは「単純な話」じゃないと思うよ。
誰にとっても。

186 名前:179 mailto:sage [2007/04/08(日) 20:13:21 ]
>>185
>・kernel内部はUTF-8で統一されているのですか
なぜ、この疑問がそんなに問題なの?
Windows NTは、kernelが扱う「名前」「テキスト」は、全てUTF-16だよ。
kernelの扱う名前のエンコーディングに一貫性が無いと、例えばファイルシステム
のファイル名のエンコーディングが統一されていないと、問題でしょ?
UTF-16に統一することで、そのような問題を避けつつ、ASCIIよりはるかに
大きな文字集合を無問題に扱うことが出来ているわけ。
少なくともWindowsでは。

無論ファイルの中に入っていたりネットワークを流れるデータ(バイト列)の
具体的な中身にはkernelは関与しないよ。それはユーザレベルの話。

187 名前:179 mailto:sage [2007/04/08(日) 20:19:48 ]
例えば

fd = creat(filename, 0666);
を実行した時に、

1) filenameはどこかでUTF-8に変換されますか
2) それはどこで行われますか
3) 変換されないならば、「全ての」ユーザコードが「各自」適切な
 エンコーディングを指定しない限り、
 ファイルシステムのエンコーディングの一貫性は保障されないということで
 良いですね。

ということなんだが。

188 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 20:31:18 ]
>>186
前にも書いたけどさ、符号化方式はファイルシステム固有の話であって
「カーネル内部で統一」という言い方はおかしいよね?
単に一個のカーネルモジュールに過ぎない訳だから。
君も一応マイクロカーネルな OS 使ってるんでしょ?

これはオケ?

189 名前:179 mailto:sage [2007/04/08(日) 20:52:19 ]
>>188
・非Unicodeの符号化形式を採用しているファイルシステムは、それだけで
 i18n/m17n対応においてUnicodeベースのもの(FAT32やNTFS)より劣ると
 いわざるを得ないだろう。

・ファイルシステムが非Unicodeの符号化形式を用いている場合、ファイルシステムの
 モジュールなりドライバなりが、相互変換を行うべき。そしてその層に
 それが閉じているならば、カーネルとしてはUnicodeで考えることが出来るので
 「統一」と呼べるのでは。
 統一されていれば、異なるファイルシステム上の名前を比較したり、ファイル
 システム間で名前をコピーすることの問題も無くなるし、
 ユーザの実行環境のロケールが何であろうと、そのロケールとの相互変換を
 どこかのレイヤが行いさえすれば、問題なくファイル名を取り扱うことが出来る。

・今きづいたのだが、ファイルシステムの符号化形式との間の決めウチ変換を
 行うのがkiconvの役目?もしかして。
 だとすれば、それだけではWindowsの提供する環境より
 随分劣るといわざるを得ない。

190 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 20:57:58 ]
相変わらず、話が全然噛み合ってねえな…

191 名前:179 mailto:sage [2007/04/08(日) 21:10:05 ]
>>187のような単純な質問には誰も答えてくれないの?

filenameの中身がUTF-8エンコードされていないなら、結局どうなるの?
1) EILSEQエラーなどではじかれる。
2) 普通にテキストと解釈できないへんな名前のファイルが出来る。
3) プロセス実行環境のLC_CTYPEに応じて、UTF-8に誰かが変換してくれる。
4) ファイルシステムに甚大な被害を及ぼす可能性がある。

192 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 21:14:45 ]
>>191
何答えても屁理屈こねられそうだからみんな嫌がってんだよ。

193 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 21:15:33 ]
>>187
1. いいえ
3. はい

194 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 21:16:49 ]
>>191
2



195 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 21:17:24 ]
↓勝ち誇った書き込みキター

196 名前:179 mailto:sage [2007/04/08(日) 21:19:08 ]
>>192
具体的に俺の「どの」発言が屁理屈なの。
誤っている箇所があるなら指摘してくれよ。

俺はそもそも屁理屈をこねるほど最近のLinuxのことを知らないから、
聞いてるだけなんだが。


197 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 21:21:54 ]
>>196
↓これ

>>189
>・ファイルシステムが非Unicodeの符号化形式を用いている場合、ファイルシステムの
> モジュールなりドライバなりが、相互変換を行うべき。そしてその層に
> それが閉じているならば、カーネルとしてはUnicodeで考えることが出来るので
> 「統一」と呼べるのでは。
> 統一されていれば、異なるファイルシステム上の名前を比較したり、ファイル
> システム間で名前をコピーすることの問題も無くなるし、
> ユーザの実行環境のロケールが何であろうと、そのロケールとの相互変換を
> どこかのレイヤが行いさえすれば、問題なくファイル名を取り扱うことが出来る。

198 名前:179 mailto:sage [2007/04/08(日) 21:22:24 ]
>>193, 194
教えてくれてあんがと。
んじゃ、問題ないとか言い切ってる>>171は勇み足さんかな。

事実上そのUTF-8対応したLinuxとそうでない従来型ロケールベースでは
運用方法から何から全然変わってこない?
皆が皆UTF-8に移行してるわけじゃないでしょ?

どっちでも動くプログラムとか書くの、面倒じゃないの?

199 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 21:25:00 ]
>>198
>>>171は勇み足さんかな。

勝手にあんたの持論に巻き込むな。

200 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 21:31:09 ]
>>198
>事実上そのUTF-8対応したLinuxとそうでない従来型ロケールベースでは
>運用方法から何から全然変わってこない?

誰か俺にも分かるように翻訳してくれ。

201 名前:179 mailto:sage [2007/04/08(日) 21:42:51 ]
>>200
非UTF-8カーネルでユーザ毎にLC_CTYPEが異なる昔ながらのL10N環境と、
カーネルからユーザロケールまでUTF-8を前提とした環境と、
UTF-8カーネルに従来型ロケールの環境では、
ユーザコードでiconv()やwcstombs()等を用いた変換が必要な箇所が
変わってくるんでは?と思ったんだけど。

気のせいだというのならいい。

202 名前:179 mailto:sage [2007/04/08(日) 21:43:50 ]
>>197
えーと、俺は見ての通り頭が悪いし最近のLinuxのことは知らないので、
誤りはもっとピンポイントかつ具体的に指摘してくれると嬉しいのですが。

203 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 21:54:41 ]
>>202
> 誤りはもっとピンポイントかつ具体的に指摘してくれると嬉しいのですが。
スレ違い

204 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 23:46:39 ]
よくある逃げ方だな。
ごくろーさんw



205 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 23:52:15 ]
↑捨て台詞キター

206 名前:179 mailto:sage [2007/04/09(月) 00:00:11 ]
>>204は俺ではないですよ。どうでもよいことですが。

207 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 00:54:49 ]
で結局
EUCベースのlinuxでwxWidgetsでUTF-8を用いたアプリを開発するにはどうすればよいかという話でしょ

1.wxWidgetsが馬鹿なので書き換える
2.アプリをEUCで作る
3.linuxをUTF-8に対応させる

さあどれだw

208 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 00:57:38 ]
話の発端はwxMACだっけ
ということはMACのカーネルは何のコードがデフォなんだ?

209 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 01:32:03 ]
わかってもいないし調べる気もない奴らばっかだということはよくわかったから
もうここで続けるな。どこか他所でやってくれよ。

210 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 01:55:55 ]
>>193-194を見る限り、
$ touch ほげ
とかやった場合、要するにロケール設定によって全然別の名前のファイルが
作られるわけか?
なんかもう脳死してるっていうか、どうしようもないんじゃねぇのこれ


211 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 02:04:26 ]
wow wxWidgetsの話はどこに行ったのさ?

212 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 02:04:34 ]
つか、非ASCII文字を含むファイル名を表示するまともな方法、存在すんのか?
ほげ:sjis
ほげ:euc-jp
ほげ:utf-8
みたいなファイル名が混在し得るんでしょ?
一つのファイルシステムに。

213 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 02:28:20 ]
>>211
readdir()やftsを使ってで読み取ったファイル名のリスト
をリストボックスか何かに表示したいです。
どうするのが正しいのでしょうか。

214 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 02:41:11 ]
WindowsだってeucとかUTF-8のファイル作ろうと思えば作れる罠



215 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 02:45:52 ]
リストボックスは当然ながらKDEとかGNOME依存でこれらは結局kernelの文字コードにあわしてある
kernelがEUCなら当然XシステムもEUCでフォントデータベースもEUCだからEUCのフォントインデックスじゃないと
いわゆる文字化けした状態になる

216 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 02:56:42 ]
>>215
> kernelの文字コード
> kernelがEUCなら

いみが
わかりません。

Linuxでは、文字エンコーディングを指定してカーネルを再構築するのでしょうか?
それによって、具体的にkernelの何が変わるのですか?
Unixはマルチユーザシステムですが、他のLocale設定を使いたいユーザは
どうすればよいのでしょうか?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<262KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef