static int uni_nav_motion_notify (GtkWidget * widget, GdkEventMotion * ev) { UniNav *nav = UNI_NAV (widget); int mx, my; gdk_window_get_pointer (gtk_widget_get_window (widget), &mx, &my, NULL); /* Make coordinates relative to window. */ mx -= 4; my -= 4; /* Convert Nav space to Zoom space coordinates. */ gdouble zoom2nav_factor = uni_nav_get_zoom2nav_factor (nav); GdkRectangle rect; uni_image_view_get_viewport (nav->view, &rect); /* Convert Zoom space to Nav space coordinates. */ rect.width = (gdouble) rect.width / zoom2nav_factor; rect.height = (gdouble) rect.height / zoom2nav_factor; /* Subtract half of the XOR rectangles size from the coordinates. */ mx -= (rect.width / 2); my -= (rect.height / 2); /* Do the adjusted coordinate conversion. */ int zoom_x_ofs = mx * zoom2nav_factor; int zoom_y_ofs = my * zoom2nav_factor; uni_image_view_set_offset (nav->view, zoom_x_ofs, zoom_y_ofs, TRUE); uni_nav_draw_rectangle (nav, TRUE); return TRUE; }
static GdkRectangle gtk_image_get_current_rectangle (UniNav * nav) { GdkRectangle rect; uni_image_view_get_viewport (nav->view, &rect); /* Convert Zoom space to Nav space coordinates. */ gdouble zoom2nav_factor = uni_nav_get_zoom2nav_factor (nav); rect.x = (gdouble) rect.x / zoom2nav_factor; rect.y = (gdouble) rect.y / zoom2nav_factor; rect.width = (gdouble) rect.width / zoom2nav_factor; rect.height = (gdouble) rect.height / zoom2nav_factor; return rect; }
gboolean uni_dragger_motion_notify (UniDragger * tool, GdkEventMotion * ev) { if (tool->pressed) tool->dragging = TRUE; else return FALSE; tool->drag_ofs_x = ev->x; tool->drag_ofs_y = ev->y; int dx, dy; uni_dragger_get_drag_delta (tool, &dx, &dy); if (abs (dx) < 1 && abs (dy) < 1) return FALSE; if ( pow(dx, 2) + pow(dy, 2) > 7 && UNI_IMAGE_VIEW(tool->view)->pixbuf != NULL && UNI_IMAGE_VIEW(tool->view)->vadj->upper <= UNI_IMAGE_VIEW(tool->view)->vadj->page_size && UNI_IMAGE_VIEW(tool->view)->hadj->upper <= UNI_IMAGE_VIEW(tool->view)->hadj->page_size ) { uni_dragger_button_release (tool, (GdkEventButton*)ev); gtk_drag_begin (GTK_WIDGET(tool->view), gtk_target_list_new(target_table, G_N_ELEMENTS(target_table)), GDK_ACTION_COPY, 1, (GdkEvent*)ev); return TRUE; } GdkRectangle viewport; uni_image_view_get_viewport (UNI_IMAGE_VIEW (tool->view), &viewport); int offset_x = viewport.x + dx; int offset_y = viewport.y + dy; uni_image_view_set_offset (UNI_IMAGE_VIEW (tool->view), offset_x, offset_y, FALSE); tool->drag_base_x = tool->drag_ofs_x; tool->drag_base_y = tool->drag_ofs_y; return TRUE; }