Bug Summary

File:xcb_aux.c
Location:line 167, column 12
Description:Assigned value is garbage or undefined

Annotated Source Code

1/*
2 * Copyright © 2008 Bart Massey <bart@cs.pdx.edu>
3 * Copyright © 2008 Ian Osgood <iano@quirkster.com>
4 * Copyright © 2008 Jamey Sharp <jamey@minilop.net>
5 * Copyright © 2008 Josh Triplett <josh@freedesktop.org>
6 *
7 * Permission is hereby granted, free of charge, to any person
8 * obtaining a copy of this software and associated documentation
9 * files (the "Software"), to deal in the Software without
10 * restriction, including without limitation the rights to use, copy,
11 * modify, merge, publish, distribute, sublicense, and/or sell copies
12 * of the Software, and to permit persons to whom the Software is
13 * furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be
16 * included in all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
22 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
23 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 * Except as contained in this notice, the names of the authors or
27 * their institutions shall not be used in advertising or otherwise to
28 * promote the sale, use or other dealings in this Software without
29 * prior written authorization from the authors.
30 */
31
32#ifdef HAVE_CONFIG_H1
33#include "config.h"
34#endif
35
36#include <stdio.h>
37#include <stdlib.h>
38#include <string.h>
39
40#include <xcb/xcb.h>
41#include "xcb_aux.h"
42
43/* Connection related functions */
44
45uint8_t
46xcb_aux_get_depth (xcb_connection_t *c,
47 xcb_screen_t *screen)
48{
49 xcb_drawable_t drawable;
50 xcb_get_geometry_reply_t *geom;
51 int depth = 0;
52
53 drawable = screen->root;
54 geom = xcb_get_geometry_reply (c, xcb_get_geometry(c, drawable), 0);
55
56 if (geom) {
57 depth = geom->depth;
58 free (geom);
59 }
60
61 return depth;
62}
63
64uint8_t
65xcb_aux_get_depth_of_visual (xcb_screen_t *screen,
66 xcb_visualid_t id)
67{
68 xcb_depth_iterator_t i;
69 xcb_visualtype_iterator_t j;
70 for (i = xcb_screen_allowed_depths_iterator(screen);
71 i.rem; xcb_depth_next(&i))
72 for (j = xcb_depth_visuals_iterator(i.data);
73 j.rem; xcb_visualtype_next(&j))
74 if (j.data->visual_id == id)
75 return i.data->depth;
76 return 0;
77}
78
79xcb_screen_t *
80xcb_aux_get_screen (xcb_connection_t *c,
81 int screen)
82{
83 xcb_screen_iterator_t i = xcb_setup_roots_iterator(xcb_get_setup(c));
84 for (; i.rem; --screen, xcb_screen_next(&i))
85 if (screen == 0)
86 return i.data;
87 return 0;
88}
89
90xcb_visualtype_t *
91xcb_aux_get_visualtype (xcb_connection_t *c,
92 int scr,
93 xcb_visualid_t vid)
94{
95 xcb_screen_t *screen;
96 xcb_depth_t *depth;
97 xcb_visualtype_iterator_t iter;
98 int cur;
99
100 screen = xcb_aux_get_screen (c, scr);
101 if (!screen) return NULL((void *)0);
102
103 depth = xcb_screen_allowed_depths_iterator(screen).data;
104 if (!depth) return NULL((void *)0);
105
106 iter = xcb_depth_visuals_iterator(depth);
107 for (cur = 0 ; cur < iter.rem ; xcb_visualtype_next(&iter), ++cur)
108 if (vid == iter.data->visual_id)
109 return iter.data;
110
111 return NULL((void *)0);
112}
113
114xcb_visualtype_t *
115xcb_aux_find_visual_by_id (xcb_screen_t *screen,
116 xcb_visualid_t id)
117{
118 xcb_depth_iterator_t i;
119 xcb_visualtype_iterator_t j;
120 for (i = xcb_screen_allowed_depths_iterator(screen);
121 i.rem; xcb_depth_next(&i))
122 for (j = xcb_depth_visuals_iterator(i.data);
123 j.rem; xcb_visualtype_next(&j))
124 if (j.data->visual_id == id)
125 return j.data;
126 return 0;
127}
128
129xcb_visualtype_t *
130xcb_aux_find_visual_by_attrs (xcb_screen_t *screen,
131 int8_t class,
132 int8_t depth)
133{
134 xcb_depth_iterator_t i;
135 xcb_visualtype_iterator_t j;
136 for (i = xcb_screen_allowed_depths_iterator(screen);
137 i.rem; xcb_depth_next(&i)) {
138 if (depth != -1 && i.data->depth != depth)
139 continue;
140 for (j = xcb_depth_visuals_iterator(i.data);
141 j.rem; xcb_visualtype_next(&j))
142 if (class == -1 || j.data->_class == class)
143 return j.data;
144 }
145 return 0;
146}
147
148void
149xcb_aux_sync (xcb_connection_t *c)
150{
151 free(xcb_get_input_focus_reply(c, xcb_get_input_focus(c), NULL((void *)0)));
152}
153
154/* structs instead of value lists */
155/* TODO: generate the struct types and functions from protocol masks and descriptions */
156
157/* This generic implementation of pack_list depends on:
158 a) structs packed to uint32_t size
159 b) structs consist of just uint32_t/int32_t fields in the same order as bitmask
160*/
161
162static void
163pack_list( uint32_t mask, const uint32_t *src, uint32_t *dest )
164{
165 for ( ; mask; mask >>= 1, src++)
3
Loop condition is true. Entering loop body
166 if (mask & 1)
4
Taking true branch
167 *dest++ = *src;
5
Assigned value is garbage or undefined
168}
169
170xcb_void_cookie_t
171xcb_aux_create_window (xcb_connection_t *c,
172 uint8_t depth,
173 xcb_window_t wid,
174 xcb_window_t parent,
175 int16_t x,
176 int16_t y,
177 uint16_t width,
178 uint16_t height,
179 uint16_t border_width,
180 uint16_t _class,
181 xcb_visualid_t visual,
182 uint32_t mask,
183 const xcb_params_cw_t *params)
184{
185 uint32_t value_list[16];
186 pack_list(mask, (const uint32_t *)params, value_list);
187 return xcb_create_window(c, depth, wid, parent,
188 x, y, width, height, border_width,
189 _class, visual, mask, value_list);
190}
191
192xcb_void_cookie_t
193xcb_aux_create_window_checked (xcb_connection_t *c,
194 uint8_t depth,
195 xcb_window_t wid,
196 xcb_window_t parent,
197 int16_t x,
198 int16_t y,
199 uint16_t width,
200 uint16_t height,
201 uint16_t border_width,
202 uint16_t _class,
203 xcb_visualid_t visual,
204 uint32_t mask,
205 const xcb_params_cw_t *params)
206{
207 uint32_t value_list[16];
208 pack_list(mask, (const uint32_t *)params, value_list);
209 return xcb_create_window_checked(c, depth, wid, parent,
210 x, y, width, height, border_width,
211 _class, visual, mask, value_list);
212}
213
214xcb_void_cookie_t
215xcb_aux_change_window_attributes_checked (xcb_connection_t *c,
216 xcb_window_t window,
217 uint32_t mask,
218 const xcb_params_cw_t *params)
219{
220 uint32_t value_list[16];
221 pack_list(mask, (const uint32_t *)params, value_list);
222 return xcb_change_window_attributes_checked( c, window, mask, value_list );
223}
224
225xcb_void_cookie_t
226xcb_aux_change_window_attributes (xcb_connection_t *c,
227 xcb_window_t window,
228 uint32_t mask,
229 const xcb_params_cw_t *params)
230{
231 uint32_t value_list[16];
232 pack_list(mask, (const uint32_t *)params, value_list);
233 return xcb_change_window_attributes( c, window, mask, value_list );
234}
235
236xcb_void_cookie_t
237xcb_aux_configure_window (xcb_connection_t *c,
238 xcb_window_t window,
239 uint16_t mask,
240 const xcb_params_configure_window_t *params)
241{
242 uint32_t value_list[8];
243 pack_list(mask, (const uint32_t *)params, value_list);
244 return xcb_configure_window( c, window, mask, value_list );
245}
246
247xcb_void_cookie_t
248xcb_aux_create_gc (xcb_connection_t *c,
249 xcb_gcontext_t gid,
250 xcb_drawable_t drawable,
251 uint32_t mask,
252 const xcb_params_gc_t *params)
253{
254 uint32_t value_list[32];
255 pack_list(mask, (const uint32_t *)params, value_list);
256 return xcb_create_gc( c, gid, drawable, mask, value_list );
257}
258
259xcb_void_cookie_t
260xcb_aux_create_gc_checked (xcb_connection_t *c,
261 xcb_gcontext_t gid,
262 xcb_drawable_t drawable,
263 uint32_t mask,
264 const xcb_params_gc_t *params)
265{
266 uint32_t value_list[32];
267 pack_list(mask, (const uint32_t *)params, value_list);
268 return xcb_create_gc_checked( c, gid, drawable, mask, value_list);
269}
270
271xcb_void_cookie_t
272xcb_aux_change_gc (xcb_connection_t *c,
273 xcb_gcontext_t gc,
274 uint32_t mask,
275 const xcb_params_gc_t *params)
276{
277 uint32_t value_list[32];
278 pack_list(mask, (const uint32_t *)params, value_list);
279 return xcb_change_gc( c, gc, mask, value_list );
280}
281
282xcb_void_cookie_t
283xcb_aux_change_gc_checked (xcb_connection_t *c,
284 xcb_gcontext_t gc,
285 uint32_t mask,
286 const xcb_params_gc_t *params)
287{
288 uint32_t value_list[32];
289 pack_list(mask, (const uint32_t *)params, value_list);
2
Calling 'pack_list'
290 return xcb_change_gc_checked( c, gc, mask, value_list );
291}
292
293xcb_void_cookie_t
294xcb_aux_change_keyboard_control (xcb_connection_t *c,
295 uint32_t mask,
296 const xcb_params_keyboard_t *params)
297{
298 uint32_t value_list[16];
299 pack_list(mask, (const uint32_t *)params, value_list);
300 return xcb_change_keyboard_control( c, mask, value_list );
301}
302
303/* Color related functions */
304
305/* Return true if the given color name can be translated locally,
306 in which case load the components. Otherwise, a lookup_color request
307 will be needed, so return false. */
308int
309xcb_aux_parse_color(const char *color_name,
310 uint16_t *red, uint16_t *green, uint16_t *blue)
311{
312 int n, r, g, b, i;
313 if (!color_name || *color_name != '#')
314 return 0;
315 /*
316 * Excitingly weird RGB parsing code from Xlib.
317 */
318 n = strlen (color_name);
319 color_name++;
320 n--;
321 if (n != 3 && n != 6 && n != 9 && n != 12)
322 return 0;
323 n /= 3;
324 g = b = 0;
325 do {
326 r = g;
327 g = b;
328 b = 0;
329 for (i = n; --i >= 0; ) {
330 char c = *color_name++;
331 b <<= 4;
332 if (c >= '0' && c <= '9')
333 b |= c - '0';
334 else if (c >= 'A' && c <= 'F')
335 b |= c - ('A' - 10);
336 else if (c >= 'a' && c <= 'f')
337 b |= c - ('a' - 10);
338 else return 0;
339 }
340 } while (*color_name != '\0');
341 n <<= 2;
342 n = 16 - n;
343 *red = r << n;
344 *green = g << n;
345 *blue = b << n;
346 return 1;
347}
348
349/* Drawing related functions */
350
351/* Adapted from Xlib */
352xcb_void_cookie_t
353xcb_aux_set_line_attributes_checked (xcb_connection_t *dpy,
354 xcb_gcontext_t gc,
355 uint16_t linewidth,
356 int32_t linestyle,
357 int32_t capstyle,
358 int32_t joinstyle)
359{
360 uint32_t mask = 0;
361 xcb_params_gc_t gv;
362
363 XCB_AUX_ADD_PARAM(&mask, &gv, line_width, linewidth)((*(&mask)|=1<<((uint32_t const*)(&(((&gv))
->line_width))-(uint32_t const*)((&gv)))), ((&gv)->
line_width=(linewidth)))
;
364 XCB_AUX_ADD_PARAM(&mask, &gv, line_style, linestyle)((*(&mask)|=1<<((uint32_t const*)(&(((&gv))
->line_style))-(uint32_t const*)((&gv)))), ((&gv)->
line_style=(linestyle)))
;
365 XCB_AUX_ADD_PARAM(&mask, &gv, cap_style, capstyle)((*(&mask)|=1<<((uint32_t const*)(&(((&gv))
->cap_style))-(uint32_t const*)((&gv)))), ((&gv)->
cap_style=(capstyle)))
;
366 XCB_AUX_ADD_PARAM(&mask, &gv, join_style, joinstyle)((*(&mask)|=1<<((uint32_t const*)(&(((&gv))
->join_style))-(uint32_t const*)((&gv)))), ((&gv)->
join_style=(joinstyle)))
;
367 return xcb_aux_change_gc_checked(dpy, gc, mask, &gv);
1
Calling 'xcb_aux_change_gc_checked'
368}
369
370/* Adapted from Xlib */
371/* XXX It would be wiser for apps just to call
372 clear_area() directly. */
373xcb_void_cookie_t
374xcb_aux_clear_window(xcb_connection_t * dpy,
375 xcb_window_t w)
376{
377 return xcb_clear_area(dpy, 0, w, 0, 0, 0, 0);
378}