ラベル GTK の投稿を表示しています。 すべての投稿を表示
ラベル GTK の投稿を表示しています。 すべての投稿を表示

ウィンドウにtuxを表示させる

GTK+を用いたプログラミングの基本的な手法を組み合わせて
ウィンドウにtuxを表示させるプログラムを作って見ました。
ウェブアプリは簡単にさまざまなことができて確かに楽しいですが、
やはりローカル環境でスタンドアロンで動くGTK+のCプログラミングも奥が深くて面白いですね。

//showtux.c
#include<gtk/gtk.h>

// gtk_main_quit()を呼び出すコールバック関数を作成
// typedef void* gpointer
static void button_clicked(GtkWidget *button, gpointer user_data)
{
gtk_main_quit();
}

// main関数
int main(int argc, char **argv)
{

//初期化
gtk_init(&argc, &argv);

//一番の土台となるwindowウェジェットの生成及び各種設定

//windowオブジェクトの生成
GtkWidget *window;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request(window, 300, 400);

//ツールチップヒントの作成。
// typedef gchar char gchar
gchar *text;
// gchar* gstrdup(const gchar *str);
text = g_strdup("We love linux programming!!");
gtk_widget_set_tooltip_text(window, text);

//アイコンを設定する。
gtk_window_set_default_icon_from_file("./tux.png", NULL);

//以下のスコープで画像とボタンをのせるためのバッキンボックス(vbox)を作成し、
//windowウェジェットに貼り付ける
{
GtkWidget *vbox;
vbox = gtk_vbox_new(FALSE, 2);
gtk_container_add(GTK_CONTAINER(window), vbox);

//以下のスコープで画像とボタンのウェジェットを作成し、
//パッキンボックス(vbox)上に貼り付ける。
{
GtkWidget *image;
GtkWidget *button;

image = gtk_image_new_from_file("./tux.png");
//パッキンボックス(vbox)上に貼り付ける。
gtk_box_pack_start(GTK_BOX(vbox), image, TRUE, TRUE, 0);

button = gtk_button_new_with_label("Quit");
//パッキンボックス(vbox)上に貼り付ける。
gtk_box_pack_start(GTK_BOX(vbox), button , FALSE, FALSE, 0);
//ボタンに関しては、clicked動作に際して、冒頭に作成したbutton_clicked関数を
//コールバックするように設定。
//g_sginal_connect connects a GCallback function 
//    to a signal for a particular object
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(button_clicked), NULL);
}
}

//windowを閉じられた時は、gtk_main_quitが呼び出されるようにする。
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_window_set_default_icon_from_file("tux.png", NULL);

//生成したすべてのウェジェットを可視化する。
gtk_widget_show_all(window);
//メインループの開始
gtk_main();
return 0;
}








GTKでHello, world(改)

以前書いたgtkを使用したHello, worldプログラムをもう少し機能追加を行いました。
追加項目「ツールヒントの記述」「アイコン表示」の2点です。


//hello_gtk.c
#include<gtk/gtk.h>

int main(int argc, char **argv){
GtkWidget *window;

//ウィンドウウェジェットを作成。
gtk_init(&argc, &argv);
//ウィンドウウェジェットを作成。
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
//ウィンドウのサイズを規程。
gtk_widget_set_size_request(window, 500, 600);
//ウィンドウのタイトルを規定する。
gtk_window_set_title(GTK_WINDOW(window), "Hello, world in GTK!!");
//カレントディレクトリに置いてあるファイルを読み込んでアイコンにする。
gtk_window_set_default_icon_from_file("./tux.png", NULL);
//ウィンドウを閉じたときの処理を規定する。
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
//ウィンドウを表示
gtk_widget_show(window);

//ツールチップヒントの作成。
gchar *text = g_strdup("Hello, world in GTK");
gtk_widget_set_tooltip_text(window, text);
        g_free(text);


//メインループ開始。
gtk_main();
return 0;
}





コマンドライン引数が指定する画像をウィンドウに表示させるプログラムです。

画像ウェジェットを作成してバッキンボックス上に張り付けてあげればOKです。


/* gtk_picutre.c */
#include<gtk/gtk.h>
#include<stdlib.h> //exit

