0

GTKはこのGSEALオプションを使用して、誰かがWidget-structにアクセスできないようにします。Cでのオブジェクト指向プログラミングのため、他の言語と同じようにget-functionsを使用する必要があります。

の値ごとにget-functionがないためGtkButton、自分の値を変更する際に問題が発生しGtkWidgetsます。

これらの値にアクセスしたいstruct _GtkButton

struct _GtkButton
{
    ....
    guint GSEAL (activate_timeout);
    guint GSEAL (in_button) : 1;
    guint GSEAL (button_down) : 1;
    ....
}

on-clickのイベントを追加して、クリックイベントが呼び出される前にキャンセルしたいmybuttonので、次のように再実装することにしました。

static void gtk_real_button_pressed(GtkButton *button)
{
    if (button->activate_timeout)
        return;

    button->button_down = TRUE;
    gtk_button_update_state(button);
}

static void gtk_real_button_released(GtkButton *button)
{
    if (button->button_down)
    {
        button->button_down = FALSE;

        if (button->activate_timeout)
            return;

        if (button->in_button)
        {
            // do my own stuff here  and maybe don'tcall "gtk_button_clicked(...)"
            gtk_button_clicked(button);
        }    
        gtk_button_update_state(button);
    }
}

一番上で言ったように、私は今button->in_button、例えばにアクセスする必要があります。誰かが私を助けることができる手がかりを持っていますか?:)


ところで:

guint GSEAL (button_down) : 1;

この場合の使用法がわかりません: 1。:O

4

3 に答える 3

3

インスタンス構造内のこれらのフィールドにアクセスすることは決して想定されていませんGtkButton: それらはプライベートであり、内部使用にのみ利用可能です (最新の GTK コードのように完全にプライベートではない理由はGtkButton、インスタンスのプライベート データを内部に追加できるようになるずっと前から存在していたためです)。 GObject- 長い話)。

GtkButton::clickedシグナルは でマークされます。RUN_FIRSTこれは、クラスに関連付けられたデフォルトのシグナル ハンドラが、 を使用してアタッチされたコールバックの前に実行されることを意味しますg_signal_connect()

シグナルが送信されないようにしたい場合GtkButton::clickedは (とにかく、これは良い考えではありません)、シグナル送信フックを使用するかGtkButton、デフォルト ハンドラー内からシグナル送信をサブクラス化して停止することができます。

于 2013-03-22T14:26:38.497 に答える
0

私は今、この小さな関数を使用しています.gseal値を使用することは、私がすべきことではありませんでした.

typedef struct _GuiOnClickHandler   GuiOnClickHandler;
struct _GuiOnClickHandler
{
    gboolean abortClick;

};

static void gui_recipe_button_clicked(GtkWidget *widget, gpointer data)
{
    GuiOnClickHandler handler;
    handler.abortClick = FALSE;

    g_signal_emit_by_name((gpointer)widget, "on-click", &handler);

    if (handler.abortClick)
        g_signal_stop_emission_by_name((gpointer)widget, "clicked");
}

...somewhere else on init, at first place

    g_signal_connect(GTK_OBJECT (button), "clicked",
            G_CALLBACK (gui_recipe_button_clicked), NULL);
于 2013-03-25T12:32:16.930 に答える
0

このようなメンバー変数には絶対にアクセスしないでください。今まで。これらはプライベート変数です。それがGSealが導入された理由です。GTK+ の更新時にコードが壊れる可能性があります

于 2013-03-22T14:16:21.003 に答える