Пример #1
0
int x_types_init(void)
{
  size_t i;
  size_t nr[2] = { 0, 0 };
  size_t k_nr_hint;

  TRACE("sizeof(struct x_node) %zu\n", sizeof(struct x_node));
  TRACE("sizeof(struct k_node) %zu\n", sizeof(struct k_node));

  for (i = 0; i < NR_X_TYPES; i++) {
    if (hash_table_init(&x_types[i].x_hash_table, x_types[i].x_nr_hint) < 0)
      return -1;
    nr[x_types[i].x_which] += x_types[i].x_nr_hint;
  }

  for (i = 0; i < 2; i++) {
    x_all[i] = x_lookup((i == 0) ? X_U : X_V,
                        (i == 0) ? X_U_NAME : X_V_NAME,
                        NULL,
                        L_CREATE);

    if (x_all[i] == NULL)
      return -1;
  }

  k_nr_hint = nr[0] * nr[1];
  TRACE("nr[0] %zu, nr[1] %zu, k_nr_hint %zu\n", nr[0], nr[1], k_nr_hint);

  if (hash_table_init(&k_hash_table, k_nr_hint) < 0)
    return -1;

  return 0;
}
Пример #2
0
struct x_node *x_lookup_str(const char *str)
{
  size_t i;

  /* "host:i101-101.ranger.tacc.utexas.edu" => x_lookup(X_HOST, "i101-...") */

  for (i = 0; i < NR_X_TYPES; i++) {
    size_t len = strlen(x_types[i].x_type_name);

    if (strncmp(str, x_types[i].x_type_name, len) == 0 &&
        (str[len] == ':' || str[len] == '='))
      return x_lookup(i, str + len + 1, NULL, 0);
  }

  return NULL;
}
Пример #3
0
static void
x_analyze(x_display *xdpy, int fam)
{
  int i, j, n, face, pixsize, nsizes;
  char *name;
  if (tmp_fonts) tmp_free();
  tmp_fonts = XListFonts(xdpy->dpy, pattern[((unsigned int)fam)>>2], 1024, &n);

  for (i=0 ; i<n ; i++) {
    name = x_face(tmp_fonts[i], &face);
    if (!name) continue;

    /* extract pixels field */
    pixsize = 0;
    if (name[0]!='*') while (name[0] && name[0]>='0' && name[0]<='9')
      pixsize = 10*pixsize + *(name++) - '0';
    else
      name++;
    if (name[0]!='-') continue;

    /* protect against superlong font names */
    if (!pixsize && strlen(tmp_fonts[i])>120) continue;

    face += fam;

    nsizes = xdpy->available[face].nsizes;
    if (x_lookup(pixsize, xdpy->available[face].sizes, nsizes)) continue;
    if (nsizes%12==0) {
      int *sizes = xdpy->available[face].sizes;
      char **names = xdpy->available[face].names;
      xdpy->available[face].sizes = p_realloc(sizes, sizeof(int)*(nsizes+12));
      if (!xdpy->available[face].sizes) {
        xdpy->available[face].sizes = sizes;
        return;
      }
      xdpy->available[face].names = p_realloc(names,sizeof(char*)*(nsizes+13));
      if (!xdpy->available[face].names) {
        xdpy->available[face].names = names;
        return;
      }
    }
    j = x_insert(pixsize, xdpy->available[face].sizes,
                 xdpy->available[face].names, nsizes);
    xdpy->available[face].nsizes++;
    if (pixsize) {
      xdpy->available[face].names[j] = p_strcpy(tmp_fonts[i]);
    } else {
      /* scalable font needs wildcard name */
      char nm[128], *pnm = nm;
      int n = 7;
      name = tmp_fonts[i];
      while (n--) while ((*(pnm++)= *(name++))!='-');
      /* skip over pixels, points fields */
      *(pnm++)= '*';   *(pnm++)= '-';  *(pnm++)= '*';   *(pnm++)= '-';
      for (n=2 ; n-- ;) while (name[0] && *(name++)!='-');
      /* copy hres, vres, spacing fields */
      for (n=3 ; n-- ;) while (name[0] && (*(pnm++)= *(name++))!='-');
      /* skip over average width field */
      *(pnm++)= '*';   *(pnm++)= '-';
      while (name[0] && *(name++)!='-');
      /* copy remainder (character set fields) */
      while ((*(pnm++)= *(name++)));
      xdpy->available[face].names[j] = p_strcpy(nm);
    }
  }

  tmp_free();
}