int main(int argc, char *argv[]){

//引数のエラー処理
if(argc!=2){
g_print("Usage: %s image-file\n", argv[0]);
exit(1);
}


GtkWidget *window;

//gtk+を初期化
gtk_init(&argc, &argv);

//ウィンドウェジェットを作成
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

//ウィンドウの大きさを指定
gtk_widget_set_size_request(window, 600, 400);

//パッキンボックスを作成
GtkWidget *vbox;
vbox = gtk_vbox_new(FALSE,2);

//パッキンボックスをwindowに貼り付ける
gtk_container_add(GTK_CONTAINER(window), vbox);


//画像ウェジェットを作成
GtkWidget *image;
//コマンドライン引数が指定するファイルから画像ウェジェットを作成
image = gtk_image_new_from_file(argv[1]);
//画像ウェジェットをvboxの上半分に貼り付ける
gtk_box_pack_start(GTK_BOX(vbox), image, TRUE, TRUE, 0);

//ボタンを作成
GtkWidget *button;
button = gtk_button_new_with_label("quit");

//ボタンをクリックした時のコールバック関数を登録
g_signal_connect(G_OBJECT(button), "clicked",      G_CALLBACK(gtk_main_quit),NULL);

//buttonをvboxの下半分に貼り付ける
gtk_box_pack_start(GTK_BOX(vbox), button, FALSE,FALSE, 0);


//ウィンドを閉じたときにプログラムを終了するようにコールバックする。
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

//ウィンドウ上のウェジェットをすべて表示(gtk_widget_show_all)
gtk_widget_show_all(window);

gtk_main();

return 0;
}


#使用例
#引数を与えないとエラーがでます
$ ./gtk_picture 
Usage: ./gtk_picture image-file

#current directoryにtux.pngという画像ファイルを置いた状態で以下のように引数をつけてプログラムを実行
$ ./gtk_picture tux.png




バッキングボックスを使って二つのボタンをウィンドウに貼り付ける


ウィンドウウェジェットに直接貼り付けられるウェジェットは1つに限られています。
そこで、いくつでもウェジェットの貼り付けが可能なバッキングボックスというインターフェースを一枚用意し、それをウィンドウウェジェットに張るようにします。


#include<gtk/gtk.h>

int main(int argc, char *argv[]){
GtkWidget *window;

//gtk+を初期化
gtk_init(&argc, &argv);

//ウィンドウェジェットを作成
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

//ウィンドウの大きさを指定
gtk_widget_set_size_request(window, 600, 400);

//パッキンボックスを作成
GtkWidget *vbox;
vbox = gtk_vbox_new(FALSE,2);

//パッキンボックスをwindowに貼り付ける
gtk_container_add(GTK_CONTAINER(window), vbox);


//ボタンを作成
GtkWidget *button1;
button1 = gtk_button_new_with_label("quit");

//ボタンをクリックした時のコールバック関数を登録
g_signal_connect(G_OBJECT(button1), "clicked", G_CALLBACK(gtk_main_quit),NULL);

//button1をvboxの上半分に貼り付ける
gtk_box_pack_start(GTK_BOX(vbox), button1, TRUE, TRUE, 0);


//ボタンを作成
GtkWidget *button2;
button2 = gtk_button_new_with_label("quit");

//ボタンをクリックした時のコールバック関数を登録
g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK(gtk_main_quit),NULL);

//button2をvboxの下半分に貼り付ける
gtk_box_pack_start(GTK_BOX(vbox), button2, TRUE , TRUE, 0);

//ウィンドを閉じたときにプログラムを終了するようにコールバックする。
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

//ウィンドウ上のウェジェットをすべて表示(gtk_widget_show_all)
gtk_widget_show_all(window);

gtk_main();

return 0;
}



コールバック関数

前回のプログラムはウィンドウ左上のバツ印をクリックしてもプログラムが終了しませんでした。

そこで、コールバック関数を登録して、バツ印をクリックすればプログラムが終了するようにします。

/* gtk_test.c*/

#include<gtk/gtk.h>

int main(int argc, char *argv[]){
GtkWidget *window;

//gtk+を初期化
gtk_init(&argc, &argv);

//ウィンドウェジェットを作成
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

//ウィンドウの大きさを指定
gtk_widget_set_size_request(window, 600, 400);

//ウィンドを閉じたときにプログラムを終了するようにコールバックする。
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

//ウィンドウを表示
gtk_widget_show(window);

gtk_main();

return 0;
}



GTK+を使った最小GUIアプリ

GTK+を使ったプログラミングに手を出してみました。

まずはGTK+をインストール
$ sudo apt-get update
$ sudo apt-get install libgtk2.0-dev


#以下はソースコード
$ vim gtk_test.c

