0

GTK 使用该GSEAL选项来阻止某人访问 Widget-struct。太好了,因为C中的目标编程,您应该像在其他语言中一样使用 get-functions。

因为 的每个值都没有获取函数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 的原因。您的代码可能会因 GTK+ 的更新而中断

于 2013-03-22T14:16:21.003 回答
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 回答