- 1 名前:login:Penguin [2001/07/22(日) 22:31]
- 俺の様な厨房プログラマーをある程度使えるようにまで育成して、和製糞ソフトを
大量量産するのが目的のスレッドです。 とりあえずGNOMEプログラミング(小学館)を買ってきました。 これから読んでみます。
- 239 名前:login:Penguin [03/08/25 09:48 ID:+hXUD3jL]
- (・∀・)renice!
- 240 名前:login:Penguin [03/08/28 18:06 ID:r/AujdJz]
- gtk+2ってかなり重くない?
gtk+1は再描画一瞬で終わるのにgtk+2は描画してるの見えるし。 何が悪いんだろ。utf8? xft?
- 241 名前:login:Penguin [03/08/28 18:29 ID:HlBh46Kn]
- メニューバーをクリックするとメニューが出てくる(ファイルとか編集とか)
同じ場所をもう一度クリックするとメニューが引っ込む・・・ はずなんだけど Linuxのアプリって出したメニューが引っ込まないような気がする 引っ込むようにはできないの?
- 242 名前:login:Penguin mailto:sage [03/08/28 18:34 ID:5x7m3sUW]
- gtk2を使ってちょ。
- 243 名前:login:Penguin mailto:sage [03/08/29 16:34 ID:9qGUa9Nr]
- 初心者です。どうしても気になるけれど
どこにも解説がない事があります。 なぜ GtkButton *button = gtk_button_new(); じゃなくて GtkWidget *button = gtk_button_new(); なのですか?
- 244 名前:login:Penguin mailto:sage ネタか? [03/08/29 18:52 ID:F8jx8uO3]
- gtk_button_new()が GtkWidget* を返すからだろ。
- 245 名前:243 mailto:sage [03/08/29 23:13 ID:9qGUa9Nr]
- つまりは、なぜに
GtkButton *gtk_button_new(void); でないか、ということをお聞きしたいのです。
- 246 名前:login:Penguin mailto:sage [03/08/30 00:40 ID:npfy9qpx]
- 鷲のしょーもない理解でよければ...
GtkButtonヴィジェットは、ボタンとしての側面以外にも 「ラベルとかをはりつけて表示する(Container)」とか 「シグナルを発生する」(まぁボタンとしての性質だが、ボタンに限らない) とかもある。 そこで、生成するときはGtkWidgetで生成しておき、必要に応じて キャスト(GTK_BUTTON()とか)して使う。 ボタンの性質(押されているか)を扱うときはGTK_BUTTONでキャストするし コンテナの性質(ほかのヴィジェットを貼り付ける)を扱うときは GTK_CONTAINERでキャストすることで それぞれの型のヴィジェットとして扱うことができる。
- 247 名前:login:Penguin mailto:sage [03/08/30 10:44 ID:aGRYNy0z]
- >>243
なぜなら、オブジェクト指向に則っているから。
- 248 名前:login:Penguin mailto:sage [03/08/30 11:19 ID:ooQKA+zG]
- >>247
オブジェクト指向なら new くらい継承してくれってことじゃないのか?
- 249 名前:243 mailto:sage [03/09/01 01:17 ID:uanR/ozZ]
- >>246
解説どうもです。 そこらへんの使い方は分かってるつもりなんですが、 「そこで」の部分の理由がよく分かないんです。 普段は、ButtonはButtonとして定義して、CONTAINERとして使いたい ときはそうキャストすればいいのではないかと思ったので。 >>247,248 すまん、よく分からない。(Eiffel本読書中の身です)
- 250 名前:login:Penguin mailto:sage [03/09/01 03:10 ID:6aY0iPSh]
- javaやc++と違ってcでオブジェクト指向を実現しているgtk+では
アップキャストでも明示的にキャスト用マクロが必要となる。 GtkWidget* を引数にとる関数を使う頻度の方が GtkButton* を引数にとる関数を使う頻度より多いから 最初から GtkWidget* を返した方が後々のキャスト量が減ってプログラム記述の冗長さが減る
- 251 名前:243 mailto:sage [03/09/01 12:57 ID:uanR/ozZ]
- >>250
なるほど、頻度の問題なんですね。 どうもありがとうございました。
- 252 名前:login:Penguin [03/09/01 20:35 ID:2b6fGses]
- 素朴な質問です。
gtk2でオリジナルwidgetを書いています。 親widgetでハンドルされていないイベントを追加する必要に迫られました。 (例:GDK_POINTER_MOTION_MASK) ただし、realizeイベント・ハンドラはオーバーライドしていません。 皆さんならどうしますか? 1. realizeをオーバーライドして、GdkWindowAttr構造体event_maskメンバで指定する。 2. GInstanceInitFuncハンドラ内でgtk_widget_add_events()を呼び出して追加する。 3. それ以外。
- 253 名前:login:Penguin [03/09/06 17:30 ID:E4nfQMs/]
- (・∀・)renice!
- 254 名前:login:Penguin mailto:sage [03/09/20 19:40 ID:63iWcr2P]
- (・∀・)renice!
- 255 名前:login:Penguin [03/09/22 23:08 ID:vXbOU9AM]
- VRMLオブジェクト(CG)をファイル選択widgetから選択し、
ウインドウwidgetに表示出力させたいと思っているのですが、 VRMLオブジェクトを出力出来る様なwidgetは存在するのでしょうか? もし知っている方いらっしゃいましたら、ご助言宜しくお願いします。
- 256 名前:login:Penguin mailto:sage [03/09/23 00:04 ID:C61XdUyB]
- >>255
"VRMLオブジェクトを"直接表示できるものは知らないが、 VRMLの表示部分は自分で作成するのであるというのなら、2通りの方法が 1.線や塗りつぶしが主体の場合 widget=gtk_drawing_area_new() で表示領域を確保 barwidget[trk]->window をDrawableとしてgdk_draw_rectangleなどの Gdk描画系関数を実行 Xのプログラミングに近く、色の扱いが面倒だし、再表示のたびに線とかを 描き直さなければならない(DrawableとしてPixmapを使えばいいが) 2.イメージを表示する場合 pixbuf=gdk_pixbuf_new(...); widget=gtk_image_new_from_pixbuf(pixbuf); なんかでpixbuf描画領域を確保。描画操作はpixbufに対して行う。 pixbufは1ピクセルにつきR,G,B(,A)1バイトずつのVRAMのイメージ。 色はRGB要素を指定するだけでいいが、線を引くにもどの座標に 点を打つかは計算してやらないといけない。 1,2の合わせ技として、gdk_pixbufの内容をDrawableに描く関数 (gdk_draw_rgb_image等)もあるので必要に応じて使う。
- 257 名前:login:Penguin mailto:sage [03/09/23 17:39 ID:CXvOrUVV]
- >>252
超遅レスだけど、余計なコ−ド書かない2でいいのでは。 realizeを書くケ−スは、realizeが実装されていない抽象クラス(GtkWidgetとかGtkContainer)から直に派生する時ぐらいじゃないかな。
- 258 名前:257 mailto:sage [03/09/23 17:53 ID:CXvOrUVV]
- あ−実装されてないっていうのはgdk_window_newを呼んでないって意味でつ
- 259 名前:login:Penguin [03/09/25 17:05 ID:FN6PNMc8]
- (・∀・)renice!
- 260 名前:login:Penguin mailto:sage [03/10/01 17:51 ID:OtB8zaps]
- gtktreeview上にリストのデータを表示してる時に、複数行を選択した状態で
右クリックしてメニューを表示させたいのですがどうすればいいんでしょう? 複数行の選択まではできてますが、そこで右でも左でもクリックすると複数 行の選択がクリックした行だけの選択にかわってしまいます。
- 261 名前:login:Penguin [03/10/11 23:17 ID:5hfILiTB]
- 初歩的な質問ですいません。
cygwinでGTKを使用したいため、 様々なホームページを参照した結果GTK2.0をインストールしました。 サンプルソースのインクルードの指定が #include "gtk/gtk.h" となっているのですが、今回、インストールした結果、 次のようなディレクトリ構造であった為、以下の記載に変更しました。 gtk-2.0/gtk/gtk.h これでgcc test.cを実行したところ gtk.hでincludeされている他のヘッダーファイルが参照できず、 たくさんエラーが出ました。 そこで、元々のサンプルのインクルードの記載に戻し、 gtkディレクトリを一つ上にコピーしたのですが、同様の結果でした。 すいませんが、解決方法をご教授下さい。 <サンプルソース> #include <gtk/gtk.h> int main(int argc, char* argv[]){ GtkWidget* window; GtkWidget* label; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); label = gtk_label_new("Hello World."); gtk_container_add(GTK_CONTAINER(window), label); gtk_widget_show_all(window); gtk_main(); return 0;}
- 262 名前:login:Penguin mailto:sage [03/10/11 23:44 ID:kUFRMD7K]
- cygwinのことは知らないけど、コンパイルのオプションに-Iでインクルード
ファイルのありかを教えるんじゃないの? というか pkg-config --cflags --libs gtk+-2.0 で全部勝手にやってくれる。 ドキュメントのコンパイルのあたりよんでよ。
- 263 名前:login:Penguin mailto:sage [03/10/13 16:46 ID:Y2TizDoa]
- GTK使うなら、1.2系を使えよ!
- 264 名前:login:Penguin mailto:sage [03/10/13 19:55 ID:Y2TizDoa]
- 1.2なら俺がいろいろ教えてやるぞ
- 265 名前:login:Penguin mailto:sage [03/10/13 20:55 ID:ebIrzkRx]
- 1.2って削除の方向に向かってるんですか?
- 266 名前:login:Penguin mailto:sage [03/10/13 21:24 ID:8ZoDmGS+]
- >>263
理由は?
- 267 名前:login:Penguin [03/10/14 23:23 ID:6azmQS+6]
- 初心者です。
GTKでxpmを表示することができたのですが、 xpmデータの上に、さらにxpmデータを好きな位置に 描画することってできますか? すいません、教えて下さい。
- 268 名前:login:Penguin mailto:sage [03/10/15 00:58 ID:FhH2bw4j]
- >>267
gdk_pixbuf_new_from_file で、ファイルからGdkPixbufをそれぞれ取得 gdk_pixbuf_render_to_drawable で、GdkPixbufをGdkDrawableに重ねうち GdkDrawable(pixmap)はgdk_pixmap_newで作成しておく...(1) (1)で作成したpixmapをgtk_drawing_area_newで取得したwidget->windowに exposeシグナル発生のつど転送(gdk_draw_drawable) で、いけると思う。 GdkまわりはXの知識がないと難しいかも
- 269 名前:267 [03/10/18 01:50 ID:+faUZTm8]
- >>268
ありがとうございます
- 270 名前:login:Penguin [03/10/24 19:11 ID:FhYActk9]
- age
- 271 名前:login:Penguin [03/10/26 16:31 ID:khx8YbTs]
- GTK1.2+のいろいろなホームページを見たのですが、
理解できないので教えて頂けないでしょうか。 xmp、テキストなどにウィジェットにフォーカスって当てることできますでしょうか? できるようでしたらどのような方法でしたら良いか教えて下さい。
- 272 名前:login:Penguin [03/10/26 17:21 ID:XFblFRSC]
- gtk_container_set_focus_childとか?
- 273 名前:login:Penguin mailto:sage [03/10/26 18:43 ID:Cf18t0yU]
- >>271
イベントボックスの中にGtkLabelとか入れればできる。 FAQだから、ぐぐれ。
- 274 名前:login:Penguin [03/10/28 00:46 ID:n92YYpRn]
- >>272
>>273 271です。 レス頂いてすいません。 チャレンジしてみます。
- 275 名前:login:Penguin [03/10/31 18:42 ID:IOboVxUJ]
- gtk+ではじめるXプログラミングなる本を読みながら、Gtkに入門してみました。
今、テキストエディタらしきものを作ってみようと思っています。 テキストウィジェットの横幅を半角80文字固定にしたいのですが、方法が わかりません。 また、半角80文字目で自動的に\nを挿入する方法も出来れば教えて下さい。
- 276 名前:login:Penguin mailto:sage [03/10/31 19:00 ID:XMwowiCK]
- >>275
glade で雛形を作って、生成されたソースコードを読む手もあるなぁ
- 277 名前:login:Penguin mailto:sage [03/11/01 06:11 ID:hDKdsiea]
- >>275
gdk で文字幅もらってそこからウィンドウサイズを決めるとか。 gtk つかうなら 2.* の方がよくないかい? text ウィジット も textview にかわってるようだし。
- 278 名前:login:Penguin [03/11/05 01:14 ID:a2IzLU73]
- ge
- 279 名前:login:Penguin [03/11/10 23:36 ID:SWl6gM2L]
- AGE
- 280 名前:login:Penguin [03/11/16 02:05 ID:RQO5eIp4]
- すみません。
直接Gtkと関係ないのかもしれませんが、Gnome標準アイコン(CD-ROM)等を 表示させるにはどうすればよいのでしょうか? Gladeの吐き出したソースを元に、以下のプログラムを作成してみましたが、ダメでした。 なお、事情によりGTK1.2でプログラミングを行っています。よろしくお願いします。 #include <gtk/gtk.h> int main(int argc,char *argv[]) { GtkWidget *window1; GtkWidget *image1; gtk_init(&argc,&argv); window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window1), ("window1")); image1 = gtk_image_new_from_stock ("gtk-go-up", GTK_ICON_SIZE_LARGE_TOOLBAR); gtk_widget_show (image1); gtk_container_add (GTK_CONTAINER (window1), image1); gtk_main(); return 0; }
- 281 名前:login:Penguin mailto:sage [03/11/16 09:25 ID:rEMWU24N]
- gtk_widget_show (window1);
いれれ
- 282 名前:243 mailto:sage [03/11/16 10:13 ID:ttZTK75X]
- >>280
1.2には gtk_image_new_from_stock() ないと思うんですけど。 #include <gnome.h> 入れて、あとは developer.gnome.org/doc/API/libgnomeui/gnomestock.html を見て適当にどうぞ。
- 283 名前:login:Penguin [03/11/16 12:50 ID:blYqkdPM]
- GTK+ FAQ 2003-11-05版 日本語訳
www.gnome.gr.jp/docs/gtk+faq.20031105.html
- 284 名前:280 [03/11/16 13:24 ID:RQO5eIp4]
- >>281-283
さんきす! ちょっと今日は時間がないので、明日辺り再チャレンジしてみます!
- 285 名前:280 [03/11/17 18:26 ID:YrxAFWBK]
- #include <gnome.h>
すると、ヘッダファイルが見つからないとエラーが出てしまいます。 これは、Gtkの時同様にコンパイルオプションが必要に違いない! と思って、ググって見ました。それを参考に $gcc -c -main.c `gtk-config --cflags` `gtk-config --libs` `gnome-config --cflags --libs gnomeui` として、コンパイルしてみたのですが gcc: -lgtk: リンクが完了しなかったのでリンカの入力ファイルは使われませんでした 等のエラーが出てしまいコンパイルできません。 ちょっと、Gtkからお話ずれてしまいますがどの様にコンパイルすればいいのでしょうか? なお、gnome-config --cflags --libs gnomeuiを直接実行するところちゃんと 値が帰ってきました。
- 286 名前:login:Penguin mailto:sage [03/11/17 18:34 ID:aBzY07iI]
- >>285
-cはコンパイルするだけ。
- 287 名前:login:Penguin mailto:sage [03/11/17 21:41 ID:pT6iG3D7]
- >>285
gtk-config --foo …はいらない。 gnome-configだけで十分。 ていうか「ちょっと」って、コンパイラオプションの基本中の基本すら 他人に解説させて、「だいぶ」話がずれてるよ…。 www.gnome.gr.jp/docs/gnome-libs-tutorial/building-gnome-apps.html 参照。
- 288 名前:login:Penguin [03/11/18 22:39 ID:/SRrudRK]
- いきなり質問から入ってすみません。
今、GTKを使っているのですが、リストボックスにスクロールバーをつける方法 がわかりません。私が買った本やサイトなどをみてもテキストにスクロールバーを つける方法しかありません。 hscroll=gtk_hscrollbar_new(GTK_TEXT(text)->hadj); この(GTK_TEXT(text)をGTK_LIST(listbox)変えればいいなんて安直にやってみた のですが当然のごとくstructure has nomember named 'hadj'といわれました。 リストボックスには別のメンバが用意されているのですか?それとも根本的にに間 違っているのでしょうか?どなたかご教授おねがいします><
- 289 名前:login:Penguin mailto:sage [03/11/19 00:59 ID:Wqf4YGJk]
- GtkScrollbar 使わずに GtkScrolledWindow 使う。
- 290 名前:login:Penguin mailto:sage [03/11/19 04:20 ID:yn0Z9dim]
- >>289
GtkScrolledWindowとctreeでやりたかったことができました! listboxはGtkScrolledWindowでやってもエラー?が、、きっと何かまちがって たんですね。。 ありがとうございました!
- 291 名前:280 [03/11/21 01:45 ID:S7n3MU64]
- >>287
お世話になりました。ウィンドウをGtk Window型(?)からGNOME_APP型 に変更して、無事ツールバーを実装する事が出来ました。 Linuxのプログラミング自体が初めてで、基礎的な質問をしてすみませんでした(^^;
- 292 名前:login:Penguin [03/11/24 19:03 ID:ukNjiyv7]
- GTK+ FAQ 2003-11-20版 日本語訳
www.gnome.gr.jp/docs/gtk+faq.20031120.html
- 293 名前:login:Penguin [03/11/25 04:09 ID:C+TQgfqW]
- gtk_widget_show(dialog);
func(); gtk_widget_destroy(dialog); として、func()を実行中は「実行中、、、」みたいなダイアログを表示させて おきたいのですが、うまくいきません。 実際に動かしてみると、func()は処理されるのですがdialogが表示されません。 正しくは、どうするべきでしょうか?
- 294 名前:login:Penguin mailto:sage [03/11/30 22:37 ID:ufz1QKFT]
- gtk2.xを勉強したいんだが
どっかいいサイトないかな?
- 295 名前:login:Penguin mailto:sage [03/11/30 23:04 ID:S9DI/WHa]
- >>294
developer.gnome.org/doc/ www.gnome.gr.jp/docs/
- 296 名前:login:Penguin mailto:sage [03/11/30 23:22 ID:Qt3q37KD]
- たった二つ上のレスぐらい見ろよ・・・
- 297 名前:login:Penguin mailto:sage [03/11/30 23:42 ID:tKo4rvDp]
- >>293
func の後で gtk_main() で、 func の終了時に gtk_main_quit() をよぶ。
- 298 名前:login:Penguin mailto:sage [03/12/01 01:16 ID:2vS05X6T]
- >>293の質問と似てるけれど、ソケット通信の待ち受けにwhile+selectを使おうと思いましたがどこに記述すればよいのかわかりません。
gtk_main()の上に書くと作ったwidgetが表示されず、下に書くとどうやらgtk_main_quit()が呼ばれたあとに実行されてしまいました。
- 299 名前:login:Penguin mailto:sage [03/12/01 01:23 ID:D/d2pGGk]
- >>298
そりゃそうでしょう。gtk_main()ってメイン「ループ」だよ。 ここらへんが役に立てばいいのですけれど…。 www.gnome.gr.jp/docs/gtk+-1.2.x-refs/gtk/gtk-general.html#GTK-TIMEOUT-ADD
- 300 名前:298 mailto:sage [03/12/01 03:12 ID:2vS05X6T]
- >>299さんのヒントでググって、
i = gtk_timeout_add (時間, (GtkFunction)関数, 引数) ; gtk_main (); gtk_timeout_remove(i) ; てな具合にしたら動いたみたいです。どうもありがとうございました。
- 301 名前:login:Penguin mailto:sage [03/12/01 04:32 ID:rp3RKVAH]
- >>300
gdk_input_addの方が良いと思うんだが、どうよ?
- 302 名前:gnomeユーザー [03/12/01 23:19 ID:kfK4dpcc]
- このスレを呼んで、gnome.hを使うようになった者です。
設定ファイルの読み込みから、ツールバーの作成まで容易に出来る様に なり、かなり重宝しています。 さて、そこで質問なのですがツールバーから呼び出されるコールバック関数に 引数を渡したい場合はどうすればよいですか? static GnomeUIInfo toolbar[] = { GNOMEUIINFO_ITEM_STOCK("メール送信","send mail.", send_mail(*text), GNOME_STOCK_PIXMAP_MAIL_SND), GNOMEUIINFO_END }; void send_mail(GtkWidget *text) { この関数で、テキストウィジェット*text内の文字列 を処理 } int main(...){ ... GtkWidget *text; ... } 知っていれば簡単な事の様な気もするのですが…。 宜しくお願いします。
- 303 名前:login:Penguin mailto:sage [03/12/01 23:47 ID:RoaPDgRi]
- gnome_app_create_toolbar_with_data ()
- 304 名前:login:Penguin mailto:sage [03/12/01 23:48 ID:D/d2pGGk]
- >>302
gnomerが増えてうれしい限りです。 こちらはもう見ましたか? www.gnome.gr.jp/docs/gnome-libs-tutorial/
- 305 名前:login:Penguin mailto:sage [03/12/01 23:52 ID:D/d2pGGk]
- >>301
む、自分はそれ知らなかったっす。 どんな風に良いんでしょう?
- 306 名前:gnomeユーザー [03/12/02 00:08 ID:V7ZgsjLM]
- >>303,304
ありがとうございました。 with_data() で試して見ます。
- 307 名前:gnomeユーザー [03/12/02 01:05 ID:V7ZgsjLM]
- 出来の悪い子でごめんなさい(つдT)
gnome_config_set()あたりはサンプルソースが載っていてわかりやすかったのですが・・・。 >>304のページを読んで見ましたが、わかりません。 「コールバック関数の data フィールドに引き渡される拡張パラメータを引数として呼び出して下さい。」 とあるので、 void test(GtkWidget *widget,gpointer data) {/*textウィジェットの文字数を調べてみる*/ printf("length=%d\n",gtk_text_get_length(GTK_TEXT(data))); } static GnomeUIInfo toolbar[] = { GNOMEUIINFO_ITEM_STOCK("てすと","test", test, GNOME_STOCK_PIXMAP_MAIL_SND), GNOMEUIINFO_END }; int main(int argc,char *argv[]) { GtkWidget *window,*text; gnome_app_create_toolbar_with_data (GNOME_APP (window), toolbar,text); ... } としましたが、うまく動いてくれません。なんか意味を取り違えて、勘違い してるんだとは思うんですが。
- 308 名前:login:Penguin mailto:sage [03/12/02 03:33 ID:qj4or6iA]
- >>301
ここですね。 www.kitanet.ne.jp/~asler/linux/gtk/ja/gtk_tut_ja-17.html わたしがやりたいのはソケットの待ちうけなので、ソケットディスクリプタに反応があったときに関数を呼び出すgdk_input_addのほうが適してるみたいです。 まず参考にして組んでみます。ありがとうございました。
- 309 名前:gnomeユーザー [03/12/02 15:23 ID:V7ZgsjLM]
- >>307
ちなみに gnome_app_create_toolbar_with_data (GNOME_APP (window), toolbar,(gpointer)"test"); として、コールバックで呼び出すと"test"と表示する事が出来るのでWidgetの送り方がおかしいんだとは思うんですが…。
- 310 名前:login:Penguin mailto:sage [03/12/02 15:32 ID:Rv4Kirv7]
- gnome のライブラリ使ったことないけど
printf("length=%d\n",gtk_text_get_length(GTK_TEXT((GtkWidget *)data))); とか。 void test(GtkWidget *widget,gpointer data) この widget って text じゃないのか?これまた、全く知らんのだが
- 311 名前:gnomeユーザー [03/12/03 20:30 ID:O3qA9IIV]
- 一緒に渡したい値がいくつかあったので、textもまとめて一つの構造体にして
構造体のポインタを渡すことにより、無事にtextの中身を処理できるようになりました。 ありがとうございました。
- 312 名前:gnomeユーザー [03/12/03 23:03 ID:O3qA9IIV]
- たびたびすみません。
GTKは<varargs.h>と干渉してしまうのでしょうか? 正常に動作していたプログラムに、gtk/gtk.hをインクルードすると プログラムが動作しなくなります。(インクルード文以外は一切変更なし) >>va_start(args); の部分で マクロ "va_start" は引数を 2 要求しますが、1 個しか与えられていません と、gccがエラーを吐き出してしまいます。該当行をコメントアウトすると コンパイルはできますが、やはりセグメントエラーで実行できません。 何か解決策はないでしょうか?
- 313 名前:login:Penguin mailto:sage [03/12/03 23:19 ID:X38Jttep]
- >>312
うーん、もうちょっとご自分で調べられないもんでしょか。 なぜにそんな古めかしいものを使うのでしょうか。 いにしえのANSI C(C89)から<stdarg.h>が推奨です。 そっちではva_startマクロの引数は二つです。 どのような理由があるか知りませんが、ANSI Cを前提に 書かれているGTKとそれ以前とのコードの組み合わせは、 無理が出ても仕方がないように思われます。
- 314 名前:gnomeユーザー [03/12/03 23:30 ID:O3qA9IIV]
- ちなみに、ソースの概略はこんな感じです。
int pac(va_alist) va_dcl { va_list args; va_start(args); } int main(){ ... va(pac,"test\n") ... }
- 315 名前:login:Penguin mailto:sage [03/12/04 00:09 ID:OqkJIjUR]
- >>314
はあ?
- 316 名前:gnomeユーザー [03/12/04 01:48 ID:qZ2UE2k7]
- すみません(^^;
とりあえず、自己解決しました。 古めかしいヘッダファイルだったんですね(^^; varargs.h gtkでググったんですけど、有力な手がかりがなくて。 なぜこのヘッダファイルなのかといいますと、参考文献に載っている ルーチンを使ってgnomeアプリを作っていましてその文献に載っている 通りにやっている為です。 すみませんでした。
- 317 名前:login:Penguin mailto:sage [03/12/04 04:34 ID:yhHCplv3]
- >>316
はあ?なんでstdargs.h使わんの?
- 318 名前:login:Penguin [03/12/05 00:38 ID:G4+zQR3e]
- 下のプログラムをプロファイラ(memprof)で見てみると func で確保した
ものがリークしてると出るんです。pixbuf しかないし、ポイントし続けてる つもりなんですが、どこがいけないのでしょう? #include <gtk/gtk.h> GdkPixbuf *func(void) { GdkPixbuf *pixbuf; pixbuf=gdk_pixbuf_new_from_file("file.xpm",NULL); return pixbuf; } int main (int argc, char *argv[]) { GdkPixbuf *pixbuf; gtk_init (&argc, &argv); pixbuf=func(); gtk_main (); return 0; }
- 319 名前:login:Penguin mailto:sage [03/12/05 00:48 ID:G4+zQR3e]
- ちなみに、元のプログラムからいろいろ省いたのが上ので、元の
プログラムでは、pixbuf の表示はできてます。 それと、gdk_pixbuf_new_from_file は何箇所か使ってるんですが、 2回目以降はリークがでません。
- 320 名前:login:Penguin mailto:sage [03/12/05 11:02 ID:jnR1QCBC]
- >>318
自分はgdk-pixbuf使った事無いんで自信はないですが、 使い終わったらunref()するのでは。
- 321 名前:login:Penguin mailto:sage [03/12/05 14:22 ID:G4+zQR3e]
- >>320
func や main に g_object_unref をいれてみましたが、相変わらずです。 上のプログラムでは pixbuf を使ってないですが、元のでは頻繁に利用する ツリー表示のアイコンとしてつかってるので、プログラム終了まで 解放する必要がないと思ってるんですが・・。
- 322 名前:login:Penguin mailto:sage [03/12/05 16:27 ID:10rca9Ek]
- >>320
gdk_pixbuf_unref(pixbuf); は? リファレンスマニュアル読んでないだろ。
- 323 名前:login:Penguin mailto:sage [03/12/05 18:07 ID:jnR1QCBC]
- >>322
GTK2以降のリファレンスマニュアル読んでないだろ。
- 324 名前:login:Penguin mailto:sage [03/12/05 18:50 ID:G4+zQR3e]
- Warning
gdk_pixbuf_unref is deprecated and should not be used in newly-written code. Use g_object_unref(). >>322 gtk2 なので上記のとおりなんです。
- 325 名前:318 [03/12/07 00:50 ID:XPfatUb2]
- gtk と glib のデバッグ情報付きライブラリーをくっつけてみた。
pixbuf 読み込むための外部モジュールを読み込んでるあたりが、関係してる ようだけど、俺のスキルでは読みきれません。 どなたか解説きぼん。
- 326 名前:login:Penguin mailto:sage [03/12/07 12:25 ID:TQPhdBR3]
- 他のメモリプロファイラを試してみる
- 327 名前:login:Penguin mailto:sage [03/12/09 00:21 ID:9M8YybjC]
- GListを使ってコンボボックスのリストを作成しています。
しかし実行してみると、空行ばかりリストに登録されていて文字列が表示されません。ここで2日足踏み中_| ̄|○ list_server = g_list_append(list_server, "tmp"); のように直接文字列入れると表示されるのですが、文字列変数を入れるとダメぽ。助けて・・・ 参考にしたサイト www-6.ibm.com/jp/developerworks/linux/000811/j_glib.html
- 328 名前:318 [03/12/09 00:40 ID:PATSnh0H]
- >>326
mpatrol 試した。 memprof 以上に unfreed があると指摘されまくり。 同じプログラムなのに・・。 mpatrol がよくわかってないのでもちっと修行してみやす。
- 329 名前:login:Penguin mailto:sage [03/12/09 00:44 ID:0I2itgVb]
- >>327
まずテストコード書いて試してみよう。そんでだめなら、そのテストコードをここで 晒してみれば、きっと誰か答えてくれるよ。
- 330 名前:327 mailto:sage [03/12/09 00:52 ID:9M8YybjC]
- static GList *
Load_servlist(GList *list_server) { FILE *fp ; char tmp[256] ; memset(tmp, '\0', sizeof(tmp)) ; if((fp = fopen("servlist.lst", "r")) == NULL){ printf("serverlist not found\n") ; exit(0) ; } while(1){ if(fgets(tmp, sizeof(tmp), fp) == NULL)//ファイルの終わり break ; if(tmp[1] == '\n')//空行を飛ばす continue ; tmp[strlen(tmp)-2] = '\0' ;//改行を削除 list_server = g_list_append(list_server, tmp);//リストに追加 printf("add list:%s\n", tmp) ; //ここではちゃんとファイルから読んだ文字列が表示されてる memset(tmp, '\0', sizeof(tmp)) ; } fclose(fp) ; return list_server ; } このあとに gtk_combo_set_popdown_strings(GTK_COMBO(combo_server), list_server) ;//リストを登録 gtk_widget_show (combo_server); としています。 member.nifty.ne.jp/jago/gtk/gtk05.htm ここのテストコードのコピペでは動作しましたが、文字列格納部分だけこれに差し替えたところダメでした・・・
- 331 名前:login:Penguin mailto:sage [03/12/09 01:19 ID:PATSnh0H]
- >>330
全ての要素が同じものを指してるからそうなる。 GList に追加する文字列は、それぞれにメモリーが割り当てられてる必要が ある。g_strdup(tmp) した結果を g_list_append したらどう?
- 332 名前:login:Penguin mailto:sage [03/12/09 01:28 ID:0I2itgVb]
- >>330
g_list_appendしても、list_serverには文字列がappendされるわけじゃなくて、 tmpへのポインタがappendされるだけ。で、その後ご丁寧にmemsetで'\0' を代入してるから、中身が消えちゃうと。 だから、g_list_append(list_server, g_strdup(tmp));に変更すればちゃんと 動くはず。 それと、この件とは関係ないけど、fgetsは文字列の終端にちゃんと '\0'を代入してくれるので、memsetは不要だよ。
- 333 名前:332 mailto:sage [03/12/09 01:29 ID:0I2itgVb]
- ケコーン?(;´Д`)
- 334 名前:327 mailto:sage [03/12/09 01:35 ID:9M8YybjC]
- >>331さん御指摘のとおり
list_server = g_list_append(list_server, g_strdup(tmp)); としたら出来ました。ありがとうございます。 早く漏れも質問に答えられるくらいになりたい(;´Д`)
- 335 名前:327 mailto:sage [03/12/09 01:39 ID:9M8YybjC]
- >>332
ありがとうございます&漏れのためにケコーンおめ(*´Д`) リスト追加のあとのmemsetも消すことにします。
- 336 名前:login:Penguin [03/12/11 16:46 ID:GOm24c4o]
- ちょっとお聞きしたいことがあります。
僕が使っている環境では、G_MAXINTは2147483647でlong型の最大値になっているのですが、 gtk_drawing_area_size(GTK_DRAWING_AREA(drawing_area),G_MAXINT,height); というような使い方ができません。int型の最大値の32767までしか指定できません。 これ以上大きな数を指定することは仕様上できないのでしょうか? 初心者で質問がわかりづらいかもしれませんがよろしくお願いします。
- 337 名前:login:Penguin mailto:sage [03/12/12 23:45 ID:btGr7o25]
- どうできないか書いた方がいいんじゃない。
コンパイル通らんのか、反映されないだけなのかとか・・ それと、どういう目的でそういう値にしたいかも
- 338 名前:336 [03/12/13 12:37 ID:6GbNE/xa]
- コンパイルは通ります。drawing_areaをgtk_window_new(GTK_WINDOW_TOPLEVEL)で作ったウィンドウに入れて
gtk_widget_set_usizeで最小サイズを設定しているのですが、上のようにgtk_drawing_area_sizeを実行すると設定 した最小サイズになってします。 目的は、グラフを拡大したいということです。横軸を時間軸として、その横軸を長くすることでグラフを拡大しようと しています。(なんか伝わりづらいなぁ)
- 339 名前:login:Penguin mailto:sage [03/12/13 23:25 ID:8QtS2odM]
- >>338
「なんか伝わりづらい」と感じたら、もうちょっと 文章を校正してから投稿しませう。 まず、G_MAXINTはlongではなく、intの最大値になっているはず。 自分の手元にあるGTK1.2と2.0のヘッダではどちらも、 #define G_MAXINT INT_MAX #define G_MAXLONG LONG_MAX となっています。 次に、windowの中にdrawing_areaが入っている、という構造は 理解されていますか?前者のサイズが後者より小さければ、 当然親である前者のサイズ指定が優先になります。 あるいはそういうことではないなら、コードを出した方が早いのでは。 (2.0ではdeprecatedな関数名が出ているので、GTKのバージョンは 1.2だと思いますけど、まずそれが書いてあった方がよかったかも。)
|

|