Bonjour,

J'ai un widget Gtk qui dérive de GtkListBox, dans ce widget, je crée un nouveau signal comme suit :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
struct _NetworkDeviceListWidgetClass {
	GtkListBoxClass parent_class;
 
	void (*device_found)(NetworkDeviceListWidget *, gulong ul_addr);
};
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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