aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBurt P <pburt0@gmail.com>2018-03-23 13:20:32 -0500
committerLeandro A. F. Pereira <leandro@hardinfo.org>2018-04-24 07:43:43 -0700
commitea8ce7dabdf2e3a27e1d6edb84752dff5700a849 (patch)
treeb448692b2edf578cd4256bd1b0aca44f4a6c2957
parentbcd206e60096f2a7d3c748feaa918cb500074f90 (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.h28
-rw-r--r--modules/computer.c117
-rw-r--r--modules/computer/display.c163
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;
}