「GNOMEフレームワーク」の版間の差分

削除された内容 追加された内容
「各論」を「コンポーネント」に改題。こういう内容は、HTMLやJavaScriptでは「コンポーネント」というので。
cairoの解説をコンポーネントよりも前に移動。個別のコンポーネントの解説よりも、画像描画の基本機能のほうが重要なので。
408 行
 
ここまでで、gnome-panel内で"オブジェクト"の配置はGtkFixedクラスの機能によってなされていることが分かりました。他に興味ある点としては、個々の"オブジェクト"がどのように定義されているかや、オブジェクトを導入するための操作などがあります。例えば、"オブジェクト"が配置できる部分を右クリックすると、メニューが開き、追加するオブジェクトを選ぶことができます。この操作はGtkMenuなどで提供される機能ですが、実際にソースコード中でどのようにGtkMenuが用いられているかも調べることができます。
 
 
=== 図形の描画 ===
図形として線分を表示したり、円などを表示する機能は、図形描画ライブラリが担当している。
 
最近のGTKでは、図形描画ライブラリにcairoというフリーの画像描画ライブラリを採用している。特に追加インストールすることなく、cairoの図形描画命令が使用できる。
cairo自体は、GTKとは別のアプリなので、詳細はcairoの入門書を参照のこと。
 
コード例を示すと下記のようになります。
 
;コード例 (CentOS-7-x86_64-LiveGNOME-1908.iso​ で確認ずみ)
<syntaxhighlight lang="c">
#include <gtk/gtk.h>
//#include <gdk/gdk.h>
 
GtkWidget *uindou;
 
static gboolean kansuu(GtkWidget *uijet1, cairo_t *handoru, gpointer abcde)
{
//ハンドルの作成
handoru = gdk_cairo_create(gtk_widget_get_window(uijet1));
 
//線の性質の定義
cairo_set_line_width (handoru, 10); // 線の太さ
cairo_set_source_rgb (handoru, 1.0 , 0.0 , 0.0); // 線の色
cairo_move_to (handoru, 00, 50); // 線の起点
cairo_line_to (handoru, 300, 300); // 線の終点
 
// 実際に線を引く命令
cairo_stroke (handoru);
 
//長方形の描画
{
//長方形(x,y,width,height)の大きさを指定
cairo_rectangle(handoru, 50.0, 20.0, 30.0, 90.0);
//線の色の指定(Red,Green,Blue)
cairo_set_source_rgb(handoru, 0.0, 0.0, 1.0);
//実際に長方形を塗りつぶす命令
cairo_fill(handoru);
}
 
cairo_destroy(handoru);
return FALSE;
}
 
int main(int argc, char **argv)
{
gtk_init(&argc, &argv);
 
uindou = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(uindou), "テスト");
gtk_widget_set_size_request(uindou, 420,200);
 
//ウインドウに図形を描けるように設定
gtk_widget_set_app_paintable(uindou, TRUE);
 
 
//ウインドウが表示されたときにkansuu()を呼び出す
g_signal_connect(G_OBJECT(uindou), "draw", G_CALLBACK(kansuu), NULL);
 
gtk_widget_show_all(uindou);
gtk_main();
 
return 0;
}
</syntaxhighlight>
 
2019年の現在、GTK3で cairo を使うと、いくつかの組み込み関数を別の関数(たとえば gdk_window_begin_draw_frame() など)に置き換えるようにコンパイラを介して警告されますが、しかしGTK開発元のGnomeコミュニティが、ロクに それらの組み込み関数のマニュアルを整備してない状況なので(形式的にリファレンスがあるが、実際のコード例がなく、まったく新関数の使い方が調べられない状況であるので)、警告は無視して、従来通りにマニュアルの比較的に充実している cairo を使いましょう。マニュアルも整備しないで満足してサボっているナードな技術マニア連中のGnomeコミュニティのほうが悪いのです。
 
もし将来的にcairoが使えなくなったら、フォークするか、でなければGTKでなくQtなどの別のデスクトップ環境に移行しましょう。どうせ組込系ではGTKよりもQtのほうが主流です。
 
ちなみに、上記のコード例の場合、このように警告されます。
<pre>
‘gdk_cairo_create’ is deprecated (declared at /usr/include/gtk-3.0/gdk/gdkcairo.h:35): Use 'gdk_window_begin_draw_frame() and gdk_drawing_context_get_cairo_context()' instead [-Wdeprecated-declarations]
handoru = gdk_cairo_create(gtk_widget_get_window(uindou));
</pre>
 
