Remove interfaces when they disappear

This commit is contained in:
Pierre Pronchery 2014-04-02 02:06:38 +02:00
parent 135c118683
commit 38922f31ed

View File

@ -67,6 +67,9 @@ static void _network_refresh(Network * network);
/* callbacks */ /* callbacks */
static gboolean _network_on_timeout(gpointer data); static gboolean _network_on_timeout(gpointer data);
/* NetworkInterface */
static void _network_interface_destroy(NetworkInterface * ni);
/* public */ /* public */
/* variables */ /* variables */
@ -117,6 +120,11 @@ static Network * _network_init(PanelAppletHelper * helper, GtkWidget ** widget)
/* network_destroy */ /* network_destroy */
static void _network_destroy(Network * network) static void _network_destroy(Network * network)
{ {
size_t i;
for(i = 0; i < network->interfaces_cnt; i++)
_network_interface_destroy(&network->interfaces[i]);
free(network->interfaces);
if(network->fd >= 0) if(network->fd >= 0)
close(network->fd); close(network->fd);
if(network->source != 0) if(network->source != 0)
@ -132,7 +140,6 @@ static void _refresh_interface(Network * network, char const * name,
unsigned int flags); unsigned int flags);
static int _refresh_interface_add(Network * network, char const * name, static int _refresh_interface_add(Network * network, char const * name,
unsigned int flags); unsigned int flags);
static void _refresh_interface_delete(Network * network, size_t i);
static void _refresh_interface_flags(Network * network, NetworkInterface * ni, static void _refresh_interface_flags(Network * network, NetworkInterface * ni,
unsigned int flags); unsigned int flags);
static void _refresh_purge(Network * network); static void _refresh_purge(Network * network);
@ -227,9 +234,11 @@ static void _refresh_interface_delete(Network * network, size_t i)
{ {
NetworkInterface * ni = &network->interfaces[i]; NetworkInterface * ni = &network->interfaces[i];
/* FIXME really implement */ _network_interface_destroy(ni);
gtk_image_set_from_icon_name(GTK_IMAGE(ni->widget), "network-offline", network->interfaces_cnt--;
network->helper->icon_size); memmove(&network->interfaces[i], &network->interfaces[i + 1],
sizeof(*ni) * (network->interfaces_cnt - i));
/* XXX realloc() network->interfaces to free some memory */
} }
static void _refresh_interface_flags(Network * network, NetworkInterface * ni, static void _refresh_interface_flags(Network * network, NetworkInterface * ni,
@ -298,10 +307,11 @@ static void _refresh_purge(Network * network)
{ {
size_t i; size_t i;
for(i = 0; i < network->interfaces_cnt; i++) for(i = 0; i < network->interfaces_cnt;)
if(network->interfaces[i].updated == FALSE) if(network->interfaces[i].updated == FALSE)
/* FIXME do not increment i once really implemented */
_refresh_interface_delete(network, i); _refresh_interface_delete(network, i);
else
i++;
} }
static void _refresh_reset(Network * network) static void _refresh_reset(Network * network)
@ -323,3 +333,12 @@ static gboolean _network_on_timeout(gpointer data)
network->source = g_timeout_add(500, _network_on_timeout, network); network->source = g_timeout_add(500, _network_on_timeout, network);
return FALSE; return FALSE;
} }
/* NetworkInterface */
/* network_interface_destroy */
static void _network_interface_destroy(NetworkInterface * ni)
{
free(ni->name);
gtk_widget_destroy(ni->widget);
}