Функции вы передаете g_idle_add, должны иметь подпись соответствующего типа GSourceFunc, что означает, что он должен взять именно один аргумент указателя. Вам нужно будет выделить структуру в куче (НЕ-стек, как предложил комментатор, который будет действителен только до тех пор, пока выполняется его создание), содержащий нужную вам информацию. Что-то вроде этого:
struct checker_arguments {
gpointer plugin;
int toggle;
};
static gboolean checker(gpointer data) {
struct checker_arguments *args = data;
/* Do stuff with args->plugin and args->toggle */
g_slice_free1(args, sizeof(*args));
return FALSE;
}
struct checker_arguments *args = g_slice_alloc(sizeof(*args));
args->plugin = plugin;
args->toggle = 0;
g_idle_add(checker, args);
Потому что вы обеспокоены с потреблением памяти, я использовал slice allocation в этом примере вместо обычной heap allocation. Распределение фрагментов более эффективно для объектов фиксированного размера.
'typedef void * gpointer;' * Нетипизированный указатель. gpointer выглядит лучше и проще в использовании, чем void *. * Yuck ... – this
Можете ли вы рассказать о встроенном? – this
Возможно, не совсем в строке. Без создания выделенной 'struct'. Я бы не хотел увеличивать потребление памяти. –