;コードの解説
GTK3 では、まず main 関数側で、図形の描画をできるように設定を宣言する必要があります。
 
 
なお、ネットに転がってるコード例をみると、cairo の呼び出し方では、一般に任意の自作の関数(上記のコード例では kansuu)を介して cairo を呼び出します。
 
 
cairo による図形描画プログラムを作成するとき、windows APIプログラミングでいうところのハンドルのような物を宣言する必要があります。
 
上記コードでは
handoru = gdk_cairo_create(gtk_widget_get_window(uijet1));
で、ハンドル作成しています。
 
なお、関数宣言のさいの <code> static gboolean kansuu(GtkWidget *uijet1, cairo_t *handoru, gpointer abcde) </code> の際に、すでに引数として<code> cairo_t *handoru</code> のように宣言されており、この時点ですでにハンドル作成などのための必要なメモリの確保を行っているものと考えられます。
 
cairo_t型とは、ハンドルのようなものを定義するための型です。そもそも一般的にC言語では、型の宣言とは、メモリの確保でもあります。
 
ともかく、cairo_t型の宣言のさいに既にメモリは確保されているので、あとは実際にハンドルの作成をすれば済むだけなので、 よって
handoru = gdk_cairo_create(gtk_widget_get_window(uijet1));
で、実際にハンドル作成を実行するわけです。
 
この画像描画の説明でいう「ハンドル」とは、たとえるなら絵を書くときのキャンバスのようなものです。
 
線を引いたりなど図形を描画するときは、初心者には わずらわしいですが、どのハンドル(キャンバス)に図形を描画するのかを、各命令で宣言する必要があります。
 
 
GTKでは図形の性質の定義と、実際に図形の描画を実行する命令とは、異なる命令になります。(Winodws APIと同様。)
 
cairo_stroke の命令で、実際に線分の描画を実行します。
 
 
そして、使用し終わったら、destroy でハンドルを破棄するのが一般的です。(メモリの圧迫を防ぐため。)(Winodws APIでも同様に、使い終わったハンドルは破棄を宣言する。)
 
 
;この章を書くに当たり参考にした文献:
:[http://uchigo.main.jp/gtk3/chap08/chap08.html 素人の独学GTK+3.0 8章:タイムカウントとGDK3] 2019年9月28日に閲覧
 
 
== コンポーネント ==
835 ⟶ 949行目:
[[UNIX/Linux入門|Linux]]上では、使っているCPUの周波数は"ファイル"として利用者から利用できるようになっています。ただし、この値を変更してもハードウェアが変更されるわけではなく、この機能はシステムの状態を把握することを目的とした機能です。CPU周波数の情報は/proc/cpuinfo、もしくは/sys以下のディレクトリに記録されています。cpufreqアプレットはこれらの値を読み出して表示します。
 
 
== 図形の描画 ==
図形として線分を表示したり、円などを表示する機能は、図形描画ライブラリが担当している。
 
最近のGTKでは、図形描画ライブラリにcairoというフリーの画像描画ライブラリを採用している。特に追加インストールすることなく、cairoの図形描画命令が使用できる。
cairo自体は、GTKとは別のアプリなので、詳細はcairoの入門書を参照のこと。
 
コード例を示すと下記のようになります。
 
;コード例 (CentOS-7-x86_64-LiveGNOME-1908.iso​ で確認ずみ)
<syntaxhighlight lang="c">
#include <gtk/gtk.h>
//#include <gdk/gdk.h>
 
GtkWidget *uindou;
 
static gboolean kansuu(GtkWidget *uijet1, cairo_t *handoru, gpointer abcde)
{
//ハンドルの作成
handoru = gdk_cairo_create(gtk_widget_get_window(uijet1));
 
//線の性質の定義
cairo_set_line_width (handoru, 10); // 線の太さ
cairo_set_source_rgb (handoru, 1.0 , 0.0 , 0.0); // 線の色
cairo_move_to (handoru, 00, 50); // 線の起点
cairo_line_to (handoru, 300, 300); // 線の終点
 
// 実際に線を引く命令
cairo_stroke (handoru);
 
//長方形の描画
{
//長方形(x,y,width,height)の大きさを指定
cairo_rectangle(handoru, 50.0, 20.0, 30.0, 90.0);
//線の色の指定(Red,Green,Blue)
cairo_set_source_rgb(handoru, 0.0, 0.0, 1.0);
//実際に長方形を塗りつぶす命令
cairo_fill(handoru);
}
 
cairo_destroy(handoru);
return FALSE;
}
 
int main(int argc, char **argv)
{
gtk_init(&argc, &argv);
 
uindou = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(uindou), "テスト");
gtk_widget_set_size_request(uindou, 420,200);
 
//ウインドウに図形を描けるように設定
gtk_widget_set_app_paintable(uindou, TRUE);
 
 
//ウインドウが表示されたときにkansuu()を呼び出す
g_signal_connect(G_OBJECT(uindou), "draw", G_CALLBACK(kansuu), NULL);
 
gtk_widget_show_all(uindou);
gtk_main();
 
return 0;
}
</syntaxhighlight>
 
