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 | |
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>
-rw-r--r-- | includes/computer.h | 28 | ||||
-rw-r--r-- | modules/computer.c | 117 | ||||
-rw-r--r-- | modules/computer/display.c | 163 |
3 files changed, 143 insertions, 165 deletions
diff --git a/includes/computer.h b/includes/computer.h index 5a69a171..2482f142 100644 --- a/includes/computer.h +++ b/includes/computer.h @@ -19,6 +19,7 @@ #define __COMPUTER_H__ #include "hardinfo.h" +#include "x_util.h" typedef struct _Computer Computer; typedef struct _OperatingSystem OperatingSystem; @@ -36,14 +37,14 @@ typedef struct _FileSystemEntry FileSystemEntry; struct _AlsaCard { gchar *alsa_name; gchar *friendly_name; -/* +/* gchar *board; gchar revision, compat_class; gint subsys_vendorid, subsys_id; - + gint cap_dac_res, cap_adc_res; gboolean cap_3d_enh; - + gint curr_mic_gain; gboolean curr_3d_enh, curr_loudness, @@ -57,14 +58,18 @@ struct _AlsaInfo { }; struct _DisplayInfo { - gchar *ogl_vendor, *ogl_renderer, *ogl_version; - gboolean dri; - - gchar *display_name, *vendor, *version; - gchar *extensions; - gchar *monitors; - + /* old stuff */ gint width, height; + + /* new stuff */ + xinfo *xi; /* x info */ + wl_info *wl; /* wayland info */ + + gchar *display_server; + + /* don't free */ + const gchar *vendor; /* X vendor; points to xrr->xi->vendor */ + const gchar *session_type; /* points to wl->xdg_session_type */ }; struct _LoadInfo { @@ -97,7 +102,7 @@ struct _OperatingSystem { gchar *desktop; gchar *username; - + gchar *boots; gchar *entropy_avail; @@ -144,6 +149,7 @@ AlsaInfo *computer_get_alsainfo(void); MemoryInfo *computer_get_memory(void); UptimeInfo *computer_get_uptime(void); DisplayInfo *computer_get_display(void); +void computer_free_display(DisplayInfo *di); void scan_modules_do(void); void scan_filesystems(void); 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; } |