diff --git a/GNUmakefile b/GNUmakefile index d9cd319..f543f4f 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -11,7 +11,7 @@ L_OBJS = ifeq ($(TARGET),NetBSD) CFLAGS += -I/usr/X11R7/include -I/usr/pkg/include -LDFLAGS += -L/usr/X11R7/lib -L/usr/pkg/lib +LDFLAGS += -L/usr/X11R7/lib -L/usr/pkg/lib -Wl,-R/usr/X11R7/lib -Wl,-R/usr/pkg/lib UNIX = 1 else ifeq ($(TARGET),Linux) UNIX = 1 diff --git a/include/Milsko/LowLevel.h b/include/Milsko/LowLevel.h index 26a2bad..75033d1 100644 --- a/include/Milsko/LowLevel.h +++ b/include/Milsko/LowLevel.h @@ -21,7 +21,10 @@ typedef void* HMILSKOCOLOR; #endif HMILSKO MilskoLLCreate(HMILSKO parent, int x, int y, int width, int height); +void MilskoLLDestroy(HMILSKO handle); void MilskoLLPolygon(HMILSKO handle, MilskoPoint* points, int points_count, HMILSKOCOLOR color); HMILSKOCOLOR MilskoLLAllocColor(HMILSKO handle, int r, int g, int b); +void MilskoLLGetXYWH(HMILSKO handle, int* x, int* y, unsigned int* w, unsigned int* h); +int MilskoLLPending(HMILSKO handle); #endif diff --git a/src/x11.c b/src/x11.c index db72522..8cb0d1e 100644 --- a/src/x11.c +++ b/src/x11.c @@ -1,6 +1,10 @@ /* $Id$ */ #include +#include + +static unsigned long mask = ExposureMask | StructureNotifyMask | ButtonPressMask | ButtonReleaseMask; + HMILSKO MilskoLLCreate(HMILSKO parent, int x, int y, int width, int height){ HMILSKO r; Window p; @@ -17,12 +21,31 @@ HMILSKO MilskoLLCreate(HMILSKO parent, int x, int y, int width, int height){ r->colormap = DefaultColormap(r->display, XDefaultScreen(r->display)); r->gc = XCreateGC(r->display, r->window, 0, 0); + XSelectInput(r->display, r->window, mask); XMapWindow(r->display, r->window); return r; } +void MilskoLLDestroy(HMILSKO handle){ + XFreeGC(handle->display, handle->gc); + XDestroyWindow(handle->display, handle->window); + free(handle); +} + void MilskoLLPolygon(HMILSKO handle, MilskoPoint* points, int points_count, HMILSKOCOLOR color){ + int i; + XPoint* p = malloc(sizeof(*p) * points_count); + + XSetForeground(handle->display, handle->gc, color->pixel); + + for(i = 0; i < points_count; i++){ + p[i].x = points[i].x; + p[i].y = points[i].y; + } + XFillPolygon(handle->display, handle->window, handle->gc, p, points_count, Convex, CoordModeOrigin); + + free(p); } HMILSKOCOLOR MilskoLLAllocColor(HMILSKO handle, int r, int g, int b){ @@ -37,6 +60,22 @@ HMILSKOCOLOR MilskoLLAllocColor(HMILSKO handle, int r, int g, int b){ return c; } +void MilskoLLGetXYWH(HMILSKO handle, int* x, int* y, unsigned int* w, unsigned int* h){ + Window root; + unsigned int depth, border; + + XGetGeometry(handle->display, handle->window, &root, x, y, w, h, &border, &depth); +} + void MilskoLLFreeColor(HMILSKOCOLOR color){ free(color); } + +int MilskoLLPending(HMILSKO handle){ + XEvent ev; + if(XCheckWindowEvent(handle->display, handle->window, mask, &ev)){ + XPutBackEvent(handle->display, &ev); + return 1; + } + return 0; +}