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); };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 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); }
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
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; }
Quelqu'un aurait une idée ?
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); } }
Merci![]()
Partager