6

インスタンスg_signal_handler_blockのハンドラーがでブロックされた後、たとえばブール変数に状態を格納する以外に、ハンドラーがまだブロックされているか、g_signal_handler_unblockによってブロック解除されているかどうかを確認できますか?

そのようなことが可能になることを望みました

g_signal_handler_block (selection, handler_id_row_selected);
if (g_signal_handler_is_blocked (selection, handler_id_row_selected))
  g_print ("is still blocked");

しかし、"g_signal_handler_is_blocked"関数は存在しません。g_signal_handler_is_connectedシグナルハンドラは接続されたままであるため、は使用するのに適切な関数ではありません。したがって、関数はTRUEを返します。

g_signal_handler_find ()マッチタイプの一つとしてあるので試してみG_SIGNAL_MATCH_UNBLOCKEDましたが、まだうまくいきません。とにかくコードを書き直しましたが、ブロック/ブロック解除を比較的頻繁に使用しているので、それが可能かどうかを知りたいと思います。

4

1 に答える 1

2

g_signal_handler_findここでは期待どおりに動作しています。これが私のテストケースです:

#include <gtk/gtk.h>

gboolean
g_signal_handlers_is_blocked_by_func(gpointer instance, GFunc func, gpointer data)
{
    return g_signal_handler_find(instance,
                                 G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA | G_SIGNAL_MATCH_UNBLOCKED,
                                 0, 0, NULL, func, data) == 0;
}

static void
handler(void)
{
    g_print("handler called\n");
}

static void
switch_blocking(GtkWidget *button)
{
    GFunc func = (GFunc) handler;

    if (g_signal_handlers_is_blocked_by_func(button, func, NULL)) {
        g_signal_handlers_unblock_by_func(button, func, NULL);
        g_print("handler unblocked\n");
    } else {
        g_signal_handlers_block_by_func(button, func, NULL);
        g_print("handler blocked\n");
    }
}

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

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    button = gtk_button_new_with_label("Click me");

    g_signal_connect_after(button, "clicked", G_CALLBACK(switch_blocking), NULL);
    g_signal_connect(button, "clicked", G_CALLBACK(handler), NULL);

    gtk_container_add(GTK_CONTAINER(window), button);
    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}
于 2013-01-21T22:46:06.967 に答える