diff --git a/includes/computer.h b/includes/computer.h index 5a69a1710..c02672898 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 { + /* 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 { @@ -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 a936605be..934dae32a 100644 --- a/modules/computer.c +++ b/modules/computer.c @@ -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}, @@ -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(); } @@ -575,19 +577,41 @@ 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), @@ -595,8 +619,6 @@ gchar *callback_display(void) computer->display->dri ? _("Yes") : _("No")), info_field_last()); - info_add_computed_group(info, _("Extensions"), computer->display->extensions); - return info_flatten(info); } @@ -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); diff --git a/modules/computer/display.c b/modules/computer/display.c index 61eac4eb1..83e5de5bb 100644 --- a/modules/computer/display.c +++ b/modules/computer/display.c @@ -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); + } +}