diff options
Diffstat (limited to '7_2')
-rw-r--r-- | 7_2/include/drawable.h | 13 | ||||
-rw-r--r-- | 7_2/main.c | 2 | ||||
-rw-r--r-- | 7_2/src/drawable.c | 31 |
3 files changed, 26 insertions, 20 deletions
diff --git a/7_2/include/drawable.h b/7_2/include/drawable.h index 3d0caeb..8986342 100644 --- a/7_2/include/drawable.h +++ b/7_2/include/drawable.h @@ -4,6 +4,19 @@ #define FILL_CHR '#' #define SPACE_CHR ' ' +#include <X11/Xlib.h> +#include <X11/Xutil.h> +extern struct X11context { + enum {CTX_NO, CTX_INIT, CTX_FAIL} init; + Display *d; + Window r, w; + int s; + GC gctx; + XVisualInfo v; + XImage *i; + int* data; +} X11; + // что угодно, на чём можно ''нарисовать'' // должно иметь размер, размер пикселей, данные // функция put записывает пиксель по координатам x, y на поле @@ -1,4 +1,4 @@ -#include <X11/X.h> +#include <X11/Xlib.h> #include <assert.h> #include <errno.h> diff --git a/7_2/src/drawable.c b/7_2/src/drawable.c index 33e7290..ab4bf27 100644 --- a/7_2/src/drawable.c +++ b/7_2/src/drawable.c @@ -4,20 +4,10 @@ #include <string.h> #include <stdio.h> #include <assert.h> -#include <X11/X.h> #include <X11/Xlib.h> #include <X11/Xutil.h> -static struct { - enum {CTX_NO, CTX_INIT, CTX_FAIL} init; - Display *d; - Window r, w; - int s; - GC gctx; - XVisualInfo v; - XImage *i; - int* data; -} X11 = { .init=CTX_NO }; +struct X11context X11 = { .init=CTX_NO }; struct drawable drawable_plaintxt(long width, long height) { struct drawable ret; @@ -31,7 +21,7 @@ struct drawable drawable_X11(long width, long height) { drawable_init(&ret, put_X11, show_X11, width, height, sizeof (int)); int* data = ret.data; for (size_t i = 0; i < width*height; ++i) - data[i] = 0x00FFFFFF; + data[i] = 0xFFFFFFFF; return ret; } @@ -76,26 +66,28 @@ void show_plaintxt(const struct drawable *self) { /// X11 from now on /// -static void init_X11(const struct drawable *self) { +void init_X11(const struct drawable *self) { X11.d = XOpenDisplay(NULL); if (X11.d == NULL) { X11.init = CTX_FAIL; + printf("why tho???\n"); return; } X11.s = DefaultScreen(X11.d); X11.r = RootWindow(X11.d, X11.s); X11.gctx = DefaultGC(X11.d, X11.s); - Window w = XCreateSimpleWindow(X11.d, X11.r, 0, 0, self->x, self->y, 0, 0, 0x00FFFFFF); if (!XMatchVisualInfo(X11.d, X11.s, 24, TrueColor, &X11.v)) { XDestroyWindow(X11.d, X11.w); XCloseDisplay(X11.d); X11.init = CTX_FAIL; return; }; - XMapWindow(X11.d, X11.w); + X11.w = XCreateSimpleWindow(X11.d, X11.r, 0, 0, self->x, self->y, 0, 0, 0x00FFFFFF); XSelectInput(X11.d, X11.w, ExposureMask); - X11.data = malloc(self->x * self->y * sizeof (int)); - X11.i = XCreateImage(X11.d, X11.v.visual, X11.v.depth, ZPixmap, 0, (void*)X11.data, self->x, self->y, 8*sizeof (int), 0); + XMapWindow(X11.d, X11.w); + X11.data = self->data; + X11.i = XCreateImage(X11.d, X11.v.visual, X11.v.depth, ZPixmap, 0, (void*)X11.data, self->x, self->y, 32, 0); + X11.init = CTX_INIT; } void put_X11(struct drawable *self, long x, long y) { @@ -114,7 +106,8 @@ start: return; } XEvent e = {}; - XNextEvent(X11.d, &e); - XPutImage(X11.d, X11.w, X11.gctx, X11.i, 0, 0, 0, 0, self->x, self->y); + while (!XNextEvent(X11.d, &e)) { + XPutImage(X11.d, X11.w, X11.gctx, X11.i, 0, 0, 0, 0, self->x, self->y); + } } |