From b88435f991afb615260057f50db5ba4cbab676e7 Mon Sep 17 00:00:00 2001 From: Kristian Høgsberg Date: Wed, 10 Jul 2013 16:50:10 -0400 Subject: Fill out more of Display and add extension mechanism --- src/Makefile.am | 2 +- src/display.c | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++------ src/private.h | 20 +++++++- src/xfixes.c | 34 ++++++++++++++ 4 files changed, 179 insertions(+), 16 deletions(-) create mode 100644 src/xfixes.c diff --git a/src/Makefile.am b/src/Makefile.am index 8001c4e..3e2bd37 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -8,7 +8,7 @@ libX11_wayland_la_LIBADD = $(CSX_LIBS) libX11_wayland_la_CPPFLAGS = $(CSX_CFLAGS) libX11_wayland_la_SOURCES = \ display.c resource.c window.c pixmap.c event.c input.c private.h \ - hints.c xim.c draw.c font.c colormap.c + hints.c xim.c draw.c font.c colormap.c xfixes.c noinst_PROGRAMS = csx-test xlib-test diff --git a/src/display.c b/src/display.c index 907ca53..bb3a42d 100644 --- a/src/display.c +++ b/src/display.c @@ -1,5 +1,3 @@ - - #include #include #include @@ -248,32 +246,77 @@ XOpenDisplay(const char *display_name) display->screens[0].mheight = 180; display->screens[0].ndepths = 2; display->screens[0].depths = display->depths; - display->screens[0].default_gc = None; - display->screens[0].cmap = None; + display->screens[0].root_depth = 24; + display->screens[0].root_visual = &display->depth24_visuals[0]; + display->screens[0].default_gc = None; /* FIXME */ + display->screens[0].cmap = None; /* FIXME */ display->screens[0].white_pixel = 0xffffffff; display->screens[0].black_pixel = 0xff000000; + display->screens[0].max_maps = 0; + display->screens[0].min_maps = 0; + display->screens[0].backing_store = NotUseful; + display->screens[0].save_unders = False; + display->screens[0].root_input_mask = + KeyPressMask | KeyReleaseMask | + EnterWindowMask | LeaveWindowMask | + ExposureMask | StructureNotifyMask | + SubstructureNotifyMask | SubstructureRedirectMask | + FocusChangeMask | PropertyChangeMask | ColormapChangeMask; display->serial = 1; display->next_atom = 1; for (p = predefined_atoms; *p; p += strlen(p) + 1) XInternAtom(display->xdisplay, p, False); -#if 0 - int max_maps, min_maps; /* max and min color maps */ - int backing_store; /* Never, WhenMapped, Always */ - Bool save_unders; - long root_input_mask; /* initial root input mask */ -#endif wl_list_init(&display->event_list); + display->next_major = 128; + display->next_event = LASTEvent; + display->next_error = FirstExtensionError; + wl_list_init(&display->extension_list); + xdisplay->fd = wl_display_get_fd(display->display); xdisplay->proto_major_version = 11; xdisplay->proto_minor_version = 0; xdisplay->vendor = "Wayland Client Side X Server"; xdisplay->resource_alloc = resource_alloc; + xdisplay->byte_order = LSBFirst; + + xdisplay->bitmap_unit = 32; + xdisplay->bitmap_pad = 32; + xdisplay->bitmap_bit_order = LSBFirst; +#if 0 + int nformats; /* number of pixmap formats in list */ + ScreenFormat *pixmap_format; /* pixmap format list */ +#endif + xdisplay->release = 1; + +#if 0 + int qlen; /* Length of input event queue */ + unsigned long last_request_read; /* seq number of last event read */ + unsigned long request; /* sequence number of last request. */ + +#endif + + xdisplay->max_request_size = 1024; + +#if 0 + struct _XrmHashBucketRec *db; +#endif + + xdisplay->display_name = ":wayland"; xdisplay->default_screen = 0; + xdisplay->nscreens = 1; xdisplay->screens = display->screens; + xdisplay->motion_buffer = 256; + xdisplay->min_keycode = 8; + xdisplay->max_keycode = 255; + + if (csx_display_add_xfixes(display) == -1) { + free(xdisplay); + return NULL; + } /* Test property on root window. */ XChangeProperty(display->xdisplay, display->root->id, @@ -572,29 +615,97 @@ XUngrabServer(Display *xdisplay) return 1; } +void +csx_display_add_extension(struct csx_display *display, + struct csx_extension *extension, + const char *name, int nevents, int nerrors) +{ + extension->name = name; + extension->major = display->next_major++; + if (nevents > 0) { + extension->first_event = display->next_event; + display->next_event += nevents; + } else { + extension->first_event = 0; + } + if (nerrors > 0) { + extension->first_error = display->next_error; + display->next_error += nerrors; + } else { + extension->first_error = 0; + } + wl_list_insert(display->extension_list.prev, &extension->link); +} + WL_EXPORT int XQueryExtension(Display *xdisplay, const char *name, int *major, int *first_event, int *first_error) { struct csx_display *display = csx_display(xdisplay); + struct csx_extension *e; csx_display_enter(display, X_QueryExtension, 0); - STUB(); + wl_list_for_each(e, &display->extension_list, link) { + if (strcmp(name, e->name) == 0) { + *major = e->major; + *first_event = e->first_event; + *first_error = e->first_error; + return True; + } + } - return 1; + *major = 0; + *first_event = 0; + *first_error = 0; + + return False; } WL_EXPORT char ** XListExtensions(Display *xdisplay, int *nextensions) { struct csx_display *display = csx_display(xdisplay); + struct csx_extension *e; + int len, i; + char **list; csx_display_enter(display, X_ListExtensions, 0); - STUB(); + len = wl_list_length(&display->extension_list); + list = malloc((len + 1) * sizeof list[0]); + if (list == NULL) { + csx_display_error(display, 0, BadAlloc); + return NULL; + } - return NULL; + i = 0; + wl_list_for_each(e, &display->extension_list, link) { + list[i] = strdup(e->name); + if (list[i] == NULL) { + csx_display_error(display, 0, BadAlloc); + XFreeExtensionList(list); + return NULL; + } + i++; + } + + *nextensions = len; + list[i] = NULL; + + return list; +} + +WL_EXPORT int +XFreeExtensionList(char **list) +{ + int i; + + for (i = 0; list[i] != NULL; i++) + free(list[0]); + free(list); + + return 1; } WL_EXPORT Cursor diff --git a/src/private.h b/src/private.h index d624aba..c726b54 100644 --- a/src/private.h +++ b/src/private.h @@ -8,7 +8,7 @@ const __typeof__( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) -#define STUB() do { fprintf(stderr, "%s is a lie\n", __func__); } while (0) +#define STUB() do { fprintf(stderr, "*** STUB: %s\n", __func__); } while (0) struct csx_event { XEvent xevent; @@ -21,6 +21,14 @@ struct csx_atom { Atom value; }; +struct csx_extension { + const char *name; + int major; + int first_event; + int first_error; + struct wl_list link; +}; + struct csx_display { struct wl_display *display; struct wl_registry *registry; @@ -51,6 +59,11 @@ struct csx_display { int major; int minor; + + int next_major; + int next_event; + int next_error; + struct wl_list extension_list; }; static inline struct csx_display * @@ -68,6 +81,11 @@ void csx_display_error(struct csx_display *display, XID resourceid, int error); void csx_display_add_seat(struct csx_display *display, uint32_t name, uint32_t version); +void csx_display_add_extension(struct csx_display *display, + struct csx_extension *extension, + const char *name, int nevents, int nerrors); + +int csx_display_add_xfixes(struct csx_display *display); struct csx_property { Atom name; diff --git a/src/xfixes.c b/src/xfixes.c new file mode 100644 index 0000000..4222cc3 --- /dev/null +++ b/src/xfixes.c @@ -0,0 +1,34 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "private.h" + +struct csx_xfixes { + struct csx_extension extension; +}; + +int +csx_display_add_xfixes(struct csx_display *display) +{ + + struct csx_xfixes *xfixes; + + xfixes = malloc(sizeof *xfixes); + if (xfixes == NULL) + return -1; + + csx_display_add_extension(display, &xfixes->extension, + XFIXES_NAME, + XFixesNumberEvents, + XFixesNumberErrors); + + return 0; +} -- cgit v1.2.3