|
@@ -891,7 +891,7 @@ static gboolean gd_motion_event(GtkWidget *widget, GdkEventMotion *motion,
|
|
|
int x, y;
|
|
|
int mx, my;
|
|
|
int fbh, fbw;
|
|
|
- int ww, wh, ws;
|
|
|
+ int ww, wh;
|
|
|
|
|
|
if (!vc->gfx.ds) {
|
|
|
return TRUE;
|
|
@@ -899,11 +899,15 @@ static gboolean gd_motion_event(GtkWidget *widget, GdkEventMotion *motion,
|
|
|
|
|
|
fbw = surface_width(vc->gfx.ds) * vc->gfx.scale_x;
|
|
|
fbh = surface_height(vc->gfx.ds) * vc->gfx.scale_y;
|
|
|
-
|
|
|
ww = gtk_widget_get_allocated_width(widget);
|
|
|
wh = gtk_widget_get_allocated_height(widget);
|
|
|
- ws = gtk_widget_get_scale_factor(widget);
|
|
|
|
|
|
+ /*
|
|
|
+ * `widget` may not have the same size with the frame buffer.
|
|
|
+ * In such cases, some paddings are needed around the `vc`.
|
|
|
+ * To achieve that, `vc` will be displayed at (mx, my)
|
|
|
+ * so that it is displayed at the center of the widget.
|
|
|
+ */
|
|
|
mx = my = 0;
|
|
|
if (ww > fbw) {
|
|
|
mx = (ww - fbw) / 2;
|
|
@@ -912,8 +916,12 @@ static gboolean gd_motion_event(GtkWidget *widget, GdkEventMotion *motion,
|
|
|
my = (wh - fbh) / 2;
|
|
|
}
|
|
|
|
|
|
- x = (motion->x - mx) / vc->gfx.scale_x * ws;
|
|
|
- y = (motion->y - my) / vc->gfx.scale_y * ws;
|
|
|
+ /*
|
|
|
+ * `motion` is reported in `widget` coordinates
|
|
|
+ * so translating it to the coordinates in `vc`.
|
|
|
+ */
|
|
|
+ x = (motion->x - mx) / vc->gfx.scale_x;
|
|
|
+ y = (motion->y - my) / vc->gfx.scale_y;
|
|
|
|
|
|
trace_gd_motion_event(ww, wh, gtk_widget_get_scale_factor(widget), x, y);
|
|
|
|