コールバック関数 (名前はcallback
) は、値を取得するために両方の GtkEntry ウィジェットにアクセスする必要があります。これを行う方法はいくつかあります。多くの GTK C プログラムは、グローバル変数、またはファイル スコープを持つグローバル変数 (つまり、static
ファイル内の任意の関数の外部として宣言された変数) を使用します。
関数の前に、ファイルの上部近くにある変数entry1
と変数を削除します。entry2
static GtkWidget *entry1 = 0;
static GtkWidget *entry2 = 0;
次に、コールバックを次のように変更します。
/* Our callback.
* The data passed to this function is printed to stdout */
static void callback( GtkWidget *widget, gpointer data)
{
const gchar *entry_text1;
const gchar *entry_text2;
g_print ("Hello again - %s was pressed\n", (char *) data);
entry_text1 = gtk_entry_get_text (GTK_ENTRY (entry1));
entry_text2 = gtk_entry_get_text (GTK_ENTRY (entry2));
g_print ("Contents of entries:\n%s\n%s\n", entry_text1, entry_text2);
}
さらに、関数に同様の変更を加える必要があります。また、両方へのポインターをからenter_callback
削除することを忘れないでください。GtkWidget
GtkEntry
main
(静的) グローバル変数を使用する代わりに、エントリを保持するデータ構造を作成します。
typedef struct login_data
{
GtkWidget *entry1;
GtkWidget *entry2;
} login_data;
これは (以前のテキスト文字列ではなく) コールバックに渡され、コールバックは次のように変更されます。
static void callback( GtkWidget *widget, gpointer data)
{
login_data* ld = (login_data*)data;
const gchar *entry_text1;
const gchar *entry_text2;
entry_text1 = gtk_entry_get_text (GTK_ENTRY (ld->entry1));
entry_text2 = gtk_entry_get_text (GTK_ENTRY (ld->entry2));
g_print ("Contents of entries:\n%s\n%s\n", entry_text1, entry_text2);
}
データ構造は、スコープ外に出ないように動的に割り当てられます (単純なアプリケーションでは厳密には必要ありません)。これはg_signal_connect
、コールバックをエントリに接続するために使用する前に行われます。
login_data* ld = g_malloc(sizeof(*ld));
// callback function to execute when login is clicked
g_signal_connect (LoginButton, "clicked", G_CALLBACK (callback), (gpointer) ld);
この方法を使用すると、 および へのすべての参照をentry1
およびentry2
に変更する必要がld->entry1
ありld->entry2
ます。最後に、プログラムが終了する前にg_free
、動的に割り当てられた struct ieを呼び出す必要がありますg_free(ld)
。
ところで、このプログラムでは、2 つの個別のコールバックは必要ありません。削除して両方enter_callback
に使用してください。callback