Зная, какая кнопка была нажата!GTK - PullRequest
0 голосов
/ 02 декабря 2011

Я делаю такую ​​доску

GtkWidget *board[x][y];

Если я делаю массив кнопок, как я могу узнать, какая кнопка была нажата?

делает

g_signal_connect(G_OBJECT(board[][]), "clicked",  
       G_CALLBACK(board_button_pressed), NULL);
// I want to know what [][] they pressed, how could I verify/check this?

вернуть, какая кнопка массива была нажата? Или я должен сделать отдельную функцию для каждой части доски?

Например:

OOO
OXO
OOO

Как узнать, какая кнопка была нажата, если все кнопки названы одинаково?

1 Ответ

2 голосов
/ 02 декабря 2011

Одним из самых простых способов было бы просто отправить информацию, когда вы подключаетесь к обратному вызову в виде данных. Что-то на этих строках:

...

typedef struct _identifier{
    int x;
    int y;
}identifier;

static void button_clicked_cb(GtkButton *button, gpointer data)
{
    (void)button; /*To get rid of compiler warning*/
    identifier *id = data;
    printf("\n id = %d, %d\n", id->x, id->y);
    return;
}
....
    identifier id[x*y]; /* Size of x*y of the board*/
    unsigned int counter = 0;
    for (i = 0; i < x; i++)
    {
        for (j = 0; j < y; j++)
        {
            id[counter].x = i;
            id[counter].y = j;
            board[i][j] = gtk_button_new ();
            g_signal_connect(board[i][j], "clicked", G_CALLBACK(button_clicked_cb), &id[counter]);
            counter++;
        }                                                                                                                                                     
    }

Обратите внимание, что сигнал "clicked" связан только с GtkButton. Если вам нужно использовать с GtkWidget, посмотрите на "button-press-event" или "button-release-event", и в этом случае сигнатура обратного вызова также изменится.
Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...