- static const gint possible_depths[7] = { 32, 24, 16, 15, 8, 4, 1 };
- static const GdkVisualType possible_types[6] =
- {
- GDK_VISUAL_DIRECT_COLOR,
- GDK_VISUAL_TRUE_COLOR,
- GDK_VISUAL_PSEUDO_COLOR,
- GDK_VISUAL_STATIC_COLOR,
- GDK_VISUAL_GRAYSCALE,
- GDK_VISUAL_STATIC_GRAY
- };
-
- static const gint npossible_depths = sizeof(possible_depths)/sizeof(gint);
- static const gint npossible_types = sizeof(possible_types)/sizeof(GdkVisualType);
-
- XVisualInfo *visual_list;
- XVisualInfo visual_template;
- GdkVisualPrivate temp_visual;
- Visual *default_xvisual;
- int nxvisuals;
- int i, j;
-
- visual_template.screen = gdk_screen;
- visual_list = XGetVisualInfo (gdk_display, VisualScreenMask, &visual_template, &nxvisuals);
- visuals = g_new (GdkVisualPrivate, nxvisuals);
-
- default_xvisual = DefaultVisual (gdk_display, gdk_screen);
-
- nvisuals = 0;
- for (i = 0; i < nxvisuals; i++)
- {
- if (visual_list[i].depth >= 1)
- {
-#ifdef __cplusplus
- switch (visual_list[i].c_class)
-#else /* __cplusplus */
- switch (visual_list[i].class)
-#endif /* __cplusplus */
- {
- case StaticGray:
- visuals[nvisuals].visual.type = GDK_VISUAL_STATIC_GRAY;
- break;
- case GrayScale:
- visuals[nvisuals].visual.type = GDK_VISUAL_GRAYSCALE;
- break;
- case StaticColor:
- visuals[nvisuals].visual.type = GDK_VISUAL_STATIC_COLOR;
- break;
- case PseudoColor:
- visuals[nvisuals].visual.type = GDK_VISUAL_PSEUDO_COLOR;
- break;
- case TrueColor:
- visuals[nvisuals].visual.type = GDK_VISUAL_TRUE_COLOR;
- break;
- case DirectColor:
- visuals[nvisuals].visual.type = GDK_VISUAL_DIRECT_COLOR;
- break;
- }
-
- visuals[nvisuals].visual.depth = visual_list[i].depth;
- visuals[nvisuals].visual.byte_order =
- (ImageByteOrder(gdk_display) == LSBFirst) ?
- GDK_LSB_FIRST : GDK_MSB_FIRST;
- visuals[nvisuals].visual.red_mask = visual_list[i].red_mask;
- visuals[nvisuals].visual.green_mask = visual_list[i].green_mask;
- visuals[nvisuals].visual.blue_mask = visual_list[i].blue_mask;
- visuals[nvisuals].visual.colormap_size = visual_list[i].colormap_size;
- visuals[nvisuals].visual.bits_per_rgb = visual_list[i].bits_per_rgb;
- visuals[nvisuals].xvisual = visual_list[i].visual;
-
- if ((visuals[nvisuals].visual.type == GDK_VISUAL_TRUE_COLOR) ||
- (visuals[nvisuals].visual.type == GDK_VISUAL_DIRECT_COLOR))
- {
- gdk_visual_decompose_mask (visuals[nvisuals].visual.red_mask,
- &visuals[nvisuals].visual.red_shift,
- &visuals[nvisuals].visual.red_prec);
-
- gdk_visual_decompose_mask (visuals[nvisuals].visual.green_mask,
- &visuals[nvisuals].visual.green_shift,
- &visuals[nvisuals].visual.green_prec);
-
- gdk_visual_decompose_mask (visuals[nvisuals].visual.blue_mask,
- &visuals[nvisuals].visual.blue_shift,
- &visuals[nvisuals].visual.blue_prec);
- }
- else
- {
- visuals[nvisuals].visual.red_mask = 0;
- visuals[nvisuals].visual.red_shift = 0;
- visuals[nvisuals].visual.red_prec = 0;
-
- visuals[nvisuals].visual.green_mask = 0;
- visuals[nvisuals].visual.green_shift = 0;
- visuals[nvisuals].visual.green_prec = 0;
-
- visuals[nvisuals].visual.blue_mask = 0;
- visuals[nvisuals].visual.blue_shift = 0;
- visuals[nvisuals].visual.blue_prec = 0;
- }
-
- nvisuals += 1;
- }
- }
-
- if (visual_list)
- XFree (visual_list);
-
- for (i = 0; i < nvisuals; i++)
- {
- for (j = i+1; j < nvisuals; j++)
- {
- if (visuals[j].visual.depth >= visuals[i].visual.depth)
- {
- if ((visuals[j].visual.depth == 8) && (visuals[i].visual.depth == 8))
- {
- if (visuals[j].visual.type == GDK_VISUAL_PSEUDO_COLOR)
- {
- temp_visual = visuals[j];
- visuals[j] = visuals[i];
- visuals[i] = temp_visual;
- }
- else if ((visuals[i].visual.type != GDK_VISUAL_PSEUDO_COLOR) &&
- visuals[j].visual.type > visuals[i].visual.type)
- {
- temp_visual = visuals[j];
- visuals[j] = visuals[i];
- visuals[i] = temp_visual;
- }
- }
- else if ((visuals[j].visual.depth > visuals[i].visual.depth) ||
- ((visuals[j].visual.depth == visuals[i].visual.depth) &&
- (visuals[j].visual.type > visuals[i].visual.type)))
- {
- temp_visual = visuals[j];
- visuals[j] = visuals[i];
- visuals[i] = temp_visual;
- }
- }
- }
- }
-
- for (i = 0; i < nvisuals; i++)
- if (default_xvisual->visualid == visuals[i].xvisual->visualid)
- {
- system_visual = &visuals[i];
- break;
- }
-
-#ifdef G_ENABLE_DEBUG
- if (gdk_debug_flags & GDK_DEBUG_MISC)
- for (i = 0; i < nvisuals; i++)
- g_message ("visual: %s: %d",
- visual_names[visuals[i].visual.type],
- visuals[i].visual.depth);
-#endif /* G_ENABLE_DEBUG */
-
- navailable_depths = 0;
- for (i = 0; i < npossible_depths; i++)
- {
- for (j = 0; j < nvisuals; j++)
- {
- if (visuals[j].visual.depth == possible_depths[i])
- {
- available_depths[navailable_depths++] = visuals[j].visual.depth;
- break;
- }
- }
- }
-
- if (navailable_depths == 0)
- g_error ("unable to find a usable depth");
-
- navailable_types = 0;
- for (i = 0; i < npossible_types; i++)
- {
- for (j = 0; j < nvisuals; j++)
- {
- if (visuals[j].visual.type == possible_types[i])
- {
- available_types[navailable_types++] = visuals[j].visual.type;
- break;
- }
- }
- }
-
- for (i = 0; i < nvisuals; i++)
- gdk_visual_add ((GdkVisual*) &visuals[i]);
-
- if (npossible_types == 0)
- g_error ("unable to find a usable visual type");