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; }
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; }
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; }
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; } }
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; }