- /* redraw any visible targets */
-
- for (Targets::iterator i = targets.begin(); i != targets.end(); ++i) {
- Target *target = i->second;
-
- if (target->visible) {
-
- /* why -8 ??? why is this necessary ? */
-
- fx = min (target->x, 1.0f);
- fx = max (fx, -1.0f);
- x = (gint) floor ((width - 8) * fx);
-
- fy = min (target->y, 1.0f);
- fy = max (fy, -1.0f);
- y = (gint) floor ((height - 8) * fy);
-
- get_window()->draw_rectangle (get_style()->get_fg_gc(Gtk::STATE_ACTIVE),
- true,
- x, y,
- 4, 4);
+ /* signals */
+
+ if (signals.size() > 1) {
+ for (Targets::iterator i = signals.begin(); i != signals.end(); ++i) {
+ Target* signal = *i;
+
+ if (signal->visible) {
+
+ signal->position.cartesian (c);
+ cart_to_gtk (c);
+
+ cairo_new_path (cr);
+ cairo_arc (cr, c.x, c.y, arc_radius, 0, 2.0 * M_PI);
+ cairo_set_source_rgba (cr, 0.282, 0.517, 0.662, 0.85);
+ cairo_fill_preserve (cr);
+ cairo_set_source_rgba (cr, 0.517, 0.772, 0.882, 1.0);
+ cairo_stroke (cr);
+
+ if (!small && !signal->text.empty()) {
+ cairo_set_source_rgb (cr, 0.517, 0.772, 0.882);
+ /* the +/- adjustments are a hack to try to center the text in the circle */
+ if (small) {
+ cairo_move_to (cr, c.x - 1, c.y + 1);
+ } else {
+ cairo_move_to (cr, c.x - 4, c.y + 4);
+ }
+ cairo_show_text (cr, signal->text.c_str());
+ }
+ }
+ }
+ }
+
+ /* speakers */
+
+ int n = 0;
+
+ for (Targets::iterator i = speakers.begin(); i != speakers.end(); ++i) {
+ Target *speaker = *i;
+ char buf[256];
+ ++n;
+
+ if (speaker->visible) {
+
+ CartesianVector c;
+
+ speaker->position.cartesian (c);
+ cart_to_gtk (c);
+
+ snprintf (buf, sizeof (buf), "%d", n);
+
+ /* stroke out a speaker shape */
+
+ cairo_move_to (cr, c.x, c.y);
+ cairo_save (cr);
+ cairo_rotate (cr, -(speaker->position.azi/360.0) * (2.0 * M_PI));
+ if (small) {
+ cairo_scale (cr, 0.8, 0.8);
+ } else {
+ cairo_scale (cr, 1.2, 1.2);
+ }
+ cairo_rel_line_to (cr, 4, -2);
+ cairo_rel_line_to (cr, 0, -7);
+ cairo_rel_line_to (cr, 5, +5);
+ cairo_rel_line_to (cr, 5, 0);
+ cairo_rel_line_to (cr, 0, 5);
+ cairo_rel_line_to (cr, -5, 0);
+ cairo_rel_line_to (cr, -5, +5);
+ cairo_rel_line_to (cr, 0, -7);
+ cairo_close_path (cr);
+ cairo_set_source_rgba (cr, 0.282, 0.517, 0.662, 1.0);
+ cairo_fill (cr);
+ cairo_restore (cr);
+
+ if (!small) {
+ cairo_set_font_size (cr, 16);
+
+ /* move the text in just a bit */
+
+ AngularVector textpos (speaker->position.azi, speaker->position.ele, 0.85);
+ textpos.cartesian (c);
+ cart_to_gtk (c);
+ cairo_move_to (cr, c.x, c.y);
+ cairo_show_text (cr, buf);
+ }
+