summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2013-07-03 01:44:16 -0400
committerKristian Høgsberg <krh@bitplanet.net>2013-07-03 01:44:16 -0400
commit4c0cd56c1147f4b658f7a6420f5445a7341cdd73 (patch)
treeb6ac2b5b70e3c0e747287209b7bda97941d46c92
parentc52758cee9526a837b3da46e4b4d01a96b49a417 (diff)
Improve error handling further
-rw-r--r--src/display.c40
-rw-r--r--src/private.h9
-rw-r--r--src/window.c45
3 files changed, 55 insertions, 39 deletions
diff --git a/src/display.c b/src/display.c
index 61b632b..8a32a96 100644
--- a/src/display.c
+++ b/src/display.c
@@ -22,8 +22,14 @@ default_error_handler(Display *xdisplay, XErrorEvent *event)
static XErrorHandler error_handler;
void
-csx_display_error(struct csx_display *display,
- int major, int minor, XID resourceid, int error)
+csx_display_enter(struct csx_display *display, int major, int minor)
+{
+ display->major = major;
+ display->minor = minor;
+}
+
+void
+csx_display_error(struct csx_display *display, XID resourceid, int error)
{
XErrorEvent event;
@@ -32,30 +38,12 @@ csx_display_error(struct csx_display *display,
event.resourceid = resourceid;
event.serial = display->serial;
event.error_code = error;
- event.request_code = major;
- event.minor_code = minor;
+ event.request_code = display->major;
+ event.minor_code = display->minor;
error_handler(display->xdisplay, &event);
}
-void
-csx_display_bad_window(struct csx_display *display)
-{
- csx_display_error(display, 0, 0, 0, BadWindow);
-}
-
-void
-csx_display_bad_match(struct csx_display *display)
-{
- csx_display_error(display, 0, 0, 0, BadMatch);
-}
-
-void
-csx_display_bad_alloc(struct csx_display *display)
-{
- csx_display_error(display, 0, 0, 0, BadMatch);
-}
-
static void
shm_format(void *data, struct wl_shm *wl_shm, uint32_t format)
{
@@ -383,6 +371,8 @@ XInternAtom(Display *xdisplay, const char *name, Bool only_if_exists)
uint32_t h, mask, i;
struct csx_atom *atom;
+ csx_display_enter(display, X_InternAtom, 0);
+
h = hash_atom(name);
mask = ARRAY_LENGTH(display->atom_table) - 1;
for (i = 0; i < ARRAY_LENGTH(display->atom_table); i++) {
@@ -395,7 +385,7 @@ XInternAtom(Display *xdisplay, const char *name, Bool only_if_exists)
if (i == ARRAY_LENGTH(display->atom_table)) {
/* FIXME: Grow table */
- csx_display_bad_alloc(display);
+ csx_display_error(display, 0, BadAlloc);
return None;
}
@@ -431,8 +421,10 @@ XGetAtomName(Display *xdisplay, Atom atom)
{
struct csx_display *display = csx_display(xdisplay);
+ csx_display_enter(display, X_GetAtomName, 0);
+
if (atom >= display->next_atom) {
- csx_display_error(display, X_GetAtomName, 0, atom, BadAtom);
+ csx_display_error(display, atom, BadAtom);
return NULL;
}
diff --git a/src/private.h b/src/private.h
index 0bd4fe9..27f18de 100644
--- a/src/private.h
+++ b/src/private.h
@@ -48,6 +48,9 @@ struct csx_display {
struct csx_atom *atom_table[256];
struct csx_atom *atom_map[256];
Atom next_atom;
+
+ int major;
+ int minor;
};
static inline struct csx_display *
@@ -60,12 +63,8 @@ XID cxs_display_add_resource(struct csx_display *display, void *p);
void csx_display_remove_resource(struct csx_display *display, XID id);
void *csx_display_lookup_resource(struct csx_display *display, XID id);
-void csx_display_error(struct csx_display *display,
- int major, int minor, XID resourceid, int error);
+void csx_display_error(struct csx_display *display, XID resourceid, int error);
-void csx_display_bad_alloc(struct csx_display *display);
-void csx_display_bad_window(struct csx_display *display);
-void csx_display_bad_match(struct csx_display *display);
void csx_display_add_seat(struct csx_display *display,
uint32_t name, uint32_t version);
diff --git a/src/window.c b/src/window.c
index f639c91..e3ef666 100644
--- a/src/window.c
+++ b/src/window.c
@@ -3,7 +3,8 @@
#include <stdio.h>
#include <string.h>
-#include "Xlib-wayland.h"
+#include <X11/Xproto.h>
+#include <X11/Xlib.h>
#include "private.h"
@@ -86,13 +87,15 @@ XCreateWindow(Display *xdisplay, Window xparent, int x, int y,
struct csx_window *window, *parent;
int i;
+ csx_display_enter(display, X_CreateWindow, 0);
+
parent = csx_display_lookup_resource(display, xparent);
if (parent == NULL)
/* do something, really */;
window = csx_window_create(display, parent);
if (window == NULL) {
- csx_display_bad_alloc(display);
+ csx_display_error(display, 0, BadAlloc);
return None;
}
@@ -302,9 +305,11 @@ XMapWindow(Display *xdisplay, Window xwindow)
struct csx_window *window;
struct csx_pixmap *pixmap;
+ csx_display_enter(display, X_MapWindow, 0);
+
window = csx_display_lookup_resource(display, xwindow);
if (window == NULL) {
- csx_display_bad_window(display);
+ csx_display_error(display, xwindow, BadWindow);
return 0; /* what's the return value? */
}
@@ -331,6 +336,9 @@ XMapWindow(Display *xdisplay, Window xwindow)
WL_EXPORT int
XMapSubwindows(Display *display, Window xwindow)
{
+ csx_display_enter(display, X_MapSubwindows, 0);
+
+ STUB();
}
WL_EXPORT int
@@ -340,9 +348,11 @@ XChangeWindowAttributes(Display *xdisplay, Window xwindow,
struct csx_display *display = csx_display(xdisplay);
struct csx_window *window;
+ csx_display_enter(display, X_ChangeWindowAttributes, 0);
+
window = csx_display_lookup_resource(display, xwindow);
if (window == NULL) {
- csx_display_bad_window(display);
+ csx_display_error(display, xwindow, BadWindow);
return 0; /* what's the return value? */
}
}
@@ -380,14 +390,16 @@ XConfigureWindow(Display *xdisplay, Window xwindow,
struct csx_display *display = csx_display(xdisplay);
struct csx_window *window;
+ csx_display_enter(display, X_ConfigureWindow, 0);
+
window = csx_display_lookup_resource(display, xwindow);
if (window == NULL) {
- csx_display_bad_window(display);
+ csx_display_error(display, xwindow, BadWindow);
return 0; /* what's the return value? */
}
if ((mask & CWSibling) && !(mask & CWStackMode)) {
- csx_display_bad_match(display);
+ csx_display_error(display, mask, BadMatch);
return 0; /* what's the return value? */
}
@@ -421,15 +433,17 @@ XReparentWindow(Display *xdisplay, Window xwindow,
struct csx_display *display = csx_display(xdisplay);
struct csx_window *window, *parent;
+ csx_display_enter(display, X_ReparentWindow, 0);
+
window = csx_display_lookup_resource(display, xwindow);
if (window == NULL) {
- csx_display_bad_window(display);
+ csx_display_error(display, xwindow, BadWindow);
return 0; /* what's the return value? */
}
parent = csx_display_lookup_resource(display, xparent);
if (parent == NULL) {
- csx_display_bad_window(display);
+ csx_display_error(display, xparent, BadWindow);
return 0; /* what's the return value? */
}
@@ -485,7 +499,7 @@ XLowerWindow(Display *xdisplay, Window xwindow)
window = csx_display_lookup_resource(display, xwindow);
if (window == NULL) {
- csx_display_bad_window(display);
+ csx_display_error(display, xwindow, BadWindow);
return 0; /* what's the return value? */
}
}
@@ -493,6 +507,7 @@ XLowerWindow(Display *xdisplay, Window xwindow)
WL_EXPORT int
XRaiseWindow(Display *display, Window xwindow)
{
+ STUB();
}
WL_EXPORT int
@@ -503,9 +518,11 @@ XMapRaised(Display *xdisplay, Window xwindow)
window = csx_display_lookup_resource(display, xwindow);
if (window == NULL) {
- csx_display_bad_window(display);
+ csx_display_error(display, xwindow, BadWindow);
return 0; /* what's the return value? */
}
+
+ STUB();
}
void
@@ -533,6 +550,8 @@ XDestroyWindow(Display *xdisplay, Window xwindow)
struct csx_display *display = csx_display(xdisplay);
struct csx_window *window;
+ csx_display_enter(display, X_DestroyWindow, 0);
+
window = csx_display_lookup_resource(display, xwindow);
if (window == NULL)
/* BadWindow */;
@@ -550,6 +569,8 @@ XDestroySubwindows(Display *xdisplay, Window xwindow)
struct csx_display *display = csx_display(xdisplay);
struct csx_window *window, *child, *next;
+ csx_display_enter(display, X_DestroySubwindows, 0);
+
window = csx_display_lookup_resource(display, xwindow);
if (window == NULL)
/* BadWindow */;
@@ -563,5 +584,9 @@ XChangeProperty(Display *xdisplay, Window xwindow,
Atom property, Atom type, int format, int mode,
const unsigned char *data, int nelements)
{
+ struct csx_display *display = csx_display(xdisplay);
+
+ csx_display_enter(display, X_ChangeProperty, 0);
+
STUB();
}