diff options
| author | Burt P <pburt0@gmail.com> | 2018-03-23 13:20:32 -0500 | 
|---|---|---|
| committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2018-04-24 07:43:43 -0700 | 
| commit | ea8ce7dabdf2e3a27e1d6edb84752dff5700a849 (patch) | |
| tree | b448692b2edf578cd4256bd1b0aca44f4a6c2957 /modules | |
| parent | bcd206e60096f2a7d3c748feaa918cb500074f90 (diff) | |
computer/display: use x_util for display information
This commit fixes:
* #200
  now using xrandr to get screen info instead of gdk, so it works
  from the cli
* #27
  opengl core and compatibility versions are both listed
* #230
  (by removing extension list)
Signed-off-by: Burt P <pburt0@gmail.com>
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/computer.c | 117 | ||||
| -rw-r--r-- | modules/computer/display.c | 163 | 
2 files changed, 126 insertions, 154 deletions
| diff --git a/modules/computer.c b/modules/computer.c index ea6762a7..08d64720 100644 --- a/modules/computer.c +++ b/modules/computer.c @@ -38,6 +38,8 @@  #include "info.h" +#define THISORUNK(t) ( (t) ? t : _("(Unknown)") ) +  /* Callbacks */  gchar *callback_summary(void);  gchar *callback_os(void); @@ -173,6 +175,8 @@ void scan_fs(gboolean reload)  void scan_display(gboolean reload)  {      SCAN_START(); +    if (computer->display) +        computer_free_display(computer->display);      computer->display = computer_get_display();      SCAN_END();  } @@ -472,8 +476,8 @@ gchar *callback_summary(void)      info_add_group(info, _("Display"),          info_field_printf(_("Resolution"), _(/* label for resolution */ "%dx%d pixels"),              computer->display->width, computer->display->height), -        info_field(_("OpenGL Renderer"), computer->display->ogl_renderer), -        info_field(_("X11 Vendor"), computer->display->vendor), +        info_field(_("OpenGL Renderer"), THISORUNK(computer->display->xi->glx->ogl_renderer) ), +        info_field(_("Session Display Server"), THISORUNK(computer->display->display_server) ),          info_field_last());      info_add_computed_group(info, _("Audio Devices"), @@ -575,28 +579,77 @@ gchar *callback_fs(void)  gchar *callback_display(void)  { +    int n = 0; +    gchar *screens_str = strdup(""), *outputs_str = strdup(""); +    xinfo *xi = computer->display->xi; +    xrr_info *xrr = xi->xrr; +    glx_info *glx = xi->glx; +    wl_info *wl = computer->display->wl; +      struct Info *info = info_new(); +    info_add_group(info, _("Session"), +        info_field(_("Type"), THISORUNK(computer->display->session_type) ), +        info_field_last()); -    info_add_group(info, _("Display"), -        info_field_printf(_("Resolution"), _(/* resolution WxH unit */ "%dx%d pixels"), -                computer->display->width, computer->display->height), -        info_field(_("Vendor"), computer->display->vendor), -        info_field(_("Version"), computer->display->version), -        info_field(_("Current Display Name"), computer->display->display_name), +    info_add_group(info, _("Wayland"), +        info_field(_("Current Display Name"), (wl->display_name) ? (wl->display_name) : _("(Not Available)") ),          info_field_last()); -    info_add_computed_group(info, _("Monitors"), computer->display->monitors); +    info_add_group(info, _("X Server"), +        info_field(_("Current Display Name"), THISORUNK(xi->display_name) ), +        info_field(_("Vendor"), THISORUNK(xi->vendor) ), +        info_field(_("Version"), THISORUNK(xi->version) ), +        info_field(_("Release Number"), THISORUNK(xi->release_number) ), +        info_field_last()); + +    for (n = 0; n < xrr->screen_count; n++) { +        gchar *dims = g_strdup_printf(_(/* resolution WxH unit */ "%dx%d pixels"), xrr->screens[n].px_width, xrr->screens[n].px_height); +        screens_str = h_strdup_cprintf("Screen %d=%s\n", screens_str, xrr->screens[n].number, dims); +        g_free(dims); +    } +    info_add_computed_group(info, _("Screens"), screens_str); + +    for (n = 0; n < xrr->output_count; n++) { +        gchar *connection = NULL; +        switch (xrr->outputs[n].connected) { +            case 0: +                connection = _("Disconnected"); +                break; +            case 1: +                connection = _("Connected"); +                break; +            case -1: +            default: +                connection = _("Unknown"); +                break; +        } +        gchar *dims = (xrr->outputs[n].screen == -1) +            ? g_strdup(_("Unused")) +            : g_strdup_printf(_("%dx%d pixels, offset (%d, %d)"), +                    xrr->outputs[n].px_width, xrr->outputs[n].px_height, +                    xrr->outputs[n].px_offset_x, xrr->outputs[n].px_offset_y); -    info_add_group(info, _("OpenGL"), -        info_field(_("Vendor"), computer->display->ogl_vendor), -        info_field(_("Renderer"), computer->display->ogl_renderer), -        info_field(_("Version"), computer->display->ogl_version), +        outputs_str = h_strdup_cprintf("%s=%s; %s\n", outputs_str, +            xrr->outputs[n].name, connection, dims); + +        g_free(dims); +    } +    info_add_computed_group(info, _("Outputs (XRandR)"), outputs_str); + +    info_add_group(info, _("OpenGL (GLX)"), +        info_field(_("Vendor"), THISORUNK(glx->ogl_vendor) ), +        info_field(_("Renderer"), THISORUNK(glx->ogl_renderer) ),          info_field(_("Direct Rendering"), -            computer->display->dri ? _("Yes") : _("No")), +            glx->direct_rendering ? _("Yes") : _("No")), +        info_field(_("Version (Compatibility)"), THISORUNK(glx->ogl_version) ), +        info_field(_("Shading Language Version (Compatibility)"), THISORUNK(glx->ogl_sl_version) ), +        info_field(_("Version (Core)"), THISORUNK(glx->ogl_core_version) ), +        info_field(_("Shading Language Version (Core)"), THISORUNK(glx->ogl_core_sl_version) ), +        info_field(_("Version (ES)"), THISORUNK(glx->ogles_version) ), +        info_field(_("Shading Language Version (ES)"), THISORUNK(glx->ogles_sl_version) ), +        info_field(_("GLX Version"), THISORUNK(glx->glx_version) ),          info_field_last()); -    info_add_computed_group(info, _("Extensions"), computer->display->extensions); -      return info_flatten(info);  } @@ -641,20 +694,28 @@ gchar *get_ogl_renderer(void)  {      scan_display(FALSE); -    return g_strdup(computer->display->ogl_renderer); +    return g_strdup(computer->display->xi->glx->ogl_renderer);  }  gchar *get_display_summary(void)  {      scan_display(FALSE); -    return g_strdup_printf("%dx%d\n" +    gchar *gpu_list = module_call_method("devices::getGPUList"); + +    gchar *ret = g_strdup_printf( +                           "%s\n" +                           "%dx%d\n"                             "%s\n"                             "%s", -                           computer->display->width, -                           computer->display->height, -                           computer->display->ogl_renderer, -                           computer->display->vendor); +                           gpu_list, +                           computer->display->width, computer->display->height, +                           computer->display->display_server, +                           (computer->display->xi->glx->ogl_renderer) +                              ? computer->display->xi->glx->ogl_renderer +                              : "" ); +    g_free(gpu_list); +    return ret;  }  gchar *get_kernel_module_description(gchar *module) @@ -769,17 +830,7 @@ void hi_module_deinit(void)          g_free(computer->os);      } -    if (computer->display) { -        g_free(computer->display->ogl_vendor); -        g_free(computer->display->ogl_renderer); -        g_free(computer->display->ogl_version); -        g_free(computer->display->display_name); -        g_free(computer->display->vendor); -        g_free(computer->display->version); -        g_free(computer->display->extensions); -        g_free(computer->display->monitors); -        g_free(computer->display); -    } +    computer_free_display(computer->display);      if (computer->alsa) {          g_slist_free(computer->alsa->cards); diff --git a/modules/computer/display.c b/modules/computer/display.c index 61eac4eb..1010ec87 100644 --- a/modules/computer/display.c +++ b/modules/computer/display.c @@ -21,131 +21,52 @@  #include "hardinfo.h"  #include "computer.h" -static void -get_glx_info(DisplayInfo *di) -{ -    gchar *output; -    if (g_spawn_command_line_sync("glxinfo", &output, NULL, NULL, NULL)) { -        gchar **output_lines; -        gint i = 0; - -        for (output_lines = g_strsplit(output, "\n", 0); -             output_lines && output_lines[i]; -             i++) { -            if (strstr(output_lines[i], "OpenGL")) { -                gchar **tmp = g_strsplit(output_lines[i], ":", 0); - -                tmp[1] = g_strchug(tmp[1]); - -                get_str("OpenGL vendor str", di->ogl_vendor); -                get_str("OpenGL renderer str", di->ogl_renderer); -                get_str("OpenGL version str", di->ogl_version); - -                g_strfreev(tmp); -            } else if (strstr(output_lines[i], "direct rendering: Yes")) { -                di->dri = TRUE; -            } -        } - -        g_free(output); -        g_strfreev(output_lines); - -        if (!di->ogl_vendor) -            di->ogl_vendor = _("(Unknown)"); -        if (!di->ogl_renderer) -            di->ogl_renderer = _("(Unknown)"); -        if (!di->ogl_version) -            di->ogl_version = _("(Unknown)"); - -    } else { -        di->ogl_vendor = di->ogl_renderer = di->ogl_version = _("(Unknown)"); +DisplayInfo *computer_get_display(void) { +    DisplayInfo *di = g_new0(DisplayInfo, 1); +    wl_info *wl = get_walyand_info(); +    xinfo *xi = xinfo_get_info(); +    xrr_info *xrr = xi->xrr; +    glx_info *glx = xi->glx; + +    di->width = di->height = 0; +    if (xrr->screen_count > 0) { +        di->width = xrr->screens[0].px_width; +        di->height = xrr->screens[0].px_height;      } - -} - -static void -get_x11_info(DisplayInfo *di) -{ -    gchar *output; - -    if (g_spawn_command_line_sync("xdpyinfo", &output, NULL, NULL, NULL)) { -	gchar **output_lines, **old; - -	output_lines = g_strsplit(output, "\n", 0); -	g_free(output); - -	old = output_lines; -	while (*output_lines) { -            gchar **tmp = g_strsplit(*output_lines, ":", 2); -            output_lines++; - -            if (tmp[1] && tmp[0]) { -              tmp[1] = g_strchug(tmp[1]); - -              get_str("vendor string", di->vendor); -              get_str("X.Org version", di->version); -              get_str("XFree86 version", di->version); -              get_str("name of display", di->display_name); - -              if (g_str_has_prefix(tmp[0], "number of extensions")) { -                int n; - -                di->extensions = g_strdup(""); - -                for (n = atoi(tmp[1]); n; n--) { -                  di->extensions = h_strconcat(di->extensions, -                                               g_strstrip(*(++output_lines)), -                                               "=\n", -                                               NULL); -                } -                g_strfreev(tmp); - -                break; -              } -            } - -            g_strfreev(tmp); -	} - -	g_strfreev(old); +    di->vendor = xi->vendor; +    di->session_type = wl->xdg_session_type; + +    if (strcmp(di->session_type, "x11") == 0 ) { +        if (xi->nox) { +            di->display_server = g_strdup(_("(Unknown)")); +            /* assumed x11 previously, because it wasn't set */ +            free(wl->xdg_session_type); +            di->session_type = wl->xdg_session_type = NULL; +        } else if (xi->vendor && xi->version) +            di->display_server = g_strdup_printf("%s %s", xi->vendor, xi->version ); +        else if (xi->vendor && xi->release_number) +            di->display_server = g_strdup_printf("[X11] %s %s", xi->vendor, xi->release_number ); +        else +            di->display_server = g_strdup("X11"); +    } else +    if (strcmp(di->session_type, "wayland") == 0 ) { +        di->display_server = g_strdup("Wayland"); +    } else +    if (strcmp(di->session_type, "mir") == 0 ) { +        di->display_server = g_strdup("Mir");      } -    GdkScreen *screen = gdk_screen_get_default(); - -    if (screen && GDK_IS_SCREEN(screen)) { -        gint n_monitors = gdk_screen_get_n_monitors(screen); -        gint i; - -        di->monitors = NULL; -        for (i = 0; i < n_monitors; i++) { -            GdkRectangle rect; - -            gdk_screen_get_monitor_geometry(screen, i, &rect); - -            di->monitors = h_strdup_cprintf(_("Monitor %d=%dx%d pixels\n"), -                                            di->monitors, i, rect.width, rect.height); -        } -      } else { -          di->monitors = ""; -      } +    di->xi = xi; +    di->wl = wl; +    return di;  } -DisplayInfo * -computer_get_display(void) -{ -    DisplayInfo *di = g_new0(DisplayInfo, 1); - -    GdkScreen *screen = gdk_screen_get_default(); - -    if (screen && GDK_IS_SCREEN(screen)) { -        di->width = gdk_screen_get_width(screen); -        di->height = gdk_screen_get_height(screen); -    } else { -        di->width = di->height = 0; +void computer_free_display(DisplayInfo *di) { +    /* fyi: DisplayInfo is in computer.h */ +    if (di) { +        free(di->display_server); +        xinfo_free(di->xi); +        wl_free(di->wl); +        free(di);      } - -    get_glx_info(di); -    get_x11_info(di); - -    return di;  } | 