2019年の現在、GTK3で cairo を使うと、いくつかの組み込み関数を別の関数(たとえば gdk_window_begin_draw_frame() など)に置き換えるようにコンパイラを介して警告されますが、しかしGTK開発元のGnomeコミュニティが、ロクに それらの組み込み関数のマニュアルを整備してない状況なので(形式的にリファレンスがあるが、実際のコード例がなく、まったく新関数の使い方が調べられない状況であるので)、警告は無視して、従来通りにマニュアルの比較的に充実している cairo を使いましょう。マニュアルも整備しないで満足してサボっているナードな技術マニア連中のGnomeコミュニティのほうが悪いのです。
 
もし将来的にcairoが使えなくなったら、フォークするか、でなければGTKでなくQtなどの別のデスクトップ環境に移行しましょう。どうせ組込系ではGTKよりもQtのほうが主流です。
 
ちなみに、上記のコード例の場合、このように警告されます。
<pre>
‘gdk_cairo_create’ is deprecated (declared at /usr/include/gtk-3.0/gdk/gdkcairo.h:35): Use 'gdk_window_begin_draw_frame() and gdk_drawing_context_get_cairo_context()' instead [-Wdeprecated-declarations]
handoru = gdk_cairo_create(gtk_widget_get_window(uindou));
</pre>
 
;コードの解説
GTK3 では、まず main 関数側で、図形の描画をできるように設定を宣言する必要があります。
 
 
なお、ネットに転がってるコード例をみると、cairo の呼び出し方では、一般に任意の自作の関数(上記のコード例では kansuu)を介して cairo を呼び出します。
 
 
cairo による図形描画プログラムを作成するとき、windows APIプログラミングでいうところのハンドルのような物を宣言する必要があります。
 
上記コードでは
handoru = gdk_cairo_create(gtk_widget_get_window(uijet1));
で、ハンドル作成しています。
 
なお、関数宣言のさいの <code> static gboolean kansuu(GtkWidget *uijet1, cairo_t *handoru, gpointer abcde) </code> の際に、すでに引数として<code> cairo_t *handoru</code> のように宣言されており、この時点ですでにハンドル作成などのための必要なメモリの確保を行っているものと考えられます。
 
cairo_t型とは、ハンドルのようなものを定義するための型です。そもそも一般的にC言語では、型の宣言とは、メモリの確保でもあります。
 
ともかく、cairo_t型の宣言のさいに既にメモリは確保されているので、あとは実際にハンドルの作成をすれば済むだけなので、 よって
handoru = gdk_cairo_create(gtk_widget_get_window(uijet1));
で、実際にハンドル作成を実行するわけです。
 
この画像描画の説明でいう「ハンドル」とは、たとえるなら絵を書くときのキャンバスのようなものです。
 
線を引いたりなど図形を描画するときは、初心者には わずらわしいですが、どのハンドル(キャンバス)に図形を描画するのかを、各命令で宣言する必要があります。
 
 
GTKでは図形の性質の定義と、実際に図形の描画を実行する命令とは、異なる命令になります。(Winodws APIと同様。)
 
cairo_stroke の命令で、実際に線分の描画を実行します。
 
 
そして、使用し終わったら、destroy でハンドルを破棄するのが一般的です。(メモリの圧迫を防ぐため。)(Winodws APIでも同様に、使い終わったハンドルは破棄を宣言する。)
 
 
;この章を書くに当たり参考にした文献:
:[http://uchigo.main.jp/gtk3/chap08/chap08.html 素人の独学GTK+3.0 8章:タイムカウントとGDK3] 2019年9月28日に閲覧
 
== 関連項目 ==