1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-23 14:42:29 +01:00

Info Panel: display more OS details

Rely on old utsname and os-release (http://0pointer.de/blog/projects/os-release) when available
to display more underlying OS details in the Info panel.
The idea is when someone creates a bug entry we can request them to copy/paste that screen
to give more info about the context that could help us debug the issue.
For example, on my current system it's displaying:
"Running on: Ubuntu 22.10 (x86_64)"
This commit is contained in:
David Maciejak
2023-02-15 05:42:39 +08:00
committed by Carlos R. Mafra
parent a6209cc89b
commit d7d38aa443

View File

@@ -37,6 +37,7 @@
#include <limits.h> #include <limits.h>
#include <errno.h> #include <errno.h>
#include <time.h> #include <time.h>
#include <sys/utsname.h>
#ifdef HAVE_MALLOC_H #ifdef HAVE_MALLOC_H
#include <malloc.h> #include <malloc.h>
@@ -1172,6 +1173,58 @@ static void destroyInfoPanel(WCoreWindow *foo, void *data, XEvent *event)
infoPanel = NULL; infoPanel = NULL;
} }
char *getPrettyOSName(void)
{
char line[200];
char *token;
char *posn = NULL;
const char s[2] = "=";
FILE *fp;
fp = fopen("/etc/os-release", "r");
if (!fp) {
fp = fopen("/usr/lib/os-release", "r");
if (!fp) {
wwarning(_("no os-release file on the system"));
return NULL;
}
}
while (fgets(line, sizeof(line), fp) != NULL) {
if (strncmp(line, "PRETTY_NAME", strlen("PRETTY_NAME")) == 0) {
line[strcspn(line, "\r\n")] = 0;
token = strtok(line, s);
if (token) {
//get straight to the second part of the line
token = strtok(NULL, s);
if (token) {
//removing potential quotes
char *dst = token;
char *src = token;
char c;
while ((c = *src++) != '\0') {
if (c == '\\') {
*dst++ = c;
if ((c = *src++) == '\0')
break;
*dst++ = c;
}
else if (c != '"' && c != '\'')
*dst++ = c;
}
*dst = '\0';
posn = malloc(strlen(token));
strncpy(posn, token, strlen(token));
}
}
break;
}
}
fclose(fp);
return posn;
}
void wShowInfoPanel(WScreen *scr) void wShowInfoPanel(WScreen *scr)
{ {
InfoPanel *panel; InfoPanel *panel;
@@ -1198,6 +1251,7 @@ void wShowInfoPanel(WScreen *scr)
int current_year = 2020; int current_year = 2020;
time_t s; time_t s;
struct tm *current_time; struct tm *current_time;
struct utsname uts;
s = time(NULL); s = time(NULL);
if (s) { if (s) {
@@ -1225,7 +1279,7 @@ void wShowInfoPanel(WScreen *scr)
#else #else
pwidth = WMScaleX(382); pwidth = WMScaleX(382);
#endif #endif
pheight = WMScaleY(250); pheight = WMScaleY(270);
WMResizeWidget(panel->win, pwidth, pheight); WMResizeWidget(panel->win, pwidth, pheight);
logo = WMCreateApplicationIconBlendedPixmap(scr->wmscreen, (RColor *) NULL); logo = WMCreateApplicationIconBlendedPixmap(scr->wmscreen, (RColor *) NULL);
@@ -1289,7 +1343,7 @@ void wShowInfoPanel(WScreen *scr)
panel->copyrL = WMCreateLabel(panel->win); panel->copyrL = WMCreateLabel(panel->win);
WMResizeWidget(panel->copyrL, WMScaleX(360), WMScaleY(60)); WMResizeWidget(panel->copyrL, WMScaleX(360), WMScaleY(60));
WMMoveWidget(panel->copyrL, WMScaleX(15), WMScaleY(190)); WMMoveWidget(panel->copyrL, WMScaleX(15), WMScaleY(210));
WMSetLabelTextAlignment(panel->copyrL, WALeft); WMSetLabelTextAlignment(panel->copyrL, WALeft);
snprintf(buffer, sizeof(buffer), COPYRIGHT_TEXT, current_year); snprintf(buffer, sizeof(buffer), COPYRIGHT_TEXT, current_year);
@@ -1302,9 +1356,19 @@ void wShowInfoPanel(WScreen *scr)
} }
strbuf = NULL; strbuf = NULL;
if (uname(&uts) != -1) {
char *posn = getPrettyOSName();
if (posn) {
snprintf(buffer, sizeof(buffer), _("Running on: %s (%s)\n"), posn, uts.machine);
free(posn);
}
else
snprintf(buffer, sizeof(buffer), _("Running on: %s (%s)\n"), uts.sysname, uts.machine);
strbuf = wstrappend(strbuf, buffer);
}
snprintf(buffer, sizeof(buffer), _("Using visual 0x%x: %s %ibpp "), snprintf(buffer, sizeof(buffer), _("Using visual 0x%x: %s %ibpp "),
(unsigned)scr->w_visual->visualid, visuals[scr->w_visual->class], scr->w_depth); (unsigned)scr->w_visual->visualid, visuals[scr->w_visual->class], scr->w_depth);
strbuf = wstrappend(strbuf, buffer); strbuf = wstrappend(strbuf, buffer);
switch (scr->w_depth) { switch (scr->w_depth) {
@@ -1329,9 +1393,9 @@ void wShowInfoPanel(WScreen *scr)
struct mallinfo2 ma = mallinfo2(); struct mallinfo2 ma = mallinfo2();
snprintf(buffer, sizeof(buffer), snprintf(buffer, sizeof(buffer),
#ifdef DEBUG #ifdef DEBUG
_("Total memory allocated: %lu kB (in use: %lu kB, %lu free chunks).\n"), _("Total memory allocated: %lu kB (in use: %lu kB, %lu free chunks)\n"),
#else #else
_("Total memory allocated: %lu kB (in use: %lu kB).\n"), _("Total memory allocated: %lu kB (in use: %lu kB)\n"),
#endif #endif
(ma.arena + ma.hblkhd) / 1024, (ma.arena + ma.hblkhd) / 1024,
(ma.uordblks + ma.hblkhd) / 1024 (ma.uordblks + ma.hblkhd) / 1024
@@ -1382,7 +1446,7 @@ void wShowInfoPanel(WScreen *scr)
strbuf = wstrappend(strbuf, _("Xinerama: ")); strbuf = wstrappend(strbuf, _("Xinerama: "));
{ {
char tmp[128]; char tmp[128];
snprintf(tmp, sizeof(tmp) - 1, _("%d head(s) found."), scr->xine_info.count); snprintf(tmp, sizeof(tmp) - 1, _("%d head(s) found"), scr->xine_info.count);
strbuf = wstrappend(strbuf, tmp); strbuf = wstrappend(strbuf, tmp);
} }
#endif #endif
@@ -1394,14 +1458,13 @@ void wShowInfoPanel(WScreen *scr)
strbuf = wstrappend(strbuf, _("supported")); strbuf = wstrappend(strbuf, _("supported"));
else else
strbuf = wstrappend(strbuf, _("unsupported")); strbuf = wstrappend(strbuf, _("unsupported"));
strbuf = wstrappend(strbuf, ".");
#endif #endif
panel->infoL = WMCreateLabel(panel->win); panel->infoL = WMCreateLabel(panel->win);
#if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO2) && defined(DEBUG) #if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO2) && defined(DEBUG)
WMResizeWidget(panel->infoL, WMScaleX(380), WMScaleY(80)); WMResizeWidget(panel->infoL, WMScaleX(380), WMScaleY(100));
#else #else
WMResizeWidget(panel->infoL, WMScaleX(350), WMScaleY(80)); WMResizeWidget(panel->infoL, WMScaleX(350), WMScaleY(100));
#endif #endif
WMMoveWidget(panel->infoL, WMScaleX(15), WMScaleY(115)); WMMoveWidget(panel->infoL, WMScaleX(15), WMScaleY(115));
WMSetLabelText(panel->infoL, strbuf); WMSetLabelText(panel->infoL, strbuf);