*drive-thru whale plays a tune, water in its blowhole moves up and down*
This commit is contained in:
parent
c54a59da72
commit
853ba89db0
3 changed files with 67 additions and 13 deletions
|
@ -3,6 +3,8 @@
|
|||
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
#include <cairo.h>
|
||||
|
||||
#define HEXAGRAM_WINDOW_EVENT_MASK (ButtonMotionMask | ButtonPressMask | \
|
||||
ButtonReleaseMask | ExposureMask | \
|
||||
StructureNotifyMask)
|
||||
|
@ -16,10 +18,14 @@ hexagram_window *hexagram_window_new_x11(const char *display,
|
|||
unsigned int width,
|
||||
unsigned int height);
|
||||
|
||||
void hexagram_window_destroy(hexagram_window *window);
|
||||
|
||||
int hexagram_window_get_display_fd(hexagram_window *window);
|
||||
|
||||
int hexagram_window_show(hexagram_window *window);
|
||||
|
||||
void hexagram_window_destroy(hexagram_window *window);
|
||||
cairo_t *hexagram_window_create_bg_context(hexagram_window *window);
|
||||
|
||||
cairo_t *hexagram_window_create_fg_context(hexagram_window *window);
|
||||
|
||||
#endif /* _HEXAGRAM_WINDOW_H */
|
||||
|
|
|
@ -4,8 +4,8 @@ INCLUDE_PATH = ../include
|
|||
HEADER_SUBDIR = hexagram
|
||||
|
||||
CC = $(CROSS)cc
|
||||
CFLAGS += -fPIC -I$(INCLUDE_PATH)
|
||||
LDFLAGS =
|
||||
CFLAGS += -fPIC -I$(INCLUDE_PATH) $(shell pkg-config --cflags cairo x11)
|
||||
LDFLAGS = $(shell pkg-config --libs cairo x11) -lXext
|
||||
|
||||
HEADERS = dict.h hash.h can.h capture.h pcapng.h module.h window.h sim.h
|
||||
HEADERS_LOCAL = util.h
|
||||
|
|
68
src/window.c
68
src/window.c
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/extensions/Xdbe.h>
|
||||
#include <cairo-xlib.h>
|
||||
|
||||
#include <hexagram/window.h>
|
||||
|
||||
|
@ -25,6 +26,9 @@ struct _hexagram_window {
|
|||
|
||||
XdbeBackBuffer buf;
|
||||
XdbeSwapInfo swapinfo;
|
||||
|
||||
cairo_surface_t *surface_bg,
|
||||
*surface_fg;
|
||||
};
|
||||
|
||||
hexagram_window *hexagram_window_new_x11(const char *display,
|
||||
|
@ -90,8 +94,40 @@ hexagram_window *hexagram_window_new_x11(const char *display,
|
|||
goto error_x_create_gc;
|
||||
}
|
||||
|
||||
if ((window->surface_bg = cairo_xlib_surface_create(window->display,
|
||||
window->bg,
|
||||
DefaultVisual(window->display,
|
||||
window->screen),
|
||||
width,
|
||||
height)) == NULL) {
|
||||
goto error_cairo_xlib_surface_create_bg;
|
||||
}
|
||||
|
||||
cairo_xlib_surface_set_size(window->surface_bg,
|
||||
window->width,
|
||||
window->height);
|
||||
|
||||
if ((window->surface_fg = cairo_xlib_surface_create(window->display,
|
||||
window->buf,
|
||||
DefaultVisual(window->display,
|
||||
window->screen),
|
||||
width,
|
||||
height)) == NULL) {
|
||||
goto error_cairo_xlib_surface_create_fg;
|
||||
}
|
||||
|
||||
cairo_xlib_surface_set_size(window->surface_fg,
|
||||
window->width,
|
||||
window->height);
|
||||
|
||||
return window;
|
||||
|
||||
error_cairo_xlib_surface_create_fg:
|
||||
cairo_surface_destroy(window->surface_bg);
|
||||
|
||||
error_cairo_xlib_surface_create_bg:
|
||||
(void)XFreeGC(window->display, window->gc);
|
||||
|
||||
error_x_create_gc:
|
||||
(void)XFreePixmap(window->display, window->bg);
|
||||
|
||||
|
@ -113,6 +149,22 @@ error_malloc_window:
|
|||
return NULL;
|
||||
}
|
||||
|
||||
void hexagram_window_destroy(hexagram_window *window) {
|
||||
cairo_surface_destroy(window->surface_fg);
|
||||
cairo_surface_destroy(window->surface_bg);
|
||||
|
||||
(void)XFreeGC(window->display, window->gc);
|
||||
|
||||
(void)XFreePixmap(window->display, window->bg);
|
||||
|
||||
if (window->buf != window->win) {
|
||||
(void)XdbeDeallocateBackBufferName(window->display, window->buf);
|
||||
}
|
||||
|
||||
(void)XUnmapWindow(window->display, window->win);
|
||||
(void)XDestroyWindow(window->display, window->win);
|
||||
}
|
||||
|
||||
int hexagram_window_show(hexagram_window *window) {
|
||||
if (XSelectInput(window->display, window->win,
|
||||
ExposureMask | ButtonPressMask | KeyPressMask) == 0) {
|
||||
|
@ -129,14 +181,10 @@ error_x:
|
|||
return -1;
|
||||
}
|
||||
|
||||
void hexagram_window_destroy(hexagram_window *window) {
|
||||
(void)XFreeGC(window->display, window->gc);
|
||||
|
||||
(void)XFreePixmap(window->display, window->bg);
|
||||
|
||||
if (window->buf != window->win) {
|
||||
(void)XdbeDeallocateBackBufferName(window->display, window->buf);
|
||||
}
|
||||
|
||||
XUnmapWindow(window->display, window->win);
|
||||
cairo_t *hexagram_window_create_bg_context(hexagram_window *window) {
|
||||
return cairo_create(window->surface_bg);
|
||||
}
|
||||
|
||||
cairo_t *hexagram_window_create_fg_context(hexagram_window *window) {
|
||||
return cairo_create(window->surface_fg);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue