[PATCH app/xdpyinfo v4] Use XRANDR 1.2 extension for reporting dimensions and resolution per output

Giuseppe Bilotta giuseppe.bilotta at gmail.com
Thu Oct 18 07:17:42 UTC 2018


Hello,

this is still not acceptable. _Do not alter the main section output_,
and move the XRANDR-specific information into its own
extension-dedicated output function, instead of hacking around it with
the print_none_info function.

On Mon, May 7, 2018 at 11:34 PM Pali Rohár <pali.rohar at gmail.com> wrote:
> -    xres = ((((double) DisplayWidth(dpy,scr)) * 25.4) /
> -           ((double) DisplayWidthMM(dpy,scr)));
> -    yres = ((((double) DisplayHeight(dpy,scr)) * 25.4) /
> -           ((double) DisplayHeightMM(dpy,scr)));
> -
>      printf ("\n");
>      printf ("screen #%d:\n", scr);
> -    printf ("  dimensions:    %dx%d pixels (%dx%d millimeters)\n",
> -           XDisplayWidth (dpy, scr),  XDisplayHeight (dpy, scr),
> -           XDisplayWidthMM(dpy, scr), XDisplayHeightMM (dpy, scr));
> -    printf ("  resolution:    %dx%d dots per inch\n",
> -           (int) (xres + 0.5), (int) (yres + 0.5));
> +
> +#ifdef XRANDR
> +    if (XRRQueryExtension (dpy, &event_base, &error_base) &&
> +        XRRQueryVersion (dpy, &major, &minor) &&
> +        (major > 1 || (major == 1 && minor >= 2)))
> +        has_xrandr = True;
> +#endif
> +
> +#ifdef XRANDR
> +    if (has_xrandr && print_xrandr)
> +    {
> +        res = XRRGetScreenResources (dpy, RootWindow (dpy, scr));
> +        if (res) {
> +            for (i = 0; i < res->noutput; ++i) {
> +                output = XRRGetOutputInfo (dpy, res, res->outputs[i]);
> +                if (!output || !output->crtc || output->connection != RR_Connected)
> +                    continue;
> +
> +                crtc = XRRGetCrtcInfo (dpy, res, output->crtc);
> +                if (!crtc) {
> +                    XRRFreeOutputInfo (output);
> +                    continue;
> +                }
> +
> +                /* width and height is reported according to rotation, but mm_width and mm_height not */
> +                if (crtc->rotation == RR_Rotate_0 || crtc->rotation == RR_Rotate_180) {
> +                    width = crtc->width;
> +                    height = crtc->height;
> +                } else {
> +                    width = crtc->height;
> +                    height = crtc->width;
> +                }
> +
> +                printf ("  output: %s\n", output->name);
> +                printf ("    dimensions:    %ux%u pixels (%lux%lu millimeters)\n",
> +                        width, height, output->mm_width, output->mm_height);
> +
> +                if (output->mm_width && output->mm_height) {
> +                    xres = ((((double) width) * 25.4) / ((double) output->mm_width));
> +                    yres = ((((double) height) * 25.4) / ((double) output->mm_height));
> +                } else {
> +                    xres = 0;
> +                    yres = 0;
> +                }
> +                printf ("    resolution:    %dx%d dots per inch\n",
> +                        (int) (xres + 0.5), (int) (yres + 0.5));
> +
> +                XRRFreeCrtcInfo (crtc);
> +                XRRFreeOutputInfo (output);
> +            }
> +            XRRFreeScreenResources (res);
> +        }
> +
> +        printf ("  screen output: (union of all configured monitors)\n");
> +        printf ("    dimensions:    %dx%d pixels (%dx%d millimeters)\n",
> +                DisplayWidth (dpy, scr),  DisplayHeight (dpy, scr),
> +                DisplayWidthMM(dpy, scr), DisplayHeightMM (dpy, scr));
> +
> +        xres = ((((double) DisplayWidth(dpy,scr)) * 25.4) /
> +                ((double) DisplayWidthMM(dpy,scr)));
> +        yres = ((((double) DisplayHeight(dpy,scr)) * 25.4) /
> +                ((double) DisplayHeightMM(dpy,scr)));
> +        printf ("    resolution:    %dx%d dots per inch\n",
> +                (int) (xres + 0.5), (int) (yres + 0.5));
> +    }
> +    else
> +#endif
> +    {
> +        printf ("  dimensions:    %dx%d pixels (%dx%d millimeters)\n",
> +                DisplayWidth (dpy, scr),  DisplayHeight (dpy, scr),
> +                DisplayWidthMM(dpy, scr), DisplayHeightMM (dpy, scr));
> +
> +        xres = ((((double) DisplayWidth(dpy,scr)) * 25.4) /
> +                ((double) DisplayWidthMM(dpy,scr)));
> +        yres = ((((double) DisplayHeight(dpy,scr)) * 25.4) /
> +                ((double) DisplayHeightMM(dpy,scr)));
> +        printf ("  resolution:    %dx%d dots per inch\n",
> +                (int) (xres + 0.5), (int) (yres + 0.5));
> +
> +        if (has_xrandr)
> +            printf ("    NOTE: above information is obsoleted and may be incorrect\n"
> +                    "          instead run `%s -ext RANDR' for correct output\n\n",
> +                    ProgramName);
> +    }
> +
>      depths = XListDepths (dpy, scr, &ndepths);
>      if (!depths) ndepths = 0;
>      printf ("  depths (%d):    ", ndepths);
> @@ -1316,6 +1410,10 @@ static int print_dmx_info(Display *dpy, const char *extname)
>
>  #endif /* DMX */
>
> +#ifdef XRANDR
> +static int print_none_info(Display *dpy, const char *extname) { return 1; }
> +#endif
> +
>  /* utilities to manage the list of recognized extensions */
>
>
> @@ -1369,6 +1467,9 @@ static ExtensionPrintInfo known_extensions[] =
>  #ifdef DMX
>      {"DMX", print_dmx_info, False},
>  #endif
> +#ifdef XRANDR
> +    {RANDR_NAME, print_none_info, False},
> +#endif
>      /* add new extensions here */
>  };
>
> @@ -1397,8 +1498,16 @@ mark_extension_for_printing(const char *extname)
>  {
>      int i;
>
> +#ifdef XRANDR
> +    if (strcmp(extname, RANDR_NAME) == 0)
> +       print_xrandr = True;
> +#endif
> +
>      if (strcmp(extname, "all") == 0)
>      {
> +#ifdef XRANDR
> +       print_xrandr = True;
> +#endif
>         for (i = 0; i < num_known_extensions; i++)
>             known_extensions[i].printit = True;
>      }
> --
> 2.11.0
>


-- 
Giuseppe "Oblomov" Bilotta


More information about the xorg-devel mailing list