summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2013-07-10 16:50:10 -0400
committerKristian Høgsberg <krh@bitplanet.net>2013-07-10 16:50:10 -0400
commitb88435f991afb615260057f50db5ba4cbab676e7 (patch)
tree7364543a77069fa5d8131e73964b32807d859fe0
parent3ab431238f73ac90c6d2df2f83c8cc7afcc253ba (diff)
Fill out more of Display and add extension mechanism
-rw-r--r--src/Makefile.am2
-rw-r--r--src/display.c139
-rw-r--r--src/private.h20
-rw-r--r--src/xfixes.c34
4 files changed, 179 insertions, 16 deletions
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 <stdint.h>
#include <stdlib.h>
#include <stdio.h>
@@ -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 <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <wayland-client.h>
+
+#include <X11/Xproto.h>
+#include <X11/Xatom.h>
+#include <X11/Xlib.h>
+#include <X11/extensions/Xfixes.h>
+
+#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;
+}