Skip to content

Commit

Permalink
Use x_util for display information
Browse files Browse the repository at this point in the history
Hardinfo only knows about X right now, so make it clear that
this information is X-only.

This commit fixes:
* lpereira#200
  now using xrandr to get screen info instead of gdk, so it works
  from the cli
* lpereira#230
  (by removing extension list)

Signed-off-by: Burt P <pburt0@gmail.com>
  • Loading branch information
bp0 committed Mar 18, 2018
1 parent 12d41a8 commit 774e305
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 35 deletions.
18 changes: 12 additions & 6 deletions includes/computer.h
Expand Up @@ -19,6 +19,7 @@
#define __COMPUTER_H__

#include "hardinfo.h"
#include "x_util.h"

typedef struct _Computer Computer;
typedef struct _OperatingSystem OperatingSystem;
Expand All @@ -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,
Expand All @@ -57,14 +58,18 @@ struct _AlsaInfo {
};

struct _DisplayInfo {
/* old stuff */
gchar *ogl_vendor, *ogl_renderer, *ogl_version;
gboolean dri;

gchar *display_name, *vendor, *version;
gchar *extensions;
gchar *monitors;

gint width, height;

/* new stuff */
xrr_info *xrr;
};

struct _LoadInfo {
Expand Down Expand Up @@ -97,7 +102,7 @@ struct _OperatingSystem {

gchar *desktop;
gchar *username;

gchar *boots;

gchar *entropy_avail;
Expand Down Expand Up @@ -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);
Expand Down
58 changes: 35 additions & 23 deletions modules/computer.c
Expand Up @@ -77,7 +77,7 @@ static ModuleEntry entries[] = {
{N_("Boots"), "boot.png", callback_boots, scan_boots, MODULE_FLAG_NONE},
{N_("Languages"), "language.png", callback_locales, scan_locales, MODULE_FLAG_NONE},
{N_("Filesystems"), "dev_removable.png", callback_fs, scan_fs, MODULE_FLAG_NONE},
{N_("Display"), "monitor.png", callback_display, scan_display, MODULE_FLAG_NONE},
{N_("Display (X)"), "monitor.png", callback_display, scan_display, MODULE_FLAG_NONE},
{N_("Environment Variables"), "environment.png", callback_env_var, scan_env_var, MODULE_FLAG_NONE},
#if GLIB_CHECK_VERSION(2,14,0)
{N_("Development"), "devel.png", callback_dev, scan_dev, MODULE_FLAG_NONE},
Expand Down Expand Up @@ -173,6 +173,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();
}
Expand Down Expand Up @@ -575,28 +577,48 @@ gchar *callback_fs(void)

gchar *callback_display(void)
{
struct Info *info = info_new();
int n = 0;
gchar *screens_str = strdup(""), *outputs_str = strdup("");
xrr_info *xrr = computer->display->xrr;

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),
struct Info *info = info_new();
info_add_group(info, _("X Server"),
info_field(_("Current Display Name"), xrr->xi->display_name),
info_field(_("Vendor"), xrr->xi->vendor),
info_field(_("Version"), xrr->xi->version),
info_field(_("Release Number"), xrr->xi->release_number),
info_field_last());

info_add_computed_group(info, _("Monitors"), computer->display->monitors);
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 *dims = (xrr->outputs[n].screen == -1)
? g_strdup(_("Disabled"))
: 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);
outputs_str = h_strdup_cprintf("%s=%s%s%s\n", outputs_str, xrr->outputs[n].name,
xrr->outputs[n].connected ? _("Connected") : _("Disconnected"),
xrr->outputs[n].connected ? "; " : "",
xrr->outputs[n].connected ? dims : "");

g_free(dims);
}
info_add_computed_group(info, _("Outputs (XRandR)"), outputs_str);

info_add_group(info, _("OpenGL"),
info_add_group(info, _("OpenGL (GLX)"),
info_field(_("Vendor"), computer->display->ogl_vendor),
info_field(_("Renderer"), computer->display->ogl_renderer),
info_field(_("Version"), computer->display->ogl_version),
info_field(_("Direct Rendering"),
computer->display->dri ? _("Yes") : _("No")),
info_field_last());

info_add_computed_group(info, _("Extensions"), computer->display->extensions);

return info_flatten(info);
}

Expand Down Expand Up @@ -776,17 +798,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);
Expand Down
41 changes: 35 additions & 6 deletions modules/computer/display.c
Expand Up @@ -130,22 +130,51 @@ get_x11_info(DisplayInfo *di)
}
}

DisplayInfo *
computer_get_display(void)
{
DisplayInfo *di = g_new0(DisplayInfo, 1);

/* This is not a good method, but it is the old and working method
* to fall back on */
gboolean get_screen_from_gdk(DisplayInfo *di) {
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);
return TRUE;
}
return FALSE;
}

DisplayInfo *computer_get_display(void) {
DisplayInfo *di = g_new0(DisplayInfo, 1);
xrr_info *xrr = xrr_get_info();

di->width = di->height = 0;
if (xrr->screen_count > 0) {
di->width = xrr->screens[0].px_width;
di->height = xrr->screens[0].px_height;
} else {
di->width = di->height = 0;
/* old fallback */
get_screen_from_gdk(di);
}

get_glx_info(di);
get_x11_info(di);

di->xrr = xrr;
return di;
}

void computer_free_display(DisplayInfo *di) {
if (di) {
free(di->ogl_vendor);
free(di->ogl_renderer);
free(di->ogl_version);
free(di->display_name);
free(di->vendor);
free(di->version);
free(di->extensions);
free(di->monitors);

xrr_free(di->xrr);
free(di);
}
}

0 comments on commit 774e305

Please sign in to comment.