PDA

Visualizza la versione completa : [c]Gtk+ Stinga vuota, ma dovrebbe essere piena.


pistilloi
26-01-2013, 15:49
#include <gtk/gtk.h>
#include<stdlib.h>
#include<time.h>

typedef struct { GtkWidget *wid; char lab[2]; } Btn;

//restituisce un carattere casuale seguito da /0...
char *rand_character()
{
char * c = calloc( 2, sizeof(char));

c[0] = 'a' + rand() % ('z'-'a') ;
c[1] = '\0';

return c;
}

static void grf_get_label( Btn but )
{
printf("%s\n",but.lab);
}

//restituisce una tastiera 4*4 con dei caratteri aleatori come etichette, ad ogni pulsante collegata
//una funzione "grf_get_label" che stampa in stdout il carattere d'etichetta del bottone premuto.
Grf grf_tastiera()
{
GtkWidget *table;
Btn button[4][4];
int rows, cols;

table = gtk_table_new (4, 4, TRUE);

srand(time(NULL));

for ( rows = 0; rows < 4; rows++ )
for ( cols = 0; cols < 4; cols++ )
strcpy(button[rows][cols].lab, rand_character());

for ( rows = 0; rows < 4; rows++ )
for ( cols = 0; cols < 4; cols++ )
{

button[rows][cols].wid = gtk_button_new_with_label(button[rows][cols].lab);
gtk_table_attach (GTK_TABLE (table), button[rows][cols].wid, cols, cols + 1,
rows, rows + 1, GTK_FILL | GTK_EXPAND,
GTK_FILL | GTK_EXPAND, 0, 0);

g_signal_connect (G_OBJECT (button[rows][cols].wid), "clicked",
G_CALLBACK (grf_get_label), &button[rows][cols]);
}

return table;
}


int main(int argc, char *argv[])
{
Grf window;

gtk_init (&argc, &argv);

//finestra principale
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "Tastiera");
gtk_window_set_default_size(GTK_WINDOW(window) , 200 , 210);
gtk_window_set_position (GTK_WINDOW (window) , GTK_WIN_POS_CENTER);
gtk_container_set_border_width (GTK_CONTAINER (window), 9);

//posiziona una tastiera 4*4 nella finestra
gtk_container_add (GTK_CONTAINER (window), grf_tastiera());

gtk_widget_show_all (window);

g_signal_connect (G_OBJECT (window), "delete_event",
G_CALLBACK (gtk_main_quit), NULL);

gtk_main ();

return 0;
}

Alla pressione di un qualsiasi bottone, la funzione viene chiamata ma la stringa but.lab sempre vuota, infatti chiamando la funzione stampa solo \n... Non me ne capacito!

Loading