mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 15:23:53 -06:00
ui/gtk: Use consistent naming for variables in different coordinates
Now that we've documented definitions and presentation of various coordinates, let's enforce the rules. Signed-off-by: Weifeng Liu <weifeng.liu.z@gmail.com> Message-ID: <20250511073337.876650-3-weifeng.liu.z@gmail.com> Acked-by: Gerd Hoffmann <kraxel@redhat.com> Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com>
This commit is contained in:
parent
9498e2f7e1
commit
3a6b314409
3 changed files with 82 additions and 77 deletions
12
ui/gtk-egl.c
12
ui/gtk-egl.c
|
@ -70,16 +70,18 @@ void gd_egl_draw(VirtualConsole *vc)
|
|||
QemuDmaBuf *dmabuf = vc->gfx.guest_fb.dmabuf;
|
||||
int fence_fd;
|
||||
#endif
|
||||
int ww, wh, ws;
|
||||
int ww, wh, pw, ph, gs;
|
||||
|
||||
if (!vc->gfx.gls) {
|
||||
return;
|
||||
}
|
||||
|
||||
window = gtk_widget_get_window(vc->gfx.drawing_area);
|
||||
ws = gdk_window_get_scale_factor(window);
|
||||
ww = gdk_window_get_width(window) * ws;
|
||||
wh = gdk_window_get_height(window) * ws;
|
||||
gs = gdk_window_get_scale_factor(window);
|
||||
ww = gdk_window_get_width(window);
|
||||
wh = gdk_window_get_height(window);
|
||||
pw = ww * gs;
|
||||
ph = wh * gs;
|
||||
|
||||
if (vc->gfx.scanout_mode) {
|
||||
#ifdef CONFIG_GBM
|
||||
|
@ -115,7 +117,7 @@ void gd_egl_draw(VirtualConsole *vc)
|
|||
eglMakeCurrent(qemu_egl_display, vc->gfx.esurface,
|
||||
vc->gfx.esurface, vc->gfx.ectx);
|
||||
|
||||
surface_gl_setup_viewport(vc->gfx.gls, vc->gfx.ds, ww, wh);
|
||||
surface_gl_setup_viewport(vc->gfx.gls, vc->gfx.ds, pw, ph);
|
||||
surface_gl_render_texture(vc->gfx.gls, vc->gfx.ds);
|
||||
|
||||
eglSwapBuffers(qemu_egl_display, vc->gfx.esurface);
|
||||
|
|
|
@ -42,16 +42,16 @@ void gd_gl_area_draw(VirtualConsole *vc)
|
|||
#ifdef CONFIG_GBM
|
||||
QemuDmaBuf *dmabuf = vc->gfx.guest_fb.dmabuf;
|
||||
#endif
|
||||
int ww, wh, ws, y1, y2;
|
||||
int pw, ph, gs, y1, y2;
|
||||
|
||||
if (!vc->gfx.gls) {
|
||||
return;
|
||||
}
|
||||
|
||||
gtk_gl_area_make_current(GTK_GL_AREA(vc->gfx.drawing_area));
|
||||
ws = gdk_window_get_scale_factor(gtk_widget_get_window(vc->gfx.drawing_area));
|
||||
ww = gtk_widget_get_allocated_width(vc->gfx.drawing_area) * ws;
|
||||
wh = gtk_widget_get_allocated_height(vc->gfx.drawing_area) * ws;
|
||||
gs = gdk_window_get_scale_factor(gtk_widget_get_window(vc->gfx.drawing_area));
|
||||
pw = gtk_widget_get_allocated_width(vc->gfx.drawing_area) * gs;
|
||||
ph = gtk_widget_get_allocated_height(vc->gfx.drawing_area) * gs;
|
||||
|
||||
if (vc->gfx.scanout_mode) {
|
||||
if (!vc->gfx.guest_fb.framebuffer) {
|
||||
|
@ -71,11 +71,11 @@ void gd_gl_area_draw(VirtualConsole *vc)
|
|||
glBindFramebuffer(GL_READ_FRAMEBUFFER, vc->gfx.guest_fb.framebuffer);
|
||||
/* GtkGLArea sets GL_DRAW_FRAMEBUFFER for us */
|
||||
|
||||
glViewport(0, 0, ww, wh);
|
||||
glViewport(0, 0, pw, ph);
|
||||
y1 = vc->gfx.y0_top ? 0 : vc->gfx.h;
|
||||
y2 = vc->gfx.y0_top ? vc->gfx.h : 0;
|
||||
glBlitFramebuffer(0, y1, vc->gfx.w, y2,
|
||||
0, 0, ww, wh,
|
||||
0, 0, pw, ph,
|
||||
GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
||||
#ifdef CONFIG_GBM
|
||||
if (dmabuf) {
|
||||
|
@ -101,7 +101,7 @@ void gd_gl_area_draw(VirtualConsole *vc)
|
|||
}
|
||||
gtk_gl_area_make_current(GTK_GL_AREA(vc->gfx.drawing_area));
|
||||
|
||||
surface_gl_setup_viewport(vc->gfx.gls, vc->gfx.ds, ww, wh);
|
||||
surface_gl_setup_viewport(vc->gfx.gls, vc->gfx.ds, pw, ph);
|
||||
surface_gl_render_texture(vc->gfx.gls, vc->gfx.ds);
|
||||
}
|
||||
}
|
||||
|
|
133
ui/gtk.c
133
ui/gtk.c
|
@ -387,16 +387,16 @@ static void *gd_win32_get_hwnd(VirtualConsole *vc)
|
|||
/** DisplayState Callbacks **/
|
||||
|
||||
static void gd_update(DisplayChangeListener *dcl,
|
||||
int x, int y, int w, int h)
|
||||
int fbx, int fby, int fbw, int fbh)
|
||||
{
|
||||
VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);
|
||||
GdkWindow *win;
|
||||
int x1, x2, y1, y2;
|
||||
int mx, my;
|
||||
int fbw, fbh;
|
||||
int ww, wh;
|
||||
int wx1, wx2, wy1, wy2;
|
||||
int wx_offset, wy_offset;
|
||||
int ww_surface, wh_surface;
|
||||
int ww_widget, wh_widget;
|
||||
|
||||
trace_gd_update(vc->label, x, y, w, h);
|
||||
trace_gd_update(vc->label, fbx, fby, fbw, fbh);
|
||||
|
||||
if (!gtk_widget_get_realized(vc->gfx.drawing_area)) {
|
||||
return;
|
||||
|
@ -405,35 +405,36 @@ static void gd_update(DisplayChangeListener *dcl,
|
|||
if (vc->gfx.convert) {
|
||||
pixman_image_composite(PIXMAN_OP_SRC, vc->gfx.ds->image,
|
||||
NULL, vc->gfx.convert,
|
||||
x, y, 0, 0, x, y, w, h);
|
||||
fbx, fby, 0, 0, fbx, fby, fbw, fbh);
|
||||
}
|
||||
|
||||
x1 = floor(x * vc->gfx.scale_x);
|
||||
y1 = floor(y * vc->gfx.scale_y);
|
||||
wx1 = floor(fbx * vc->gfx.scale_x);
|
||||
wy1 = floor(fby * vc->gfx.scale_y);
|
||||
|
||||
x2 = ceil(x * vc->gfx.scale_x + w * vc->gfx.scale_x);
|
||||
y2 = ceil(y * vc->gfx.scale_y + h * vc->gfx.scale_y);
|
||||
wx2 = ceil(fbx * vc->gfx.scale_x + fbw * vc->gfx.scale_x);
|
||||
wy2 = ceil(fby * vc->gfx.scale_y + fbh * vc->gfx.scale_y);
|
||||
|
||||
fbw = surface_width(vc->gfx.ds) * vc->gfx.scale_x;
|
||||
fbh = surface_height(vc->gfx.ds) * vc->gfx.scale_y;
|
||||
ww_surface = surface_width(vc->gfx.ds) * vc->gfx.scale_x;
|
||||
wh_surface = surface_height(vc->gfx.ds) * vc->gfx.scale_y;
|
||||
|
||||
win = gtk_widget_get_window(vc->gfx.drawing_area);
|
||||
if (!win) {
|
||||
return;
|
||||
}
|
||||
ww = gdk_window_get_width(win);
|
||||
wh = gdk_window_get_height(win);
|
||||
ww_widget = gdk_window_get_width(win);
|
||||
wh_widget = gdk_window_get_height(win);
|
||||
|
||||
mx = my = 0;
|
||||
if (ww > fbw) {
|
||||
mx = (ww - fbw) / 2;
|
||||
wx_offset = wy_offset = 0;
|
||||
if (ww_widget > ww_surface) {
|
||||
wx_offset = (ww_widget - ww_surface) / 2;
|
||||
}
|
||||
if (wh > fbh) {
|
||||
my = (wh - fbh) / 2;
|
||||
if (wh_widget > wh_surface) {
|
||||
wy_offset = (wh_widget - wh_surface) / 2;
|
||||
}
|
||||
|
||||
gtk_widget_queue_draw_area(vc->gfx.drawing_area,
|
||||
mx + x1, my + y1, (x2 - x1), (y2 - y1));
|
||||
wx_offset + wx1, wy_offset + wy1,
|
||||
(wx2 - wx1), (wy2 - wy1));
|
||||
}
|
||||
|
||||
static void gd_refresh(DisplayChangeListener *dcl)
|
||||
|
@ -869,8 +870,8 @@ static gboolean gd_draw_event(GtkWidget *widget, cairo_t *cr, void *opaque)
|
|||
{
|
||||
VirtualConsole *vc = opaque;
|
||||
GtkDisplayState *s = vc->s;
|
||||
int mx, my;
|
||||
int ww, wh;
|
||||
int wx_offset, wy_offset;
|
||||
int ww_widget, wh_widget, ww_surface, wh_surface;
|
||||
int fbw, fbh;
|
||||
|
||||
#if defined(CONFIG_OPENGL)
|
||||
|
@ -904,46 +905,47 @@ static gboolean gd_draw_event(GtkWidget *widget, cairo_t *cr, void *opaque)
|
|||
fbw = surface_width(vc->gfx.ds);
|
||||
fbh = surface_height(vc->gfx.ds);
|
||||
|
||||
ww = gdk_window_get_width(gtk_widget_get_window(widget));
|
||||
wh = gdk_window_get_height(gtk_widget_get_window(widget));
|
||||
ww_widget = gdk_window_get_width(gtk_widget_get_window(widget));
|
||||
wh_widget = gdk_window_get_height(gtk_widget_get_window(widget));
|
||||
|
||||
if (s->full_screen) {
|
||||
vc->gfx.scale_x = (double)ww / fbw;
|
||||
vc->gfx.scale_y = (double)wh / fbh;
|
||||
vc->gfx.scale_x = (double)ww_widget / fbw;
|
||||
vc->gfx.scale_y = (double)wh_widget / fbh;
|
||||
} else if (s->free_scale) {
|
||||
double sx, sy;
|
||||
|
||||
sx = (double)ww / fbw;
|
||||
sy = (double)wh / fbh;
|
||||
sx = (double)ww_widget / fbw;
|
||||
sy = (double)wh_widget / fbh;
|
||||
|
||||
vc->gfx.scale_x = vc->gfx.scale_y = MIN(sx, sy);
|
||||
}
|
||||
|
||||
fbw *= vc->gfx.scale_x;
|
||||
fbh *= vc->gfx.scale_y;
|
||||
ww_surface = fbw * vc->gfx.scale_x;
|
||||
wh_surface = fbh * vc->gfx.scale_y;
|
||||
|
||||
mx = my = 0;
|
||||
if (ww > fbw) {
|
||||
mx = (ww - fbw) / 2;
|
||||
wx_offset = wy_offset = 0;
|
||||
if (ww_widget > ww_surface) {
|
||||
wx_offset = (ww_widget - ww_surface) / 2;
|
||||
}
|
||||
if (wh > fbh) {
|
||||
my = (wh - fbh) / 2;
|
||||
if (wh_widget > wh_surface) {
|
||||
wy_offset = (wh_widget - wh_surface) / 2;
|
||||
}
|
||||
|
||||
cairo_rectangle(cr, 0, 0, ww, wh);
|
||||
cairo_rectangle(cr, 0, 0, ww_widget, wh_widget);
|
||||
|
||||
/* Optionally cut out the inner area where the pixmap
|
||||
will be drawn. This avoids 'flashing' since we're
|
||||
not double-buffering. Note we're using the undocumented
|
||||
behaviour of drawing the rectangle from right to left
|
||||
to cut out the whole */
|
||||
cairo_rectangle(cr, mx + fbw, my,
|
||||
-1 * fbw, fbh);
|
||||
cairo_rectangle(cr, wx_offset + ww_surface, wy_offset,
|
||||
-1 * ww_surface, wh_surface);
|
||||
cairo_fill(cr);
|
||||
|
||||
cairo_scale(cr, vc->gfx.scale_x, vc->gfx.scale_y);
|
||||
cairo_set_source_surface(cr, vc->gfx.surface,
|
||||
mx / vc->gfx.scale_x, my / vc->gfx.scale_y);
|
||||
wx_offset / vc->gfx.scale_x,
|
||||
wy_offset / vc->gfx.scale_y);
|
||||
cairo_paint(cr);
|
||||
|
||||
return TRUE;
|
||||
|
@ -954,19 +956,19 @@ static gboolean gd_motion_event(GtkWidget *widget, GdkEventMotion *motion,
|
|||
{
|
||||
VirtualConsole *vc = opaque;
|
||||
GtkDisplayState *s = vc->s;
|
||||
int x, y;
|
||||
int mx, my;
|
||||
int fbh, fbw;
|
||||
int ww, wh;
|
||||
int fbx, fby;
|
||||
int wx_offset, wy_offset;
|
||||
int wh_surface, ww_surface;
|
||||
int ww_widget, wh_widget;
|
||||
|
||||
if (!vc->gfx.ds) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
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);
|
||||
ww_surface = surface_width(vc->gfx.ds) * vc->gfx.scale_x;
|
||||
wh_surface = surface_height(vc->gfx.ds) * vc->gfx.scale_y;
|
||||
ww_widget = gtk_widget_get_allocated_width(widget);
|
||||
wh_widget = gtk_widget_get_allocated_height(widget);
|
||||
|
||||
/*
|
||||
* `widget` may not have the same size with the frame buffer.
|
||||
|
@ -974,41 +976,42 @@ static gboolean gd_motion_event(GtkWidget *widget, GdkEventMotion *motion,
|
|||
* 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;
|
||||
wx_offset = wy_offset = 0;
|
||||
if (ww_widget > ww_surface) {
|
||||
wx_offset = (ww_widget - ww_surface) / 2;
|
||||
}
|
||||
if (wh > fbh) {
|
||||
my = (wh - fbh) / 2;
|
||||
if (wh_widget > wh_surface) {
|
||||
wy_offset = (wh_widget - wh_surface) / 2;
|
||||
}
|
||||
|
||||
/*
|
||||
* `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;
|
||||
fbx = (motion->x - wx_offset) / vc->gfx.scale_x;
|
||||
fby = (motion->y - wy_offset) / vc->gfx.scale_y;
|
||||
|
||||
trace_gd_motion_event(ww, wh, gtk_widget_get_scale_factor(widget), x, y);
|
||||
trace_gd_motion_event(ww_widget, wh_widget,
|
||||
gtk_widget_get_scale_factor(widget), fbx, fby);
|
||||
|
||||
if (qemu_input_is_absolute(vc->gfx.dcl.con)) {
|
||||
if (x < 0 || y < 0 ||
|
||||
x >= surface_width(vc->gfx.ds) ||
|
||||
y >= surface_height(vc->gfx.ds)) {
|
||||
if (fbx < 0 || fby < 0 ||
|
||||
fbx >= surface_width(vc->gfx.ds) ||
|
||||
fby >= surface_height(vc->gfx.ds)) {
|
||||
return TRUE;
|
||||
}
|
||||
qemu_input_queue_abs(vc->gfx.dcl.con, INPUT_AXIS_X, x,
|
||||
qemu_input_queue_abs(vc->gfx.dcl.con, INPUT_AXIS_X, fbx,
|
||||
0, surface_width(vc->gfx.ds));
|
||||
qemu_input_queue_abs(vc->gfx.dcl.con, INPUT_AXIS_Y, y,
|
||||
qemu_input_queue_abs(vc->gfx.dcl.con, INPUT_AXIS_Y, fby,
|
||||
0, surface_height(vc->gfx.ds));
|
||||
qemu_input_event_sync();
|
||||
} else if (s->last_set && s->ptr_owner == vc) {
|
||||
qemu_input_queue_rel(vc->gfx.dcl.con, INPUT_AXIS_X, x - s->last_x);
|
||||
qemu_input_queue_rel(vc->gfx.dcl.con, INPUT_AXIS_Y, y - s->last_y);
|
||||
qemu_input_queue_rel(vc->gfx.dcl.con, INPUT_AXIS_X, fbx - s->last_x);
|
||||
qemu_input_queue_rel(vc->gfx.dcl.con, INPUT_AXIS_Y, fby - s->last_y);
|
||||
qemu_input_event_sync();
|
||||
}
|
||||
s->last_x = x;
|
||||
s->last_y = y;
|
||||
s->last_x = fbx;
|
||||
s->last_y = fby;
|
||||
s->last_set = TRUE;
|
||||
|
||||
if (!qemu_input_is_absolute(vc->gfx.dcl.con) && s->ptr_owner == vc) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue