diff options
author | Kristian Høgsberg <krh@bitplanet.net> | 2013-07-03 01:44:16 -0400 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2013-07-03 01:44:16 -0400 |
commit | 4c0cd56c1147f4b658f7a6420f5445a7341cdd73 (patch) | |
tree | b6ac2b5b70e3c0e747287209b7bda97941d46c92 | |
parent | c52758cee9526a837b3da46e4b4d01a96b49a417 (diff) |
Improve error handling further
-rw-r--r-- | src/display.c | 40 | ||||
-rw-r--r-- | src/private.h | 9 | ||||
-rw-r--r-- | src/window.c | 45 |
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(); } |