From 19c757c91e14f1294119d4007feaae40533c4eb7 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Mon, 15 Dec 2003 10:38:03 +0000 Subject: [PATCH] * src/graphics.c src/io.c: + Beginning of an X11 driver. Currently we merely open the window and check keyboard events. --- configure.ac | 16 ++++++++++ src/caca.c | 12 +++++++- src/caca_internals.h | 7 +++++ src/graphics.c | 73 ++++++++++++++++++++++++++++++++++++++++++++ src/io.c | 20 ++++++++++++ 5 files changed, 127 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 3083ddf..e6dde14 100644 --- a/configure.ac +++ b/configure.ac @@ -23,6 +23,8 @@ AC_ARG_ENABLE(slang, [ --enable-slang slang graphics support (default disabled)]) AC_ARG_ENABLE(conio, [ --enable-conio DOS conio.h graphics support (default disabled)]) +AC_ARG_ENABLE(x11, + [ --enable-x11 X11 support (default disabled)]) AC_CHECK_HEADERS(inttypes.h endian.h) AC_CHECK_FUNCS(vsnprintf getenv putenv strcasecmp) @@ -41,6 +43,20 @@ elif test "${enable_slang}" = "yes"; then AC_CHECK_LIB(slang,SLkp_init,:,AC_MSG_ERROR([cannot find slang library])) AC_DEFINE(USE_SLANG, 1, Define if the backend driver is slang) CACA_LIBS="${CACA_LIBS} -lslang" +elif test "${enable_x11}" = "yes"; then + AC_PATH_X + AC_CHECK_LIB(X11, XOpenDisplay, + [ac_cv_my_have_x11=yes + X_CFLAGS="-I${x_includes}" + X_LIBS="-lX11 -L${x_libraries}"], + [ac_cv_my_have_x11=no], + [[-lXt -L${x_libraries}]]) + if test "${ac_cv_my_have_x11}" != "yes"; then + AC_MSG_ERROR([cannot find X11 development files]) + fi + AC_DEFINE(USE_X11, 1, Define if the backend driver is X11) + CPPFLAGS="${CPPFLAGS} ${X_CFLAGS}" + CACA_LIBS="${CACA_LIBS} ${X_LIBS}" elif test "${enable_ncurses}" != "no"; then AC_CHECK_HEADER(ncurses.h,:,AC_MSG_ERROR([cannot find ncurses headers])) AC_CHECK_LIB(ncurses,initscr,:,AC_MSG_ERROR([cannot find ncurses library])) diff --git a/src/caca.c b/src/caca.c index 325e866..d6205e6 100644 --- a/src/caca.c +++ b/src/caca.c @@ -38,6 +38,8 @@ #elif defined(USE_CONIO) # include # include +#elif defined(USE_X11) +# include #else # error "no graphics library detected" #endif @@ -113,6 +115,9 @@ int caca_init(void) _setcursortype(_NOCURSOR); clrscr(); +#elif defined(USE_X11) + /* Nothing to do */ + #endif if(_caca_init_graphics()) return -1; @@ -229,6 +234,8 @@ const char *caca_get_feature_name(enum caca_feature feature) void caca_end(void) { + _caca_end_graphics(); + #if defined(USE_SLANG) SLtt_set_mouse_mode(0, 0); SLtt_set_cursor_visibility(1); @@ -245,6 +252,8 @@ void caca_end(void) gotoxy(_caca_width, _caca_height); cputs("\r\n"); _setcursortype(_NORMALCURSOR); +#elif defined(USE_X11) + /* Nothing to do */ #endif } @@ -294,7 +303,8 @@ static void caca_init_features(void) static void caca_init_terminal(void) { -#if defined(HAVE_GETENV) && defined(HAVE_PUTENV) +#if defined(HAVE_GETENV) && defined(HAVE_PUTENV) \ + && (defined(USE_SLANG) || defined(USE_NCURSES)) char *term, *colorterm, *other; term = getenv("TERM"); diff --git a/src/caca_internals.h b/src/caca_internals.h index 189c8fa..1e248d8 100644 --- a/src/caca_internals.h +++ b/src/caca_internals.h @@ -31,6 +31,7 @@ #define __CACA_INTERNALS_H__ extern int _caca_init_graphics(void); +extern int _caca_end_graphics(void); /* Cached screen size */ extern unsigned int _caca_width; @@ -41,4 +42,10 @@ extern enum caca_feature _caca_background; extern enum caca_feature _caca_dithering; extern enum caca_feature _caca_antialiasing; +#if defined(USE_X11) +#include +extern Display *_caca_dpy; +extern Window _caca_window; +#endif + #endif /* __CACA_INTERNALS_H__ */ diff --git a/src/graphics.c b/src/graphics.c index e5ebe4c..11123dc 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -38,6 +38,8 @@ # if defined(SCREENUPDATE_IN_PC_H) # include # endif +#elif defined(USE_X11) +# include #else # error "no graphics library detected" #endif @@ -75,6 +77,12 @@ static struct text_info ti; static char *_caca_screen; #endif +#if defined(USE_X11) +Display *_caca_dpy; +Window _caca_window; +GC _caca_gc; +#endif + static char *_caca_empty_line; static char *_caca_scratch_line; @@ -98,6 +106,8 @@ void caca_set_color(enum caca_color fgcolor, enum caca_color bgcolor) #elif defined(USE_CONIO) textbackground(bgcolor); textcolor(fgcolor); +#elif defined(USE_X11) + /* FIXME */ #endif } @@ -132,6 +142,8 @@ void caca_putchar(int x, int y, char c) data[1] = (_caca_bgcolor << 4) | _caca_fgcolor; // gotoxy(x + 1, y + 1); // putch(c); +#elif defined(USE_X11) + /* FIXME */ #endif } @@ -175,6 +187,8 @@ void caca_putstr(int x, int y, const char *s) } // gotoxy(x + 1, y + 1); // cputs(s); +#elif defined(USE_X11) + /* FIXME */ #endif } @@ -335,6 +349,42 @@ int _caca_init_graphics(void) _caca_width = ti.screenwidth; _caca_height = ti.screenheight; +#elif defined(USE_X11) + int black_color; + int white_color; + + _caca_dpy = XOpenDisplay(NULL); + if(_caca_dpy == NULL) + return -1; + + black_color = BlackPixel(_caca_dpy, DefaultScreen(_caca_dpy)); + white_color = WhitePixel(_caca_dpy, DefaultScreen(_caca_dpy)); + + _caca_window = XCreateSimpleWindow(_caca_dpy, DefaultRootWindow(_caca_dpy), + 0, 0, 400, 300, 0, + black_color, black_color); + XSelectInput(_caca_dpy, _caca_window, StructureNotifyMask); + XMapWindow(_caca_dpy, _caca_window); + + _caca_gc = XCreateGC(_caca_dpy, _caca_window, 0, NULL); + XSetForeground(_caca_dpy, _caca_gc, white_color); + + for(;;) + { + XEvent event; + XNextEvent(_caca_dpy, &event); + if (event.type == MapNotify) + break; + } + + XSelectInput(_caca_dpy, _caca_window, KeyPressMask); + + /* FIXME */ + _caca_width = 80; + _caca_height = 24; + + XSync(_caca_dpy, False); + #endif _caca_empty_line = malloc(_caca_width + 1); memset(_caca_empty_line, ' ', _caca_width); @@ -348,6 +398,26 @@ int _caca_init_graphics(void) return 0; } +int _caca_end_graphics(void) +{ +#if defined(USE_SLANG) + /* Nothing to do */ +#elif defined(USE_NCURSES) + /* Nothing to do */ +#elif defined(USE_CONIO) + free(_caca_screen); +#elif defined(USE_X11) + XSync(_caca_dpy, False); + XFreeGC(_caca_dpy, _caca_gc); + XUnmapWindow(_caca_dpy, _caca_window); + XDestroyWindow(_caca_dpy, _caca_window); + XCloseDisplay(_caca_dpy); +#endif + free(_caca_empty_line); + + return 0; +} + void caca_set_delay(unsigned int usec) { _caca_delay = usec; @@ -394,6 +464,9 @@ void caca_refresh(void) # else /* FIXME */ # endif +#elif defined(USE_X11) + /* FIXME */ + XFlush(_caca_dpy); #endif /* Wait until _caca_delay + time of last call */ diff --git a/src/io.c b/src/io.c index 2932edc..feb6ffb 100644 --- a/src/io.c +++ b/src/io.c @@ -35,6 +35,9 @@ # include #elif defined(USE_CONIO) # include +#elif defined(USE_X11) +# include +# include #else # error "no graphics library detected" #endif @@ -204,6 +207,23 @@ static unsigned int _read_key(void) return (key == ERR) ? 0 : key; #elif defined(USE_CONIO) return _conio_kbhit() ? getch() : 0; +#elif defined(USE_X11) + XEvent event; + char key; + + while(XCheckWindowEvent(_caca_dpy, _caca_window, KeyPressMask, &event) + == True) + { + if(event.type == KeyPress) + { + //KeySym keysym; + //keysym = XKeycodeToKeysym(_caca_dpy, event.xkey.keycode, 0); + if(XLookupString(&event.xkey, &key, 1, NULL, NULL)) + return key; + } + } + + return 0; #endif }