簡體   English   中英

如何使用帶有Gtk回調的C塊?

[英]How to use C blocks with Gtk callbacks?

有沒有辦法在Gtk +回調中使用C塊? 我正在研究這樣的事情:

gboolean (^calledBack)(gpointer) = ^gboolean (gpointer data) {
    printf("Callback fired!\n");    
    return FALSE;
};

g_timeout_add(300, calledBack, NULL);

即使您無法直接將塊傳遞給g_timeout_add ,也很容易設置蹦床來為您完成。 這是一個小型測試程序,它使用塊創建兩個閉包並將它們傳遞給g_timeout_add

#include <glib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Block.h>

typedef gboolean (^callback_type)();

static gboolean trampoline(gpointer data) {
    callback_type callback = data;
    gboolean ret = callback();
    Block_release(callback);
    return ret;
}

void some_gtk_handler(int param)
{
  gboolean (^callback)() = ^gboolean () {
      printf("Callback fired: %d!\n", param);    
      return FALSE;
  };
  g_timeout_add(300, trampoline, Block_copy(callback));
}

int main()
{
  GMainLoop *ml = g_main_loop_new(NULL, FALSE);
  some_gtk_handler(0);
  some_gtk_handler(42);
  g_main_loop_run(ml);
  return 0;
}

上面的代碼指定了一次性處理程序,因此它可以釋放蹦床中的塊。 如果您需要多次運行的塊,請從trampoline中刪除對Block_release的調用,並使用帶有destroy notify回調的g_timeout_add_full來安排它們:

g_timeout_add_full(G_PRIORITY_DEFAULT, 300, trampoline, Block_copy(callback),
                   release_callback);

...其中release_callback是一個實用函數,定義如下:

static void release_callback(gpointer data) {
    Block_release(data);
}

ANSI C沒有任何塊功能。 你的意思是Objective-C? 在后一種情況下,答案是否定的,因為Gtk +是純C框架。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM