+ Beginning of an X11 driver. Currently we merely open the window and
check keyboard events.
tags/v0.99.beta14
| @@ -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])) | |||
| @@ -38,6 +38,8 @@ | |||
| #elif defined(USE_CONIO) | |||
| # include <dos.h> | |||
| # include <conio.h> | |||
| #elif defined(USE_X11) | |||
| # include <X11/Xlib.h> | |||
| #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"); | |||
| @@ -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 <X11/Xlib.h> | |||
| extern Display *_caca_dpy; | |||
| extern Window _caca_window; | |||
| #endif | |||
| #endif /* __CACA_INTERNALS_H__ */ | |||
| @@ -38,6 +38,8 @@ | |||
| # if defined(SCREENUPDATE_IN_PC_H) | |||
| # include <pc.h> | |||
| # endif | |||
| #elif defined(USE_X11) | |||
| # include <X11/Xlib.h> | |||
| #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 */ | |||
| @@ -35,6 +35,9 @@ | |||
| # include <curses.h> | |||
| #elif defined(USE_CONIO) | |||
| # include <conio.h> | |||
| #elif defined(USE_X11) | |||
| # include <X11/Xlib.h> | |||
| # include <X11/Xutil.h> | |||
| #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 | |||
| } | |||