2015-05-09 2 views
0

Я создал массив кнопок в GTK на C, но у меня есть проблема - как я могу получить сигнал от них?Сигналы GTK из массива кнопок Язык C

GtkWidget *board[10][10]; 
for(i=0; i < 10; i++) { 
     for(j=0; j < 10; j++) { 
      board[i][j] = gtk_button_new(); 
     } 
    } 

Я могу, конечно, сделать это один за другим, как этот

g_signal_connect (board[0][0], "clicked", G_CALLBACK(show_info), NULL; 

Но я планирую сделать настольную игру и там будет 100 кнопок ... Есть способ, это можно сделать одной функцией? Например, я хотел бы изменить цвет кнопки, который был нажат, но я понятия не имею, как написать код для этого.

Благодарим за помощь.

+0

не могли бы вы назначить функцию к ним с помощью указателей на функции? – ShellFish

+0

@ShellFish вы можете объяснить, что вы имеете в виду? – andlabs

+0

@alcia Первый аргумент обработчика сигнала - это объект, который генерировал сигнал, поэтому вы всегда можете узнать, какая кнопка была нажата. – andlabs

ответ

1

Один из способов сделать это - динамически выделить некоторые пользовательские данные, которые будут переданы обратному вызову.

typedef struct { 
    int x; 
    int y; 
} coordinate; 

int main(int argc, char *argv[]) { 
    // ... some code here 
    for(i=0; i<10; i++) { 
     for(j=0; j<10; j++) { 
      coordinate *c = malloc(sizeof *c); 
      c->x = i; 
      c->y = j; 
      board[i][j] = gtk_button_new(); 
      g_signal_connect_data(board[i][j], 
            "clicked", 
            G_CALLBACK(show_info), 
            c, 
            (GClosureNotify)free, 
            0); 
     } 
    } 
    // some other code 
} 

Затем в обратном вызове:

void show_info(GtkButton *button, gpointer userdata) { 
    coordinate *c = userdata; 
    // use c->x and c->y to determine which button is pressed 
} 
+0

Почему G_MODULE_EXPORT? Может быть, ошибка с копией? – jku

+0

уверен, но для данного примера это ненужный код и создает ненужный экспорт символов. Я не думаю, что добавление G_MODULE_EXPORT ко всему на всякий случай - хорошая привычка. – jku