/* gtk_test.c */

#include <gtk/gtk.h>
#include<stdlib.h>

int main(int argc, char *argv[]){
GtkWidget *window;

/* GTK+の初期化とオプション解析 */
gtk_init(&argc, &argv);


/* ウィンドウの作成 */
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);


/* ウィンドウの表示 */
/* The GTK_WINDOW_TOPLEVEL argument specifies that we want the window 
  to undergo window manager decoration and placement. */
gtk_widget_show_all(window);


/* メインループ */
/* gtk_main() is another call you will see in every GTK application. 
When control reaches this point, 
GTK will sleep waiting for X events (such as button or key presses), 
timeouts, or file IO notifications to occur. In our simple example, however, events are ignored. */
gtk_main();

exit(0)
}




#GTK+を利用したプログラムをコンパイルした時は、特殊なオプションをつける必要がある。
$ gcc    -o  gtk_test gtk_test.c `pkg-config --cflags --libs gtk+-2.0`"

#毎回このように長いオプションを入力するのは面倒なので以下のようにエイリアスを作成し

$ alias gccgtk="gcc `pkg-config --cflags --libs gtk+-2.0`"
$ gccgtk -o gtk_test gtk_test.c

#プログラムを実行
$ ./gtk_test.c







ubuntuをインストールしてからまずやること集まり!!!!!!!!

1 ホームディレクトリのディレクトリ名を英語に変える

$ LANG=C xdg-user-dirs-gtk-update

で開いてきたウィンドウ内で[Update Names」
そして
$ sudo shutdown -r now

で再起動
こんどは英語から日本語にするか聞いてくるが、これは二度と聞かせようにチエックいれてお断り。



2 システムのアップデート
アップデートマネージャーからシステムのアップデート


3 軽量デスクトップ環境のインストール(lubuntu etc)
synapticマネージャーからlubuntuと検索して、lubuntu desktop環境に依存関係のあるソフトウェアーを一括ダウンロード&インストール

インストールの途中で、デフォルトのディスプレイマネージャーを聞いてくるが、今後、GNOMEとkubuntuの両方を使うことを視野に、gdmのままでいく。

インストール終了後は一度再起動し、システム-ログイン画面-デフォルトをLubuntuにします。


4 ubuntuのパッケージ管理システムをアップデート
$ sudo apt-get update


5  辞書系ソフトのgwaeiとgjitenのインストール

$ sudo apt-get install gwaei
$ sudo apt-get install gjiten

6 vimエディタをインスール&設定

$ sudo apt-get install vim

$ vim ~/.vimrc


syntax on
set number
set cindent


7 freemindのインストール

$ sudo apt-get install freemind



8 GUI操作で、クロームブラウザとDropboxを取ってきてインストール

9 デスクトップの壁紙を好きなものに変える

lubuntuなら、テーマが青なので”ubuntu blue”などとググって、素敵なwallpaperを探す。





GTKでウィンドウを表示させてみた。

$ vim test.c



a




  1     #include <gtk/gtk.h>
  2
  3     int main(int argc, char *argv[])
  4             {
  5                             GtkWidget *window;
  6
  7                                     gtk_init(&argc, &argv);
  8                                            
  9                                             window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 10                                                    
 11                                                     gtk_widget_show(window);
 12                                                    
 13                                                             gtk_main();
 14                                                            
 15                                                                     return 0;
 16                                                                         }




Esc


:wq

$ gcc test.c -o test `pkg-config gtk+-2.0 --libs --cflags`


これでコンパイル完了です。普段のコンパイルとちがって、gtk+のライブラリーをリンクさせるために、ちょっとひねってやらなければならないようです。


実行するにはいつものようにカレントディレクトリ生成した実行ファイルをしていしてあげればいい。

$ ./test




GTKライブラリーをubuntuに突っ込んでみた。

$ sudo apt-get install libgtk2.0-dev


です。


別に、GUIアプリを作成する立場ではありませんのであくまで遊びとしてです。
$ sudo apt-get install libgtk2.0-dev


ububutuにgtk+を突っ込む。

$ sudo aptitude install libgtk2.0-dev


でいいけます。knoppix for bioにはこのコノコマンドでは入りませんでした。依存関係が複雑過ぎて、やる気が失せました。

ちなみにgtk+を使ったコンパイルは、たとえば「test.c」というファイルに対して行うのであれば、

$ (pkg-config --cflags --libs gtk+-2.0) test.c -o test


と行えばよい。