g_signal_emit transmet des données incorrectes :/
Bonjour,
J'ai un widget Gtk qui dérive de GtkListBox, dans ce widget, je crée un nouveau signal comme suit :
Code:
1 2 3 4 5
| struct _NetworkDeviceListWidgetClass {
GtkListBoxClass parent_class;
void (*device_found)(NetworkDeviceListWidget *, gulong ul_addr);
}; |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| static void network_device_list_widget_class_init(
NetworkDeviceListWidgetClass *class) {
GObjectClass *object_class = G_OBJECT_CLASS(class);
/* ... */
class->device_found = network_device_list_widget_device_found;
/* ... */
network_device_list_widget_signals[SIGNAL_DEVICE_FOUND] = g_signal_new(
"device-found", G_TYPE_FROM_CLASS(class), G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET(NetworkDeviceListWidgetClass, device_found),
NULL,
NULL, g_cclosure_marshal_VOID__ULONG, G_TYPE_NONE, 0);
} |
Et j’émets mon signal comme suit :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| static gboolean network_device_scan_source_func(gpointer message,
gpointer user_data) {
NetworkDeviceListWidget *ndlw = NETWORK_DEVICE_LIST_WIDGET(user_data);
NetworkDeviceListWidgetPrivate *priv = ndlw->priv;
guint64 *u64_message;
guint32 u32_address;
gboolean exists;
u64_message = (guint64*) message;
u32_address = (*u64_message) & 0xffffffff;
exists = ((*u64_message) >> 32) & 0x1;
/* ... */
if (exists) {
gulong ul_send = (gulong)u32_address;
g_signal_emit_by_name(user_data, "device-found", 0, ul_send);
}
return G_SOURCE_CONTINUE;
} |
Seulement quand ma fonction handler est appelée la valeur 'ul' reçue n'est pas la même que celle envoyée lors de l'émission du signal (en vérifiant avec gdb) :/
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| static void network_device_list_widget_device_found(NetworkDeviceListWidget *ndlw,
gulong ul) {
NetworkDeviceListWidgetPrivate *priv = ndlw->priv;
NetworkDevice *device;
GtkWidget *dw;
GError *p_e = NULL;
device = network_device_new_if_exists(network_iface_get_ip(priv->iface),
ul, &p_e);
if (!p_e) {
dw = network_device_widget_new(device);
gtk_list_box_prepend(GTK_LIST_BOX(ndlw), dw);
gtk_widget_show(dw);
}
} |
Quelqu'un aurait une idée ?
Merci :D