diff options
Diffstat (limited to 'modules/computer')
| -rw-r--r-- | modules/computer/boots.c | 58 | ||||
| -rw-r--r-- | modules/computer/display.c | 83 | ||||
| -rw-r--r-- | modules/computer/uptime.c | 1 | 
3 files changed, 73 insertions, 69 deletions
| diff --git a/modules/computer/boots.c b/modules/computer/boots.c index d8a6d32a..ba458242 100644 --- a/modules/computer/boots.c +++ b/modules/computer/boots.c @@ -24,43 +24,43 @@  void  scan_boots_real(void)  { -    FILE *last; -    char buffer[256]; +    gchar **tmp; +    gboolean spawned; +    gchar *out, *err, *p, *s, *next_nl;      scan_os(FALSE);      if (!computer->os->boots) -      computer->os->boots = g_strdup_printf("[%s]\n", _("Boots")); +      computer->os->boots = strdup("");      else        return; -    last = popen("last", "r"); -    if (last) { -      while (fgets(buffer, 256, last)) { -        if (strstr(buffer, "system boot")) { -          gchar **tmp, *buf = buffer; - -          strend(buffer, '\n'); - -          while (*buf) { -            if (*buf == ' ' && *(buf + 1) == ' ') { -              memmove(buf, buf + 1, strlen(buf) + 1); - -              buf--; -            } else { -              buf++; +    spawned = g_spawn_command_line_sync("last", +            &out, &err, NULL, NULL); +    if (spawned && out != NULL) { +        p = out; +        while(next_nl = strchr(p, '\n')) { +            strend(p, '\n'); +            if (strstr(p, "system boot")) { +                s = p; +                while (*s) { +                  if (*s == ' ' && *(s + 1) == ' ') { +                    memmove(s, s + 1, strlen(s) + 1); +                    s--; +                  } else { +                    s++; +                  } +                } +                tmp = g_strsplit(p, " ", 0); +                computer->os->boots = +                  h_strdup_cprintf("\n%s %s %s %s=%s", +                    computer->os->boots, +                    tmp[4], tmp[5], tmp[6], tmp[7], tmp[3]); +                g_strfreev(tmp);              } -          } - -          tmp = g_strsplit(buffer, " ", 0); -          computer->os->boots = -            h_strdup_cprintf("\n%s %s %s %s=%s|%s", -              computer->os->boots, -              tmp[4], tmp[5], tmp[6], tmp[7], tmp[3], tmp[8]); -          g_strfreev(tmp); +            p = next_nl + 1;          } -      } - -      pclose(last); +      g_free(out); +      g_free(err);      }  } diff --git a/modules/computer/display.c b/modules/computer/display.c index 2c98b144..61eac4eb 100644 --- a/modules/computer/display.c +++ b/modules/computer/display.c @@ -26,38 +26,39 @@ get_glx_info(DisplayInfo *di)  {      gchar *output;      if (g_spawn_command_line_sync("glxinfo", &output, NULL, NULL, NULL)) { -	gchar **output_lines; -	gint i = 0; +        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); +        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]); +                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); +                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_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)"); -	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"; +        di->ogl_vendor = di->ogl_renderer = di->ogl_version = _("(Unknown)");      }  } @@ -66,7 +67,7 @@ static void  get_x11_info(DisplayInfo *di)  {      gchar *output; -     +      if (g_spawn_command_line_sync("xdpyinfo", &output, NULL, NULL, NULL)) {  	gchar **output_lines, **old; @@ -74,8 +75,9 @@ get_x11_info(DisplayInfo *di)  	g_free(output);  	old = output_lines; -	while (*(output_lines++)) { -            gchar **tmp = g_strsplit(*output_lines, ":", 0); +	while (*output_lines) { +            gchar **tmp = g_strsplit(*output_lines, ":", 2); +            output_lines++;              if (tmp[1] && tmp[0]) {                tmp[1] = g_strchug(tmp[1]); @@ -83,20 +85,21 @@ get_x11_info(DisplayInfo *di)                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,  +                  di->extensions = h_strconcat(di->extensions,                                                 g_strstrip(*(++output_lines)),                                                 "=\n",                                                 NULL);                  }                  g_strfreev(tmp); -                 +                  break;                }              } @@ -106,19 +109,19 @@ get_x11_info(DisplayInfo *di)  	g_strfreev(old);      } -     +      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);          } @@ -131,9 +134,9 @@ 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); diff --git a/modules/computer/uptime.c b/modules/computer/uptime.c index 5f0f1942..6ef3d250 100644 --- a/modules/computer/uptime.c +++ b/modules/computer/uptime.c @@ -30,6 +30,7 @@ computer_get_uptime(void)          ui->minutes = minutes / 60;          fclose(procuptime);      } else { +        g_free(ui);          return NULL;      } | 
