ffca5e6578ed303f4f3dc59f20703dd8f0537473
[dana/dcompmgr.git] / display.c
1 #include "display.h"
2 #include <stdlib.h>
3 #include <stdio.h>
4
5 #include <xcb/render.h>
6 #include <xcb/xfixes.h>
7 #include <xcb/damage.h>
8
9 d_display_t*
10 display_open(const char *name)
11 {
12     d_display_t *dpy = NULL;
13     xcb_connection_t *conn;
14
15     conn = xcb_connect(name, NULL);
16     if (conn) {
17         dpy = malloc(sizeof(d_display_t));
18         dpy->conn = conn;
19         dpy->ref = 1;
20     }
21     return dpy;
22 }
23
24 void
25 display_ref(d_display_t *dpy)
26 {
27     ++dpy->ref;
28 }
29
30 void
31 display_unref(d_display_t *dpy)
32 {
33     if (dpy && --dpy->ref == 0) {
34         xcb_disconnect(dpy->conn);
35         free(dpy);
36     }
37 }
38
39 void
40 display_error(d_display_t *dpy, xcb_generic_error_t *ev)
41 {
42     const int major_opcode = ((xcb_request_error_t*)ev)->major_opcode;
43     const int minor_opcode = ((xcb_request_error_t*)ev)->minor_opcode;
44     const char *name, *req;
45
46     /* XXX check if we should ignore it (ev->full_sequence) */
47
48     (void)dpy;
49
50     name = NULL;
51     switch (ev->error_code) {
52     case XCB_REQUEST:   name = "BadRequest";   break;
53     case XCB_VALUE:     name = "BadValue";     break;
54     case XCB_WINDOW:    name = "BadWindow";    break;
55     case XCB_PIXMAP:    name = "BadPixmap";    break;
56     case XCB_MATCH:     name = "BadMatch";     break;
57     case XCB_DRAWABLE:  name = "BadDrawable";  break;
58     case XCB_G_CONTEXT: name = "BadGC";        break;
59     default: break;
60     }
61     if (!name)
62         switch (ev->error_code - dpy->fixes_error) {
63         case XCB_XFIXES_BAD_REGION: name = "BadRegion"; break;
64         default: break;
65         }
66     if (!name)
67         switch (ev->error_code - dpy->damage_error) {
68         case XCB_DAMAGE_BAD_DAMAGE: name = "BadDamage"; break;
69         default: break;
70         }
71     if (!name)
72         switch (ev->error_code - dpy->render_error) {
73         case XCB_RENDER_PICT_FORMAT: name = "BadPictFormat"; break;
74         case XCB_RENDER_PICT_OP:     name = "BadPictOp"; break;
75         case XCB_RENDER_PICTURE:     name = "BadPicture"; break;
76         case XCB_RENDER_GLYPH_SET:   name = "BadGlyphSet"; break;
77         case XCB_RENDER_GLYPH:       name = "BadGlyph"; break;
78         default: break;
79         }
80
81     if (major_opcode <= 127)
82         switch (major_opcode) {
83         case 1:  req = "CreateWindow";           break;
84         case 2:  req = "ChangeWindowAttributes"; break;
85         case 3:  req = "GetWindowAttributes";    break;
86         case 14: req = "GetGeometry";            break;
87         case 15: req = "QueryTree";              break;
88         case 18: req = "ChangeProperty";         break;
89         case 20: req = "GetProperty";            break;
90         case 22: req = "SetSelectionOwner";      break;
91         case 23: req = "GetSelectionOwner";      break;
92         case 53: req = "CreatePixmap";           break;
93         case 54: req = "FreePixmap";             break;
94         case 55: req = "CreateGC";               break;
95         case 56: req = "ChangeGC";               break;
96         case 60: req = "FreeGC";                 break;
97         case 72: req = "PutImage";               break;
98         default: break; 
99         }
100
101     if (name && req)
102         printf("XError: %s %s!\n",
103                name, req);
104     else if (name)
105         printf("XError: %s major opcode %d minor opcode %d!\n",
106                name, major_opcode, minor_opcode);
107     else
108         printf("XError: code %d major opcode %d minor opcode %d!\n",
109                ev->error_code, major_opcode, minor_opcode);
110
111     abort();
112 }