diff options
Diffstat (limited to 'hardinfo/x_util.c')
-rw-r--r-- | hardinfo/x_util.c | 342 |
1 files changed, 0 insertions, 342 deletions
diff --git a/hardinfo/x_util.c b/hardinfo/x_util.c deleted file mode 100644 index 2187b224..00000000 --- a/hardinfo/x_util.c +++ /dev/null @@ -1,342 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2017 L. A. F. Pereira <l@tia.mat.br> - * This file - * Copyright (C) 2018 Burt P. <pburt0@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "hardinfo.h" -#include "x_util.h" -#include <X11/Xlib.h> - -/* wayland stuff lives here for now */ - -wl_info *get_walyand_info() { - wl_info *s = malloc(sizeof(wl_info)); - memset(s, 0, sizeof(wl_info)); - s->xdg_session_type = g_strdup( getenv("XDG_SESSION_TYPE") ); - if (s->xdg_session_type == NULL) - s->xdg_session_type = strdup("x11"); - s->display_name = g_strdup( getenv("WAYLAND_DISPLAY") ); - return s; -} - -void wl_free(wl_info *s) { - if (s) { - free(s->xdg_session_type); - free(s->display_name); - free(s); - } -} - -/* get x information from xrandr, xdpyinfo, and glxinfo */ - -static char *simple_line_value(char *line, const char *prefix) { - if (g_str_has_prefix(g_strstrip(line), prefix)) { - line += strlen(prefix) + 1; - return g_strstrip(line); - } else - return NULL; -} - -gboolean fill_glx_info(glx_info *glx) { - gboolean spawned; - gchar *out, *err, *p, *l, *next_nl; - gchar *glx_cmd = g_strdup("glxinfo"); - -#define GLX_MATCH_LINE(prefix_str, struct_member) \ - if (l = simple_line_value(p, prefix_str)) { glx->struct_member = g_strdup(l); goto glx_next_line; } - - spawned = hardinfo_spawn_command_line_sync(glx_cmd, - &out, &err, NULL, NULL); - g_free(glx_cmd); - if (spawned) { - p = out; - while(next_nl = strchr(p, '\n')) { - strend(p, '\n'); - g_strstrip(p); - GLX_MATCH_LINE("GLX version", glx_version); - GLX_MATCH_LINE("OpenGL vendor string", ogl_vendor); - GLX_MATCH_LINE("OpenGL renderer string", ogl_renderer); - GLX_MATCH_LINE("OpenGL renderer string", ogl_renderer); - GLX_MATCH_LINE("OpenGL core profile version string", ogl_core_version); - GLX_MATCH_LINE("OpenGL core profile shading language version string", ogl_core_sl_version); - GLX_MATCH_LINE("OpenGL version string", ogl_version); - GLX_MATCH_LINE("OpenGL shading language version string", ogl_sl_version); - GLX_MATCH_LINE("OpenGL ES profile version string", ogles_version); - GLX_MATCH_LINE("OpenGL ES profile shading language version string", ogles_sl_version); - - if (l = simple_line_value(p, "direct rendering")) { - if (strstr(p, "Yes")) - glx->direct_rendering = 1; - goto glx_next_line; - } - - glx_next_line: - p = next_nl + 1; - } - g_free(out); - g_free(err); - return TRUE; - } - return FALSE; -} - -glx_info *glx_create() { - glx_info *s = malloc(sizeof(glx_info)); - memset(s, 0, sizeof(glx_info)); - return s; -} - -void glx_free(glx_info *s) { - if (s) { - free(s->glx_version); - free(s->ogl_vendor); - free(s->ogl_renderer); - free(s->ogl_core_version); - free(s->ogl_core_sl_version); - free(s->ogl_version); - free(s->ogl_sl_version); - free(s->ogles_version); - free(s->ogles_sl_version); - free(s); - } -} - -gboolean fill_xinfo(xinfo *xi) { - gboolean spawned; - gchar *out, *err, *p, *l, *next_nl; - gchar *xi_cmd = g_strdup("xdpyinfo"); - -#define XI_MATCH_LINE(prefix_str, struct_member) \ - if (l = simple_line_value(p, prefix_str)) { xi->struct_member = g_strdup(l); goto xi_next_line; } - - spawned = hardinfo_spawn_command_line_sync(xi_cmd, - &out, &err, NULL, NULL); - g_free(xi_cmd); - if (spawned) { - p = out; - while(next_nl = strchr(p, '\n')) { - strend(p, '\n'); - g_strstrip(p); - XI_MATCH_LINE("name of display", display_name); - XI_MATCH_LINE("vendor string", vendor); - XI_MATCH_LINE("vendor release number", release_number); - XI_MATCH_LINE("XFree86 version", version); - XI_MATCH_LINE("X.Org version", version); - - xi_next_line: - p = next_nl + 1; - } - g_free(out); - g_free(err); - return TRUE; - } - return FALSE; -} - -gboolean fill_xrr_info(xrr_info *xrr) { - gboolean spawned; - gchar *out, *err, *p, *next_nl; - gchar *xrr_cmd = g_strdup("xrandr --prop"); - int ec; - - x_screen ts; - x_output to; - char output_id[128]; - char status[128]; - char alist[512]; - - memset(&ts, 0, sizeof(x_screen)); - memset(&to, 0, sizeof(x_output)); - memset(output_id, 0, sizeof(output_id)); - memset(status, 0, sizeof(status)); - memset(alist, 0, sizeof(alist)); - - spawned = hardinfo_spawn_command_line_sync(xrr_cmd, - &out, &err, NULL, NULL); - g_free(xrr_cmd); - if (spawned) { - p = out; - while(next_nl = strchr(p, '\n')) { - strend(p, '\n'); - g_strstrip(p); - - ec = sscanf(p, "Screen %d: minimum %d x %d, current %d x %d, maximum %d x %d", - &ts.number, - &ts.min_px_width, &ts.min_px_height, - &ts.px_width, &ts.px_height, - &ts.max_px_width, &ts.max_px_height); - if (ec == 7) { - /* new screen */ - xrr->screen_count++; - if (xrr->screens == NULL) - xrr->screens = malloc(xrr->screen_count * sizeof(x_screen)); - else - xrr->screens = realloc(xrr->screens, xrr->screen_count * sizeof(x_screen)); - memcpy(&xrr->screens[xrr->screen_count-1], &ts, sizeof(x_screen)); - memset(&ts, 0, sizeof(x_screen)); /* clear the temp */ - goto xrr_next_line; - } - - /* looking for: - * <output_id> (connected|disconnected|unknown connection) (primary|?) <%dx%d+%d+%d> (attribute_list) mm x mm - */ - ec = sscanf(p, "%127s %127[^(](%511[^)]", output_id, status, alist); - if (ec == 3) { - int is_output = 0, found_rect = 0, n = 0; - gchar **ot = g_strsplit(status, " ", 0); - - /* find rect */ - while (ot[n] != NULL) { - ec = sscanf(ot[n], "%dx%d+%d+%d", &to.px_width, &to.px_height, &to.px_offset_x, &to.px_offset_y); - if (ec == 4) { - found_rect = 1; - break; - } - n++; - } - if (found_rect) - to.screen = xrr->screen_count - 1; - else - to.screen = -1; - - if (strcmp("disconnected", ot[0]) == 0) { - is_output = 1; - to.connected = 0; - } else - if (strcmp("unknown", ot[0]) == 0 && strcmp("connection", ot[1]) == 0) { - is_output = 1; - to.connected = -1; - } else - if (strcmp("connected", ot[0]) == 0) { - is_output = 1; - to.connected = 1; - } - g_strfreev(ot); - if (is_output) { - strncpy(to.name, output_id, 63); - xrr->output_count++; - if (xrr->outputs == NULL) - xrr->outputs = malloc(xrr->output_count * sizeof(x_output)); - else - xrr->outputs = realloc(xrr->outputs, xrr->output_count * sizeof(x_output)); - memcpy(&xrr->outputs[xrr->output_count-1], &to, sizeof(x_output)); - memset(&to, 0, sizeof(x_output)); /* clear the temp */ - goto xrr_next_line; - } - } - - xrr_next_line: - p = next_nl + 1; - } - g_free(out); - g_free(err); - return TRUE; - } - return FALSE; -} - -gboolean fill_basic_xlib(xinfo *xi) { - Display *display; - int s, w, h, rn; - - display = XOpenDisplay(NULL); - if (display) { - if (!xi->display_name) - xi->display_name = XDisplayName(NULL); - - if (!xi->vendor) - xi->vendor = XServerVendor(display); - - if (!xi->release_number) { - rn = XVendorRelease(display); - xi->release_number = g_strdup_printf("%d", rn); - } - - if (!xi->xrr->screen_count) { - s = DefaultScreen(display); - w = XDisplayWidth(display, s); - h = XDisplayHeight(display, s); - - /* create at least one screen */ - x_screen ts; - memset(&ts, 0, sizeof(x_screen)); - ts.number = s; - ts.px_width = w; - ts.px_height = h; - - xi->xrr->screen_count++; - if (xi->xrr->screens == NULL) - xi->xrr->screens = malloc(xi->xrr->screen_count * sizeof(x_screen)); - else - xi->xrr->screens = realloc(xi->xrr->screens, xi->xrr->screen_count * sizeof(x_screen)); - memcpy(&xi->xrr->screens[xi->xrr->screen_count-1], &ts, sizeof(x_screen)); - } - return TRUE; - } - return FALSE; -} - -xrr_info *xrr_create() { - xrr_info *xrr = malloc(sizeof(xrr_info)); - memset(xrr, 0, sizeof(xrr_info)); - return xrr; -} - -void xrr_free(xrr_info *xrr) { - if (xrr) { - free(xrr->screens); - free(xrr->outputs); - free(xrr->providers); - free(xrr->monitors); - free(xrr); - } -} - -xinfo *xinfo_get_info() { - int fail = 0; - xinfo *xi = malloc(sizeof(xinfo)); - memset(xi, 0, sizeof(xinfo)); - xi->glx = glx_create(); - xi->xrr = xrr_create(); - - if ( !fill_xinfo(xi) ) - fail++; - if ( !fill_xrr_info(xi->xrr) ) - fail++; - if ( !fill_glx_info(xi->glx) ) - fail++; - - if (fail) { - /* as fallback, try xlib directly */ - if ( !fill_basic_xlib(xi) ) - xi->nox = 1; - } - return xi; -} - -void xinfo_free(xinfo *xi) { - if (xi) { - free(xi->display_name); - free(xi->vendor); - free(xi->version); - free(xi->release_number); - xrr_free(xi->xrr); - glx_free(xi->glx); - free(xi); - } -} |