On Sun, May 11, 2025 at 03:33:11PM +0800, Weifeng Liu wrote:
> The existence of multiple scaling factors forces us to deal with various
> coordinate systems and this would be confusing. It would be beneficial
> to define the concepts clearly and use consistent representation for
> variables in different coordinates.
> 
> Signed-off-by: Weifeng Liu <weifeng.li...@gmail.com>
> ---
>  ui/gtk.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 65 insertions(+)
> 
> diff --git a/ui/gtk.c b/ui/gtk.c
> index 982037b2c0..9f3171abc5 100644
> --- a/ui/gtk.c
> +++ b/ui/gtk.c
> @@ -800,6 +800,71 @@ void gd_update_monitor_refresh_rate(VirtualConsole *vc, 
> GtkWidget *widget)
>  #endif
>  }
>  
> +/**
> + * DOC: Coordinate handling.
> + *
> + * We are coping with sizes and positions in various coordinates and the
> + * handling of these coordinates is somewhat confusing. It would benefit us
> + * all if we define these coordinates explicitly and clearly. Besides, it's
> + * also helpful to follow the same naming convention for variables
> + * representing values in different coordinates.
> + *
> + * I. Definitions
> + *
> + * - (guest) buffer coordinate: this is the coordinates that the guest will
> + *   see. The x/y offsets and width/height specified in commands sent by
> + *   guest is basically in buffer coordinate.
> + *
> + * - (host) pixel coordinate: this is the coordinate in pixel level on the
> + *   host destop. A window/widget of width 300 in pixel coordinate means it
> + *   occupies 300 pixels horizontally.
> + *
> + * - (host) logical window coordinate: the existence of global scaling
> + *   factor in desktop level makes this kind of coordinate play a role. It
> + *   always holds that (logical window size) * (global scale factor) =
> + *   (pixel size).
> + *
> + * - global scale factor: this is specified in desktop level and is
> + *   typically invariant during the life cycle of the process. Users with
> + *   high-DPI monitors might set this scale, for example, to 2, in order to
> + *   make the UI look larger.
> + *
> + * - zooming scale: this can be freely controlled by the QEMU user to zoom
> + *   in/out the guest content.
> + *
> + * II. Representation
> + *
> + * We'd like to use consistent representation for variables in different
> + * coordinates:
> + * - buffer coordinate: prefix fb
> + * - pixel coordinate: prefix p
> + * - logical window coordinate: prefix w
> + *
> + * For scales:
> + * - global scale factor: prefix gs
> + * - zooming scale: prefix scale/s
> + *
> + * Example: fbw, pw, ww for width in different coordinates
> + *
> + * III. Equation
> + *
> + * - fbw * gs * scale_x = pw

Well.  That is one possible approach (and this is what qemu is doing
today, for historical reasons, because most code dates back to pre
high-dpi days).

A possible alternative would be to go for fbw * scale_x = pw, i.e. let
the guest run in pixel coordinates instead of window coordinates.  The
guest would do the high-dpi scaling then.  That requires setting
physical display width and height in ui_info, so the guest can figure
what the display resolution is and go into high-dpi mode if needed.

We probably also need a non-high-dpi compatibility mode for old guests.
That mode would start with "zooming scale = global scale" instead of
"zooming scale = 1", and the dpi calculation would have to consider
that too.

(maybe best done on top of this nice cleanup).

take care,
  Gerd


Reply via email to