コード例 #1
0
ファイル: gui-output-events.c プロジェクト: bert/pcb-update
gboolean
ghid_port_button_release_cb (GtkWidget * drawing_area,
			     GdkEventButton * ev, GtkUIManager * ui)
{
  ModifierKeysState mk;
  gboolean drag;
  GdkModifierType state;

  ghid_note_event_location (ev);
  state = (GdkModifierType) (ev->state);
  mk = ghid_modifier_keys_state (&state);

  drag = have_crosshair_attachments ();
  if (drag)
    HideCrosshair (TRUE);

  do_mouse_action(ev->button, mk + M_Release);

  if (drag)
    {
      AdjustAttachedObjects ();
      ghid_invalidate_all ();
      RestoreCrosshair (TRUE);
      ghid_screen_update ();
    }
  ghid_set_status_line_label ();
  g_idle_add (ghid_idle_cb, NULL);
  return TRUE;
}
コード例 #2
0
ファイル: gui-output-events.c プロジェクト: bert/pcb-update
gint
ghid_port_window_motion_cb (GtkWidget * widget,
			    GdkEventButton * ev, GHidPort * out)
{
  gdouble dx, dy;
  static gint x_prev = -1, y_prev = -1;
  gboolean moved;

  if (out->panning)
    {
      if (gtk_events_pending ())
	return FALSE;
      dx = gport->zoom * (x_prev - ev->x);
      dy = gport->zoom * (y_prev - ev->y);
      if (x_prev > 0)
	ghid_port_ranges_pan (dx, dy, TRUE);
      x_prev = ev->x;
      y_prev = ev->y;
      return FALSE;
    }
  x_prev = y_prev = -1;
  moved = ghid_note_event_location (ev);

#if ENABLE_TOOLTIPS
  queue_tooltip_update (out);
#endif

  ghid_show_crosshair (TRUE);
  if (moved && have_crosshair_attachments ())
    ghid_draw_area_update (gport, NULL);
  return FALSE;
}
コード例 #3
0
ファイル: gui-output-events.c プロジェクト: bert/pcb-update
gboolean
ghid_port_button_press_cb (GtkWidget * drawing_area,
			   GdkEventButton * ev, GtkUIManager * ui)
{
  ModifierKeysState mk;
  gboolean drag;
  GdkModifierType state;

  /* Reject double and triple click events */
  if (ev->type != GDK_BUTTON_PRESS) return TRUE;

  ghid_note_event_location (ev);
  state = (GdkModifierType) (ev->state);
  mk = ghid_modifier_keys_state (&state);
  ghid_show_crosshair (FALSE);
  HideCrosshair (TRUE);
  drag = have_crosshair_attachments ();

  do_mouse_action(ev->button, mk);

  ghid_invalidate_all ();
  RestoreCrosshair (TRUE);
  ghid_set_status_line_label ();
  ghid_show_crosshair (TRUE);
  if (!gport->panning)
    g_idle_add (ghid_idle_cb, NULL);
  return TRUE;
}
コード例 #4
0
ファイル: gtkhid-gdk.c プロジェクト: thequux/pcb
void
ghid_show_crosshair (gboolean show)
{
    gint x, y;
    static gint x_prev = -1, y_prev = -1;
    static gboolean draw_markers, draw_markers_prev = FALSE;
    static GdkGC *xor_gc;
    static GdkColor cross_color;

    if (gport->x_crosshair < 0 || ghidgui->creating || !gport->has_entered)
        return;

    if (!xor_gc)
    {
        xor_gc = gdk_gc_new (ghid_port.drawing_area->window);
        gdk_gc_copy (xor_gc, ghid_port.drawing_area->style->white_gc);
        gdk_gc_set_function (xor_gc, GDK_XOR);
        /* FIXME: when CrossColor changed from config */
        ghid_map_color_string (Settings.CrossColor, &cross_color);
    }
    x = DRAW_X (gport->x_crosshair);
    y = DRAW_Y (gport->y_crosshair);

    gdk_gc_set_foreground (xor_gc, &cross_color);

    if (x_prev >= 0)
    {
        draw_crosshair (xor_gc, x_prev, y_prev);
        if (draw_markers_prev)
        {
            gdk_draw_rectangle (gport->drawing_area->window, xor_gc, TRUE,
                                0, y_prev - VCD, VCD, VCW);
            gdk_draw_rectangle (gport->drawing_area->window, xor_gc, TRUE,
                                gport->width - VCD, y_prev - VCD, VCD, VCW);
            gdk_draw_rectangle (gport->drawing_area->window, xor_gc, TRUE,
                                x_prev - VCD, 0, VCW, VCD);
            gdk_draw_rectangle (gport->drawing_area->window, xor_gc, TRUE,
                                x_prev - VCD, gport->height - VCD, VCW, VCD);
        }
    }

    if (x >= 0 && show)
    {
        draw_crosshair (xor_gc, x, y);
        draw_markers = ghidgui->auto_pan_on && have_crosshair_attachments ();
        if (draw_markers)
        {
            gdk_draw_rectangle (gport->drawing_area->window, xor_gc, TRUE,
                                0, y - VCD, VCD, VCW);
            gdk_draw_rectangle (gport->drawing_area->window, xor_gc, TRUE,
                                gport->width - VCD, y - VCD, VCD, VCW);
            gdk_draw_rectangle (gport->drawing_area->window, xor_gc, TRUE,
                                x - VCD, 0, VCW, VCD);
            gdk_draw_rectangle (gport->drawing_area->window, xor_gc, TRUE,
                                x - VCD, gport->height - VCD, VCW, VCD);
        }
        x_prev = x;
        y_prev = y;
        draw_markers_prev = draw_markers;
    }
    else
    {
        x_prev = y_prev = -1;
        draw_markers_prev = FALSE;
    }
}
コード例 #5
0
ファイル: gui-output-events.c プロジェクト: bert/pcb-update
gint
ghid_port_window_leave_cb (GtkWidget * widget, 
                           GdkEventCrossing * ev, GHidPort * out)
{
  gint x0, y0, x, y, dx, dy, w, h;
  
  /* printf("leave mode: %d detail: %d\n", ev->mode, ev->detail); */

  /* Window leave events can also be triggered because of focus grabs. Some
   * X applications occasionally grab the focus and so trigger this function.
   * At least GNOME's window manager is known to do this on every mouse click.
   *
   * See http://bugzilla.gnome.org/show_bug.cgi?id=102209 
   */

  if(ev->mode != GDK_CROSSING_NORMAL)
    {
      return FALSE;
    }

  if(out->has_entered && !ghidgui->in_popup)
    {
      /* if actively drawing, start scrolling */

      if (have_crosshair_attachments () && ghidgui->auto_pan_on)
	{
	  /* GdkEvent coords are set to 0,0 at leave events, so must figure
	     |  out edge the cursor left.
	   */
	  w = ghid_port.width * gport->zoom;
	  h = ghid_port.height * gport->zoom;

	  x0 = VIEW_X (0);
	  y0 = VIEW_Y (0);
	  ghid_get_coords (NULL, &x, &y);
	  x -= x0;
	  y -= y0;

	  if (ghid_flip_x )
	      x = -x;
	  if (ghid_flip_y )
	      y = -y;

	  dx = w - x;
	  dy = h - y;

	  x_pan_speed = y_pan_speed = 2 * ghidgui->auto_pan_speed;

	  if (x < dx)
	    {
	      x_pan_speed = -x_pan_speed;
	      dx = x;
	    }
	  if (y < dy)
	    {
	      y_pan_speed = -y_pan_speed;
	      dy = y;
	    }
	  if (dx < dy)
	    {
	      if (dy < h / 3)
		y_pan_speed = y_pan_speed - (3 * dy * y_pan_speed) / h;
	      else
		y_pan_speed = 0;
	    }
	  else
	    {
	      if (dx < w / 3)
		x_pan_speed = x_pan_speed - (3 * dx * x_pan_speed) / w;
	      else
		x_pan_speed = 0;
	    }
	  g_idle_add (ghid_pan_idle_cb, NULL);
	}
    }

  if(cursor_in_viewport)
    {
      HideCrosshair (TRUE);
      cursor_in_viewport = FALSE;
    }

  ghid_show_crosshair (FALSE);
  out->has_entered = FALSE;

  ghid_screen_update ();

  return FALSE;
}