示例#1
0
文件: diagram.c 项目: ober/gegramenon
/* 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 */
示例#2
0
文件: links.c 项目: IFGHou/EtherApe
/* 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;
}
示例#3
0
文件: diagram.c 项目: ober/gegramenon
/* - 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 */