From: Chikara T. <c_t...@yb...> - 2005-03-03 09:02:24
|
高松です。 Gtk::Windowのset_geometry_hintsの引数がなんだかおかしな気がします。 Gdk::Geometryのみでいいんじゃないのかな、と思うのですが。 変なこと言っていたらごめんなさい。 -- Chikara Takamatsu <c_t...@yb...> |
From: Masao M. <mu...@hi...> - 2005-03-03 11:14:54
|
むとうです。 On Thu, 03 Mar 2005 18:02:25 +0900 Chikara Takamatsu <c_t...@yb...> wrote: > 高松です。 > Gtk::Windowのset_geometry_hintsの引数がなんだかおかしな気がします。 > Gdk::Geometryのみでいいんじゃないのかな、と思うのですが。 > > 変なこと言っていたらごめんなさい。 いえいえ。 おかしなところはご指摘頂いた方が助かります。 --- ご指摘の件ですが、一応、これで良いと思っています。 ちょうど、以下にRuby/GTK2チュートリアルにサンプルがあります。 http://ruby-gnome2.sourceforge.jp/ja/hiki.cgi?%A5%A6%A5%A4%A5%F3%A5%C9%A5%A6#%A5%B8%A5%AA%A5%E1%A5%C8%A5%EA%BE%F0%CA%F3%A4%F2%BB%D8%C4%EA%A4%B9%A4%EB "ジオメトリ情報を指定する"のところです。 ウインドウをリサイズするとカクカク動いたりして、 意味が分かるかと思います。ぜひ実際に動かしてみてください。 -- .:% Masao Mutoh<mu...@hi...> |
From: Chikara T. <c_t...@yb...> - 2005-03-04 19:01:06
|
高松です。 なんだか上手く言えなかったんですが、サンプルを実行して 何が違和感があったのかわかりました。 このメソッドはウィンドウがリサイズした際の挙動を変更するようですが 第一引数でウィジェットをとっていたので、このウィジェットは何?と思ったの が一つ。 「対象のウィジェット」とあるので、ウィジェットごとに何かできるのかなと ウィジェットを二つ入れて試そうとしたら怒られました。 (ウィンドウは基本的にウィジェット一つ、でした) 何で「対象のウィンドウ」ではなくて「対象のウィジェット」なんですか? 対象のウィンドウの意味ならインスタンスメソッドだから省略できると思うので すが。 もう一つがマスクの存在理由が良く分からなかったことです。 こんな感じじゃダメなんでしょうか? min_size = Gdk::Geometry.new min_size.set_min_width(100) min_size.set_min_height(100) max_size = Gdk::Geometry.new max_size.set_max_width(600) max_size.set_max_height(600) resize_inc = Gdk::Geometry.new resize_inc.set_width_inc(50) resize_inc.set_height_inc(100) geometry = min_size | max_size | resize_inc # or min_size + max_size + resize_inc window.set_geometry_hints(geometry) そのままだとGdk::WindowにGdk::Geometryから何か漏れてるような…。 # また変なことを言っているかも知れません -- Chikara Takamatsu <c_t...@yb...> |
From: Masao M. <mu...@hi...> - 2005-03-04 19:30:13
|
むとうです。 On Sat, 05 Mar 2005 04:00:38 +0900 Chikara Takamatsu <c_t...@yb...> wrote: > 高松です。 > なんだか上手く言えなかったんですが、サンプルを実行して > 何が違和感があったのかわかりました。 > > このメソッドはウィンドウがリサイズした際の挙動を変更するようですが > 第一引数でウィジェットをとっていたので、このウィジェットは何?と思ったの > が一つ。 > 「対象のウィジェット」とあるので、ウィジェットごとに何かできるのかなと > ウィジェットを二つ入れて試そうとしたら怒られました。 > (ウィンドウは基本的にウィジェット一つ、でした) > 何で「対象のウィンドウ」ではなくて「対象のウィジェット」なんですか? > 対象のウィンドウの意味ならインスタンスメソッドだから省略できると思うので > すが。 サンプルがボタン一つだったからウインドウと同じ動きをしたと 思いますが、例えば、複雑なレイアウトウィジェット上の1つの子ウィジェット を指定すると、もっとわかりやすいかもしれませんね。その場合は、ウインドウ 自体は動かないかもしれません。 1つ例を出しましょう。 ------------------ require 'gtk2' Gtk.init geometry = Gdk::Geometry.new geometry.set_min_width(100) geometry.set_min_height(100) button1 = Gtk::Button.new("OK") button2 = Gtk::Button.new("Cancel") window = Gtk::Window.new window.add(Gtk::HPaned.new.add(button1).add(button2)) #window.set_geometry_hints(window, geometry, #(1) window.set_geometry_hints(button2, geometry, #(2) Gdk::Window::HINT_MIN_SIZE) window.show_all Gtk.main ------------------ 高松さんは(1)の可能性のみに言及されていると思いますが 上のサンプルで(1),(2)を両方動かしてみて動きの違いを 見てください。 (1)の方ではWindow全体の最小値を指定していて、 (2)の方はCancelボタンの最小値を指定しているので (2)の方がウインドウ全体として見ると小さくなりません。 > もう一つがマスクの存在理由が良く分からなかったことです。 > こんな感じじゃダメなんでしょうか? > > min_size = Gdk::Geometry.new > min_size.set_min_width(100) > min_size.set_min_height(100) > > max_size = Gdk::Geometry.new > max_size.set_max_width(600) > max_size.set_max_height(600) > > resize_inc = Gdk::Geometry.new > resize_inc.set_width_inc(50) > resize_inc.set_height_inc(100) Gdk::Geometryの各デフォルト値はどうするべきでしょうか? 例えば、min_sizeにとってmin_size.max_sizeの結果は0でしょうか。 それとも-1? #今は特に初期化していなくて不定なので、変な値が返りますね。 #実用上は問題ないですけど、これは直さないといけないかな。 > geometry = min_size | max_size | resize_inc # or min_size + max_size + > resize_inc そして、この計算をしたときに、それらのデフォルト値は どう計算するのでしょうか? そういう、曖昧な部分をなくすためにもmaskがあるのは 有効だと思います。まぁ、ポリシーの違いと言えばそれまでですが。 また、maskを使えば、1つのGdk::Geometryで複数の表現を することができます。 #その使い方を推奨するわけではありませんが。 > window.set_geometry_hints(geometry) > > そのままだとGdk::WindowにGdk::Geometryから何か漏れてるような…。 ここはちょっと意味がわかりませんでした。 それでは。 -- .:% Masao Mutoh<mu...@hi...> |
From: Chikara T. <c_t...@yb...> - 2005-03-05 16:56:58
|
高松です。 丁寧な解説ありがとうございます。 > >サンプルがボタン一つだったからウインドウと同じ動きをしたと >思いますが、例えば、複雑なレイアウトウィジェット上の1つの子ウィジェット >を指定すると、もっとわかりやすいかもしれませんね。その場合は、ウインドウ >自体は動かないかもしれません。 > >1つ例を出しましょう。 > >------------------ >require 'gtk2' > >Gtk.init > >geometry = Gdk::Geometry.new >geometry.set_min_width(100) >geometry.set_min_height(100) > >button1 = Gtk::Button.new("OK") >button2 = Gtk::Button.new("Cancel") >window = Gtk::Window.new >window.add(Gtk::HPaned.new.add(button1).add(button2)) > >#window.set_geometry_hints(window, geometry, #(1) >window.set_geometry_hints(button2, geometry, #(2) > Gdk::Window::HINT_MIN_SIZE) > >window.show_all >Gtk.main >------------------ > >高松さんは(1)の可能性のみに言及されていると思いますが >上のサンプルで(1),(2)を両方動かしてみて動きの違いを >見てください。 >(1)の方ではWindow全体の最小値を指定していて、 >(2)の方はCancelボタンの最小値を指定しているので >(2)の方がウインドウ全体として見ると小さくなりません。 > これで色々試してみたのですが(2)の場合の使う場面がよくわかりません。 例えばbutton1にジオメトリヒントを設定するとなんだか予想と一致しない結果 になりますし button2の仕切りをドラッグすると最小以下になります(最小指定のメソッドが ありますが)。 button1とbutton2に同時にジオメトリヒントを設定することもできませんでした。 ウィジェット別に、ウィンドウがリサイズした場合の挙動を変更できるのかと 思ったのですが…。 > >Gdk::Geometryの各デフォルト値はどうするべきでしょうか? >例えば、min_sizeにとってmin_size.max_sizeの結果は0でしょうか。 >それとも-1? >#今は特に初期化していなくて不定なので、変な値が返りますね。 >#実用上は問題ないですけど、これは直さないといけないかな。 > > >>geometry = min_size | max_size | resize_inc # or min_size + max_size + >>resize_inc > > >そして、この計算をしたときに、それらのデフォルト値は >どう計算するのでしょうか? > >そういう、曖昧な部分をなくすためにもmaskがあるのは >有効だと思います。まぁ、ポリシーの違いと言えばそれまでですが。 > >また、maskを使えば、1つのGdk::Geometryで複数の表現を >することができます。 >#その使い方を推奨するわけではありませんが。 ええと、自分の考えでは不完全なGdk::Geometryをでっち上げて 既存ウィンドウが使っていたであろうGdk::Geometryに上書きするイメージでした。 まずGeometry.newで各デフォルト値をfalseとして初期化し、|や+を どちらかが真→真の値にする 共に偽→偽のまま どちらも真→変数の種類によって採る値を分ける (min_sizeなら1以上の小さい方の値、max_sizeなら1以上の大きい方の値...) とします。 そしてGdk::Geometryに偽でなければ上書きするインスタンスメソッドを作って set_geometry_hints内で window_geometry.merge(user_geometry) こんな感じに呼ぶと。 元となるウィンドウのジオメトリが曖昧さをカバーする…ハズです(自信無し)。 利点はもしGdk::Geometryに何か変数が増えた場合にも 変更がクラス内だけで済むだろうということ そして、ユーザーがmaskを考えなくてもいい(適当にGeometryを設定して渡せば いい) ということです。 普通変更する部分しか設定しないでしょうから…。 何度もしつこくてすいません。 # 何だか自分がどんどん間違っていってる気もする -- Chikara Takamatsu <c_t...@yb...> |
From: Masao M. <mu...@hi...> - 2005-03-05 18:13:35
|
むとうです。 On Sun, 06 Mar 2005 01:56:52 +0900 Chikara Takamatsu <c_t...@yb...> wrote: > >高松さんは(1)の可能性のみに言及されていると思いますが > >上のサンプルで(1),(2)を両方動かしてみて動きの違いを > >見てください。 > >(1)の方ではWindow全体の最小値を指定していて、 > >(2)の方はCancelボタンの最小値を指定しているので > >(2)の方がウインドウ全体として見ると小さくなりません。 > > > > これで色々試してみたのですが(2)の場合の使う場面がよくわかりません。 > 例えばbutton1にジオメトリヒントを設定するとなんだか予想と一致しない結果 > になりますし > button2の仕切りをドラッグすると最小以下になります(最小指定のメソッドが > ありますが)。 それは、私の例がたまたまGtk::HPanedを使ってるからでしょう。 その辺はあくまでもLayout Managerに依存する部分かと。 #Layout Managerとは簡単に言えば子ウィジェットを自分の中にどのように #配置するのか計算するウィジェット群です。 私の例は、あくまでもGdk::Geometryの効果がわかるように、かつ、window/widget の違いを理解して頂くための例でした。 > button1とbutton2に同時にジオメトリヒントを設定することもできませんでした。 > ウィジェット別に、ウィンドウがリサイズした場合の挙動を変更できるのかと > 思ったのですが…。 gtkwindow.cを読んで頂ければ解ると思うのですが、実はウインドウ1つにつき 1つしかGeometryを設定できません。 まぁ、こういう低レベルなAPIはそれがLayout Managerとどう影響し合うのか、 十分理解した上で使うものかと。簡単に言えばCでWidgetを作る人向けといいますか。 > >Gdk::Geometryの各デフォルト値はどうするべきでしょうか? > >例えば、min_sizeにとってmin_size.max_sizeの結果は0でしょうか。 > >それとも-1? > >#今は特に初期化していなくて不定なので、変な値が返りますね。 > >#実用上は問題ないですけど、これは直さないといけないかな。 > > > > > >>geometry = min_size | max_size | resize_inc # or min_size + max_size + > >>resize_inc > > > > > >そして、この計算をしたときに、それらのデフォルト値は > >どう計算するのでしょうか? > > > >そういう、曖昧な部分をなくすためにもmaskがあるのは > >有効だと思います。まぁ、ポリシーの違いと言えばそれまでですが。 > > > >また、maskを使えば、1つのGdk::Geometryで複数の表現を > >することができます。 > >#その使い方を推奨するわけではありませんが。 > > ええと、自分の考えでは不完全なGdk::Geometryをでっち上げて > 既存ウィンドウが使っていたであろうGdk::Geometryに上書きするイメージでした。 > まずGeometry.newで各デフォルト値をfalseとして初期化し、|や+を > どちらかが真→真の値にする > 共に偽→偽のまま > どちらも真→変数の種類によって採る値を分ける > (min_sizeなら1以上の小さい方の値、max_sizeなら1以上の大きい方の値...) > とします。 そもそもmin_sizeという数値が入るべき値にtrue/falseの概念を 持ち込むのはあまり私の好みではありません。min_size/max_sizeは0も取り得る でしょうし。 それから、その考えはこのメソッドに限れば有効ですが、他にGdk::Geometryを 使うような場面で有効かどうかというとかなり疑問です。 Gdk::Geometryをこのメソッド専用の引数を作るためのクラス、という 位置づけにしてしまっているように見受けられますが、元々、Gdk::Geometry はそれ自身がジオメトリ情報を扱うクラスです。 > そしてGdk::Geometryに偽でなければ上書きするインスタンスメソッドを作って > set_geometry_hints内で > window_geometry.merge(user_geometry) > こんな感じに呼ぶと。 > > 元となるウィンドウのジオメトリが曖昧さをカバーする…ハズです(自信無し)。 > > 利点はもしGdk::Geometryに何か変数が増えた場合にも > 変更がクラス内だけで済むだろうということ > そして、ユーザーがmaskを考えなくてもいい(適当にGeometryを設定して渡せば > いい) > ということです。 Gdk::Geometryに変数が増えた場合(って増えないと思いますが) maskを使う場合でも問題ないと思いますが...。 > 普通変更する部分しか設定しないでしょうから…。 それはたまたま先ほどのwindow/widgetの時と同じように そのような使い方を(限定して)想定してしまっている、という話だと 思いますよ。 どこからか取得したGdk::Geometryを使って云々、ということをするかも しれないですし。 > 何度もしつこくてすいません。 > > # 何だか自分がどんどん間違っていってる気もする 一応、整理しますと、 ・現時点のAPIが正しいかどうか →機能を満たしているという意味ではYes というのが私の回答で、それは認識していただけたと思っています。 次に、その後の改善策として、maskを使わないでも済む案を 提案していただいているのだと思いますが、 残念ながら、現時点では、ユーザがmaskを認識する方が確実、 というのが私の認識です。 -- .:% Masao Mutoh<mu...@hi...> |
From: Chikara T. <c_t...@yb...> - 2005-03-05 18:57:18
|
高松です。 なるほど、理解できました。 つまらない話に付き合っていただきありがとうございました。 -- Chikara Takamatsu <c_t...@yb...> |