/* Called for every event a link receives. Right now it's used to * set a message in the statusbar */ static gint link_item_event (GnomeCanvasItem * item, GdkEvent * event, canvas_link_t * canvas_link) { gchar *str; const link_t *link=NULL; switch (event->type) { case GDK_2BUTTON_PRESS: if (canvas_link) link_info_window_create( &canvas_link->canvas_link_id ); break; case GDK_ENTER_NOTIFY: if (canvas_link) link = links_catalog_find(&canvas_link->canvas_link_id); if (link && link->main_prot[pref.stack_level]) str = g_strdup_printf (_("Link main protocol: %s"), link->main_prot[pref.stack_level]); else str = g_strdup_printf (_("Link main protocol unknown")); gtk_statusbar_push(appdata.statusbar, 1, str); g_free (str); break; case GDK_LEAVE_NOTIFY: gtk_statusbar_pop(appdata.statusbar, 1); break; default: break; } return FALSE; } /* link_item_event */
/* finds a link, creating one if necessary */ link_t *links_catalog_find_create(const link_id_t *key) { link_t *link; g_assert(all_links); g_assert(key); link = links_catalog_find(key); if (!link) { link = link_create(key); links_catalog_insert(link); } return link; }
/* - calls update_links, so that the related link updates its average * traffic and main protocol, and old links are deleted * - caculates link size and color fading */ static gint canvas_link_update(link_id_t * link_id, canvas_link_t * canvas_link, GList **delete_list) { const link_t *link; const canvas_node_t *canvas_dst; const canvas_node_t *canvas_src; guint32 scaledColor; double xs, ys, xd, yd, scale; /* We used to run update_link here, but that was a major performance penalty, * and now it is done in update_diagram */ link = links_catalog_find(link_id); if (!link) { *delete_list = g_list_prepend( *delete_list, link_id); g_my_debug ("Queing canvas link to remove."); return FALSE; } /* If either source or destination has disappeared, we hide the link * until it can be show again */ /* We get coords for the destination node */ canvas_dst = g_tree_lookup (canvas_nodes, &link_id->dst); if (!canvas_dst || !canvas_dst->shown) { gnome_canvas_item_hide (canvas_link->src_item); gnome_canvas_item_hide (canvas_link->dst_item); return FALSE; } /* We get coords from source node */ canvas_src = g_tree_lookup (canvas_nodes, &link_id->src); if (!canvas_src || !canvas_src->shown) { gnome_canvas_item_hide (canvas_link->src_item); gnome_canvas_item_hide (canvas_link->dst_item); return FALSE; } /* What if there never is a protocol? * I have to initialize canvas_link->color to a known value */ if (link->main_prot[pref.stack_level]) { double diffms; canvas_link->color = protohash_color(link->main_prot[pref.stack_level]); /* scale color down to 10% at link timeout */ diffms = substract_times_ms(&appdata.now, &link->link_stats.stats.last_time); scale = pow(0.10, diffms / pref.gui_link_timeout_time); scaledColor = (((int) (scale * canvas_link->color.red) & 0xFF00) << 16) | (((int) (scale * canvas_link->color.green) & 0xFF00) << 8) | ((int) (scale * canvas_link->color.blue) & 0xFF00) | 0xFF; } else { guint32 black = 0x000000ff; scaledColor = black; } /* retrieve coordinates of node centers */ g_object_get (G_OBJECT (canvas_src->group_item), "x", &xs, "y", &ys, NULL); g_object_get (G_OBJECT (canvas_dst->group_item), "x", &xd, "y", &yd, NULL); /* first draw triangle for src->dst */ draw_oneside_link(xs, ys, xd, yd, &(link->link_stats.stats_out), scaledColor, canvas_link->src_item); /* then draw triangle for dst->src */ draw_oneside_link(xd, yd, xs, ys, &(link->link_stats.stats_in), scaledColor, canvas_link->dst_item); return FALSE; } /* update_canvas_links */