1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
29 #include "gdkvisual.h"
31 #include "gdkprivate-broadway.h"
32 #include "gdkscreen-broadway.h"
33 #include "gdkinternals.h"
35 struct _GdkVisualPrivate
40 struct _GdkVisualClass
42 GObjectClass parent_class;
45 static void gdk_visual_decompose_mask (gulong mask,
50 G_DEFINE_TYPE (GdkVisual, gdk_visual, G_TYPE_OBJECT)
53 gdk_visual_finalize (GObject *object)
55 G_OBJECT_CLASS (gdk_visual_parent_class)->finalize (object);
59 gdk_visual_class_init (GdkVisualClass *visual_class)
61 GObjectClass *object_class = G_OBJECT_CLASS (visual_class);
63 g_type_class_add_private (object_class, sizeof (GdkVisualPrivate));
65 object_class->finalize = gdk_visual_finalize;
69 gdk_visual_init (GdkVisual *visual)
71 visual->priv = G_TYPE_INSTANCE_GET_PRIVATE (visual,
78 _gdk_visual_init (GdkScreen *screen)
80 GdkScreenBroadway *screen_broadway;
84 g_return_if_fail (GDK_IS_SCREEN (screen));
85 screen_broadway = GDK_SCREEN_BROADWAY (screen);
88 visuals = g_new (GdkVisual *, nvisuals);
90 visuals[0] = g_object_new (GDK_TYPE_VISUAL, NULL);
91 visuals[0]->priv->screen = screen;
92 visuals[0]->type = GDK_VISUAL_TRUE_COLOR;
93 visuals[0]->depth = 32;
94 visuals[0]->byte_order = (G_BYTE_ORDER == G_LITTLE_ENDIAN) ? GDK_LSB_FIRST : GDK_MSB_FIRST;
95 visuals[0]->red_mask = 0xff0000;
96 visuals[0]->green_mask = 0xff00;
97 visuals[0]->blue_mask = 0xff;
98 visuals[0]->colormap_size = 256;
99 visuals[0]->bits_per_rgb = 8;
100 gdk_visual_decompose_mask (visuals[0]->red_mask,
101 &visuals[0]->red_shift,
102 &visuals[0]->red_prec);
103 gdk_visual_decompose_mask (visuals[0]->green_mask,
104 &visuals[0]->green_shift,
105 &visuals[0]->green_prec);
106 gdk_visual_decompose_mask (visuals[0]->blue_mask,
107 &visuals[0]->blue_shift,
108 &visuals[0]->blue_prec);
110 visuals[1] = g_object_new (GDK_TYPE_VISUAL, NULL);
111 visuals[1]->priv->screen = screen;
112 visuals[1]->type = GDK_VISUAL_TRUE_COLOR;
113 visuals[1]->depth = 24;
114 visuals[1]->byte_order = (G_BYTE_ORDER == G_LITTLE_ENDIAN) ? GDK_LSB_FIRST : GDK_MSB_FIRST;
115 visuals[1]->red_mask = 0xff0000;
116 visuals[1]->green_mask = 0xff00;
117 visuals[1]->blue_mask = 0xff;
118 visuals[1]->colormap_size = 256;
119 visuals[1]->bits_per_rgb = 8;
120 gdk_visual_decompose_mask (visuals[1]->red_mask,
121 &visuals[1]->red_shift,
122 &visuals[1]->red_prec);
123 gdk_visual_decompose_mask (visuals[1]->green_mask,
124 &visuals[1]->green_shift,
125 &visuals[1]->green_prec);
126 gdk_visual_decompose_mask (visuals[1]->blue_mask,
127 &visuals[1]->blue_shift,
128 &visuals[1]->blue_prec);
130 screen_broadway->system_visual = visuals[1];
131 screen_broadway->rgba_visual = visuals[0];
133 screen_broadway->navailable_depths = 2;
134 screen_broadway->available_depths[0] = 32;
135 screen_broadway->available_depths[1] = 24;
137 screen_broadway->navailable_types = 1;
138 screen_broadway->available_types[0] = GDK_VISUAL_TRUE_COLOR;
140 screen_broadway->visuals = visuals;
141 screen_broadway->nvisuals = nvisuals;
145 gdk_visual_get_best_depth (void)
147 GdkScreen *screen = gdk_screen_get_default();
149 return GDK_SCREEN_BROADWAY (screen)->available_depths[0];
153 gdk_visual_get_best_type (void)
155 GdkScreen *screen = gdk_screen_get_default();
157 return GDK_SCREEN_BROADWAY (screen)->available_types[0];
161 gdk_screen_get_system_visual (GdkScreen * screen)
163 g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
165 return ((GdkVisual *) GDK_SCREEN_BROADWAY (screen)->system_visual);
169 gdk_visual_get_best (void)
171 GdkScreenBroadway *screen_broadway = GDK_SCREEN_BROADWAY (gdk_screen_get_default());
173 return (GdkVisual *)screen_broadway->visuals[0];
177 gdk_visual_get_best_with_depth (gint depth)
179 GdkScreenBroadway *screen_broadway = GDK_SCREEN_BROADWAY (gdk_screen_get_default ());
180 GdkVisual *return_val;
184 for (i = 0; i < screen_broadway->nvisuals; i++)
185 if (depth == screen_broadway->visuals[i]->depth)
187 return_val = (GdkVisual *) screen_broadway->visuals[i];
195 gdk_visual_get_best_with_type (GdkVisualType visual_type)
197 GdkScreenBroadway *screen_broadway = GDK_SCREEN_BROADWAY (gdk_screen_get_default ());
198 GdkVisual *return_val;
202 for (i = 0; i < screen_broadway->nvisuals; i++)
203 if (visual_type == screen_broadway->visuals[i]->type)
205 return_val = (GdkVisual *) screen_broadway->visuals[i];
213 gdk_visual_get_best_with_both (gint depth,
214 GdkVisualType visual_type)
216 GdkScreenBroadway *screen_broadway = GDK_SCREEN_BROADWAY (gdk_screen_get_default ());
217 GdkVisual *return_val;
221 for (i = 0; i < screen_broadway->nvisuals; i++)
222 if ((depth == screen_broadway->visuals[i]->depth) &&
223 (visual_type == screen_broadway->visuals[i]->type))
225 return_val = (GdkVisual *) screen_broadway->visuals[i];
233 gdk_query_depths (gint **depths,
236 GdkScreenBroadway *screen_broadway = GDK_SCREEN_BROADWAY (gdk_screen_get_default ());
238 *count = screen_broadway->navailable_depths;
239 *depths = screen_broadway->available_depths;
243 gdk_query_visual_types (GdkVisualType **visual_types,
246 GdkScreenBroadway *screen_broadway = GDK_SCREEN_BROADWAY (gdk_screen_get_default ());
248 *count = screen_broadway->navailable_types;
249 *visual_types = screen_broadway->available_types;
253 gdk_screen_list_visuals (GdkScreen *screen)
256 GdkScreenBroadway *screen_broadway;
259 g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
260 screen_broadway = GDK_SCREEN_BROADWAY (screen);
264 for (i = 0; i < screen_broadway->nvisuals; ++i)
265 list = g_list_append (list, screen_broadway->visuals[i]);
271 gdk_visual_decompose_mask (gulong mask,
280 g_warning ("Mask is 0 in visual. Server bug ?");
284 while (!(mask & 0x1))
298 gdk_visual_get_screen (GdkVisual *visual)
300 g_return_val_if_fail (GDK_IS_VISUAL (visual), NULL);
302 return visual->priv->screen;