GTK+プログラミング
gtkで外部装置から受信した温度データをグラフ描画するソフトつくってる。 左3/4が描画領域で残りに現在時刻や表示倍率の設定がある。 連続してデータ受信すると、時刻表示のタイマーがとまったり、倍率設定 のコンボボックスが操作できなくなるので、スレッド分けしようと思うのだけど expose_eventを別スレッドにすることって可能? できそうな気がするけど。 とりあえずやってみたら? >>365 作る気になれるようなことが必要なのではないですか。 >>369 すごいですね 勉強のためにぜひソースを見せて頂けないでしょうか? もしくは、ソースリストを公開しているwebページを ご存知でしたら教えてください。 ∧__∧ (´・ω・) いやどす ハ∨/^ヽ ノ::[三ノ :.、 i)、_;|*く; ノ |!: ::.".T~ ハ、___| """~""""""~"""~"""~" ブロックする可能性のある処理は別スレッドにしないと止まる Exposeを別スレッドって、ぷっ。 さすがLinux。 GTK+の本を買おうと思うんですけど、この2冊だとどちらがいいですか? ・入門GTK+ ・Foundations of GTK+ Development プログラミングはCの基礎がわかっている程度です。 PHPもやってます。 両方買えばいいじゃない。 あと、入門GTK+の方は作者がホームページで 本の内容を公開し始めてる Foundations of GTK+ Development は一部 google books にでてる >>380 両方買うと、結局一冊は読まないままになったりするタイプなので…。 あと、書籍代はケチるべきじゃないと思いますが、深刻な金欠状態なのです。 入門GTK+の作者サイトでの公開について、情報ありがとうございます。 休暇中に目を通してみようと思います。 >>381 Amazon USのレビューで「ネット上で読める」と書いてあったので、どこにあるのか気になってました。 書店になくて立ち読みできなかったので、Google Booksで読んで判断します。 どうもありがとうございました。 GTK+は公式チュートリアルが結構充実している方だと思うので、 それ読めばとりあえずリファレンスとサンプル眺めつつ使えるようになる。 それでも本が欲しくなるならあるウィジェットの使い方を 詳しく書いていて欲しいだとかマルチスレッドとの兼ね合いが 知りたいだとか(あまりいい例が出てこなくてすまん) 求めるものがはっきりしてくると思うので、 それから本を選んでもいいんじゃないだろうか。 >>383 公式チュートリアルのことを知りませんでした…。 ダウンロードできたので、スマートフォン等にコピーして移動中でも読めそうです! プリントアウトして持ち歩くのもいいかもしれません。 最終更新日が2002年10月27日と古いんですけど、問題ないですよね? 書籍を買ったほうが最後まで読みつづけようという意欲が持てる気がしますが、 とりあえず公式チュートリアルを読もうと思います。 ちなみに「Foundations of GTK+ Development」はGoogle Booksで見てみたら とても良さそうでした。 「入門GTK+」のほうは著者ページで見つからなかったです・・。 > 最終更新日が2002年10月27日と古いんですけど、問題ないですよね? ……? 公式チュートリアルは http://www.gtk.org/documentation.html でズバリ The Official Tutorial といってる http://library.gnome.org/devel/gtk-tutorial/stable/ だよ。 GTK+のソースコードのtarball中にも入ってる(docs/tutorial/以下)。 >>385 Tutorial Availabilityのページにあるリンク(ftp://ftp.gtk.org/pub/gtk/tutorial)から ダウンロードしました。 そう言うな。明日になればまたみんな仲良しななしさん 今日からGTK+を始めてみた 今までwindowsのvisual stdioしか使ったことなかったから、パスさえ通ってりゃ #g++ hello.cpp だけでコンパイルをやってくれると思っていた 今日一日かかって`pkg-config --cflags --libs gtk+-2.0`を知って ウィンドウを出せた 疲れた VisualStudioだってオプションからディレクトリの設定しなきゃ ビルドすらままならないだろうに、何言ってんだコイツ ましてやコマンドラインからCL.exe呼び出すんなら、vcvarsall.batなり vcvarsall.batで設定される環境変数群を、予めユーザー環境変数に定義して おかなければCL.exeもg++と同じエラー吐いて止まるだろうに・・・ pixmapの背景色を黒くしたキャンバスを作って その上に画像と文字を描画してて、文字は白 これに対してニコ動のコメント表示/非表示みたいなことをやりたい 文字を描画するときのみXORモードで書いてるんだけど 背景の黒の上に書かれた物は消えるけど、画像の上に書かれた 物は黒抜き去れて残ってしまう 説明わかりにくいかも知れないけど、なんか良い方法無いかな GTK+を使って記述されているソフトとしては gimp以外だとどんなものがありますか? ソースリストを読んで勉強したいのですが 2chブラウザのJDとか、画像ヴューアのgqviewとか。 ツールバーにウィンドを表示しないようにするにはどうすればいいの? linux 初心者です。C言語はバリバリです(ウィンドウズで)最近、fedora12 に乗り換え、システムを移植中なんですが、 ウィンドウ関連のところで、GTK+なるものが必要とのこと。そこで、インストールしましたが、 実際のソースコードをコンパイルしてもエラーがでます。 勉強不足の所をご指摘いただけないでしょうか? gtk+ インストール yum -y install gtk+ でインストールしました。 800KBぐらいだったと思います。 そこで、次のコードを emacs でコンパイルします。 #include <gtk/gtk.h> int main( int argc, char *argv[] ) { GtkWidget *window; gtk_init( &argc, &argv[] ); window = gtk_winidow_new( GTK_WINDOW_TOPLEVEL ); gtk_widget_show( window ); gtk_main(); return 0; } すると、error : gtk/gtk.h: そのようなファイルやディレクトリはありません。 その他これに関連するエラーがでます。 gtk/gtk.h が無いのか、と思って、 もう一度 gtk+ をインストールしようとすると、 gtk+-1.2.10-69.fc12.i686 はインストール済みか最新バージョンです 何もしません とでます。 ...よろしくお願いします。 チュートリアルどおりやれば躓かないとおもうんだけどな gtk2, gtk2-develを入れて gcc test.c -o test `pkg-config --cflags --libs gtk+-2.0` >> 401 遅くなりましてすいません。返信ありがとうございます。 うまくいきました。 ウィンドウが表示されたとき、感動しました。 でも、emacs からはコンパイルできませんでしたので、リンカーあたりの 設定かな?と思っています。 何はともあれ、ありがとうございました。 またまたお願いいたします。 linuxにおいて、 windowsの SetCursorPos() GetCursorPos() に相当するものはありますか? 参考リファレンスなど紹介してもらえれば助かります。 >>403 ttp://library.gnome.org/devel/gtk-tutorial/stable/ >>404 返信ありがとうございます。 ...勉強します。 >>402 pkg-configコマンドが何なのか調べるんだ。 はじめまして。GTK初心者です。 困っていることがあります。 gtk_init()でハングするんです。 1. gtk_init()を手動でコール出来るようプログラミングし、rc.localでそのプログラムを起動。 2. xwindow(gnome)ログイン後にgtk_init()をコールさせる。 上記の2の時点でgtk_init()でハングしているらしいです。 (gtk_init()下行のログが出力されない) 原因や対処法をご存知の方いらっしゃいませんか? >>407 突っ込みどころが3点ほど。 ・rc.localに登録して起動し、さらにログインした後にも起動・・・? ・gtk_init()だけ実行するプログラムを作ったの? だとしたら壮大な勘違いをしている。gtk_init()関数が何をする関数なのか調べるんだ。 ・「ログ」とは何のログ?ハングしているらしい、では分からないのでソースをUPするんだ。 >>408 ありがとうございます。すみません、説明不足でした。 ちょっとソースは長いので文書のみで失礼します。 プログラムは、rc.localで起動した時点ではgtk_init()をコールしない作りにしてます。 その後、ログイン後にコンソールから別プログラムを通してプロセス間通信によりコマンドを送信、 そしてコマンドを受信した時点で gtk_init()をコールさせる形にしてました。 ログは、 printf("call gtk_init\n"); gtk_init(); printf("call end\n"); ★ のようにして、★が出力されない感じです。 その後の調査で、どうやら rc.local起動させた場合、環境変数 DISPLAYなどが 全く設定されていないようです。 そこら辺に問題有りかと思っているのですが、なにぶん、勉強不足でして。 時間も無いので質問させて貰った次第です。 DISPLAYも何も、Xの起動はrc.localより後なんだぜ? プログラム分けるんじゃ駄目なんかい 時間も無いので 時間も無いので 時間も無いので 時間も無いので 時間も無いので >>409 「GTK初心者」と言うよりLinux&プログラミング初心者のようですね。 貴方にGTKはまだ早いです。環境変数やXの基本が理解できていないと 説明されても分からないと思いますので出直してきて下さい。 >>410 ありがとうございます。 inittabで初期化レベルを分けていることもあり、 てっきりrc.local前に起動処理が走っているかと勘違いしていました。 お恥ずかしい。 >>412 おっしゃるとおりです。 出直してきます。 >>414 DISPLAYが設定されてなくて、Widget使わないなら、 GObject関係を使うためだけなら、g_type_init ()すれば良いよ。 有名なエラーが出るからgtk_init()使ったってエスパーしてみた。 書籍「入門GTK+」のP31のプログラムを打ち込み、何度も確認したのですが、どうしても下記のエラーが出てしまいます。 何が間違っているのか、ご教示願います。 gtk-sample.c: In function ‘create_menu’: gtk-sample.c:64: error: ‘acitons’ undeclared (first use in this function) gtk-sample.c:64: error: (Each undeclared identifier is reported only once gtk-sample.c:64: error: for each function it appears in.) gtk_action_group_add_actionsの値でエラーが出るようです。関係する記述を確認しましたが問題ありません… エラーメッセージを読んでみましょう acitonsが宣言されていませんよ actionsと間違えていませんか? >417さん ごめんなさい、本当に気づきませんでした。エラー文を読んでいたのに…ありがとうございました gtkmmをこれからやってみようと思ってるけど、 入門GTK+を読みながらC言語で練習するより 最初からgtkmmでC++使ったほうがいい? gtkmmの入門書がないみたいなので、 取っかかりとして入門GTK+を候補にしてるんだけど…。 >>420 最終的にC++で書くのが目的なら、↓みたいなところがあるからC++で書けばいいんじゃない。 gtkまわりの日本語の情報が少ないから、言語は違うけどたまに参考にさせてもらってるよ。 http://book.geocities.jp/gtkmm_ja/docs/tutorial/html/index.html GTK+ 1.2 で作った古いツールを 2.0 で動くように手直ししてるんですが、とりあえず Makefile の中で # GTK+ 1.2 CFLAGS = `gtk-config --cflags` LIBS = `gtk-config --libs` # GTK+ 2.0 CFLAGS = `pkg-config --cflags gtk+-2.0` -DGTK_ENABLE_BROKEN -DGTK_WINDOW_DIALOG=GTK_WINDOW_TOPLEVEL LIBS = `pkg-config --libs gtk+-2.0` てな感じでお茶を濁して動かしているんですが、ソースを全面的に 2.0 対応するコストって どれほどでしょうか? 150本ほどのちまちましたツールがあって、2.0 で起こしたツールが2割程度、後の8割は、 前記のとりあえずリビルドです。 ちょっと自前で描画しようとすると、gdkとcairoが混在していて 煩雑としてるなぁ。 少なくともGDKの描画関連のAPIはもういらないだろう。 3.0辺りでばっさり消すとかしてもいいんじゃないか。 GTK(+glade)を使ったあるプログラムを ・HP-UXサーバ ・RedHat Linuxサーバ でそれぞれコンパイルおよび動作させ、 別のLinux端末に表示させたところ、 表示や動作自体は問題無いんだけども、 エディットボックスへの入力で RedHat Linuxの方は日本語入力を受け付けてくれません。 ちなみに、それぞれに入っているGTKはともに1.2です。 SCIMとかの環境は、一見同じっぽいですが・・・・ どこか見るべき箇所はあるでしょうか? ちなみに、glade自体も HP-UXは日本語入力を受け付けてLinuxサーバの方は 日本語入力を受け付けてくれません。 gladeの問題なんですかねぇ・・・? Gtk::Dialogの派生クラスを作成してある条件の時表示させています。 表示後一定期間経過したら自動的にそのダイアログを閉じたいのですが、 どうすればいいのでしょうか。 特にダイアログにこだわっているわけではありません。 何かメッセージを表示 -> 一定時間後に自動的に消去 が実現できればいいです。 よろしくお願いします。 >>427 g_timeout_add関数ではだめでしょうか? gtk_widget_drawを呼ぶとたまにアプリが落ちる 調べたらgtk2では非推奨になってた かわりにgdk_window_invalidate_rect使えって書いてあったから それ使うようにしたら、exposeイベントハンドラに入ったり入らなかったりするようになった Xawで作られたソフトのWidgetをGnomeテーマのスキンっぽく 変える方法ってありますか?Xaw3dみたいな >>427 作ってみた。たぶん、427はここを見てないだろうけど #include <gtk/gtk.h> gboolean timeout(gpointer data){ gtk_dialog_response( GTK_DIALOG(data), GTK_RESPONSE_ACCEPT ); return FALSE; }; int main (int argc, char **argv){ guint tag; GtkWidget *dialog; gtk_init (&argc, &argv); dialog = gtk_dialog_new_with_buttons ("My dialog", NULL, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); g_signal_connect_swapped (dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog); tag = g_timeout_add_seconds( 2, timeout, dialog ); gtk_widget_show_all (dialog); gtk_dialog_run(GTK_DIALOG(dialog)); g_source_remove(tag); return 0; } あるデータファイルをどんどん読んで処理しながら、1秒に1回その途中経過を Windowに表示する、みたいなプログラムを書こうとしています。 Windowに表示する部分は、gtk_main()を呼ぶ前に、g_timeout_add(1000, draw, NULL) のようにしてタイムアウト関数を使えばいいとして、データファイルを読み込んで 処理する部分は、どこに書けばいいのでしょうか? スレッドとかを使わずにやりたいのですが。 LinuxでGTK+やってる人はWindowsでも主にGTK+で書いてる? WindowsのAPIは使いませんって人いるのかな。 >>433 スレッドを使わない方がめんどくさいと思うんだけどね。 ずーっと処理し続けて一秒に一回描画するって事だと その処理の間は入力受け付け無くてもOK? その為のスレッドなんだけどなぁ。 シングルCPUでもそう言うことが出来るのがスレッドの良いところ。 それでもスレッドを使いたくないというなら、こまめにシグナル飛ばしっこ するしかないと思う。 簡単なシミュレーション用のGUIラッパ作りたんですが、 Qt4とgtkmmどっちが作るの楽ですか? どっちもバグてんこ盛りそうで、javaやM$畑に生まれたかった >>438 マジでバグテンコ盛りだからいまからでも上にJava+Swingあたりでやらせてくれって掛け合ったほうがいい。 ちゃんと上にQtもGTK+もバグテンコ盛り過ぎてプロダクションレベルに使えないって直訴するんだぞ。 >>438 vala とかどうか。バグが多いかどうかはプラットフォームに よる部分も多いと感じるが…win ならC#で組むのが楽だとは思う。 なんでこのスレ、ム板じゃないの? SDLとかはちゃんとム板でやってるのに なんでGTKはのけ者なの? いじめに合うの? >>433 g_idle_add関数がいいかも。 >>435 WindowsでもGTK+を利用してるけど、必要ならWinAPIも利用するよ ちないに、LinuxのGTK+とWindowsのそれとは挙動がちがうことがあるから 注意が必要 以前ここで質問してご教示いただいた事を参考にして、 縦書きビューワーを作ってみました。 ぽち*ろぐ: ぽちたて 0.1.0 をリリースしました ttp://pochimaru.seesaa.net/article/150542330.html Xサーバーのdepth=15bit下において以下のコードで色がおかしくなります。(例えば白がマゼンタぽくなる)firefox,gimp上やdisplay -window root では正常に見えます。 こちらの書き方が正しくないのでしょうか?それともgdk-pixbufの15bitでの処理が正しくないのでしょうか16,24bitでは正常に見えます。 (xorg-server-1.7.1,gtk+-2.21.0) #include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h> int main(int argc,char *argv[]){ Display *dpy; int scr; Window root; int depth; GC gc; GdkPixbuf *pixbuf; gint imgw,imgh; dpy = XOpenDisplay(NULL); scr = DefaultScreen(dpy); depth = DefaultDepth(dpy,scr); root = RootWindow(dpy,scr); gc = DefaultGC(dpy,scr); g_type_init(); gdk_pixbuf_xlib_init_with_depth(dpy,scr,depth); pixbuf=gdk_pixbuf_new_from_file(argv[1],NULL); imgw=gdk_pixbuf_get_width(pixbuf); imgh=gdk_pixbuf_get_height(pixbuf); gdk_pixbuf_xlib_render_to_drawable(pixbuf,root,gc,0,0,0,0,imgw,imgh,XLIB_RGB_DITHER_MAX,0,0); gdk_pixbuf_unref(pixbuf); return 0;} gdk-pixbufの新しいバージョンとソースくらは確認できるだろ? またgdk-pixbuf分離したのかめんどくせえな ValaでGTK+ vs C++でQt の構図に持って行きたい。 いやいや、Valaは良い言語だよ。 実行時に余計なライブラリとか要らないし。 gtkbuilder対応もうれしいですね。 > vala クリックする度に画像を切り替えようとして以下のようにしたところ、 2枚目の画像は表示されませんでした。 2枚目の画像を表示するには他にどのような処理が必要でしょうか? #!/usr/bin/ruby require 'gtk2' window = Gtk::Window.new window.signal_connect("destroy") {Gtk.main_quit} image = [] image[0] = Gtk::Image.new("test.s/sample7.jpg") image[1] = Gtk::Image.new("test.s/sample8.jpg") i=0 event_box = Gtk::EventBox.new event_box.add(image[0]) event_box.events = Gdk::Event::BUTTON_PRESS_MASK event_box.signal_connect("button_press_event") { event_box.remove(image[i]) i += 1 i %= 2 event_box.add(image[i]) } window.add(event_box) event_box.realize event_box.window.cursor = Gdk::Cursor.new(Gdk::Cursor::HAND1) window.show_all Gtk.main >>461 event_box.add(image[i]) event_box.show_all とか gtkでサブディスプレイにウィンドウを表示するのはどうやればいいんでしょう? メインがlocalhost:0.0でサブがlocalhost:0.1になってます。 それはX用語(GTK+でも)でスクリーンというので GtkWindowのscreenプロパティに表示したいgdkScreenを入れるんじゃないかな? GTK#なのですが、.NETのWinFormsでいう、 SuspendLayout() と ResumeLayout() はどうすればいいでしょうか? 質問です。 GtkBuilderで定義したウィンドウを複数表示するにはどうすればいいでしょうか? 一つだけだったら、gtk_builder_get_objectで取得して簡単に表示出来ます。 >>466 GtkBuilder を複数生成すればいいんじゃないの? 自分がよくやるのは、GtkBuilder を複数生成して gtk_builder_add_from_string で定義を取り込み Gtkビルダー?マイクソソフトのC++ビルダーみたいな感じか? と思って検索しようと思ったが堪えた read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる