X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fx11.c;h=bdc21aeea3a3c884cd9e86fa6f373f0613a42a84;hb=959794cfda1f83edc51512211ae5a9f6b1e0b179;hp=4626324fe82bb526c2507b04d2f2b19c9d1a08b5;hpb=f7704e2d22e9499efe6380e0c916c2bd4918e4be;p=rocksndiamonds.git diff --git a/src/libgame/x11.c b/src/libgame/x11.c index 4626324f..bdc21aee 100644 --- a/src/libgame/x11.c +++ b/src/libgame/x11.c @@ -1,7 +1,7 @@ /*********************************************************** * Artsoft Retro-Game Library * *----------------------------------------------------------* -* (c) 1994-2002 Artsoft Entertainment * +* (c) 1994-2006 Artsoft Entertainment * * Holger Schemel * * Detmolder Strasse 189 * * 33604 Bielefeld * @@ -22,6 +22,13 @@ static void X11InitDisplay(); static DrawWindow *X11InitWindow(); +static int X11DebugErrorHandler(Display *display, XErrorEvent *event) +{ + int x = 0; + + return 1 / x; /* !!! crash program to give backtrace in gdb !!! */ +} + void X11InitVideoDisplay(void) { /* initialize X11 video */ @@ -33,21 +40,27 @@ void X11InitVideoDisplay(void) void X11InitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window) { + if (*window != NULL) + X11CloseWindow(*window); + *window = X11InitWindow(); XMapWindow(display, (*window)->drawable); + FlushDisplay(); /* create additional (off-screen) buffer for double-buffering */ +#if 1 + ReCreateBitmap(backbuffer, video.width, video.height, video.depth); +#else *backbuffer = CreateBitmap(video.width, video.height, video.depth); +#endif } static void X11InitDisplay() { -#if !defined(PLATFORM_MSDOS) XVisualInfo vinfo_template, *vinfo; int num_visuals; -#endif unsigned int depth; /* connect to X server */ @@ -55,12 +68,19 @@ static void X11InitDisplay() Error(ERR_EXIT, "cannot connect to X server %s", XDisplayName(options.display_name)); + if (options.debug_x11_sync) + { + Error(ERR_WARN, "running in X11 synchronous mode (debug only)"); + + XSynchronize(display, True); + XSetErrorHandler(X11DebugErrorHandler); + } + screen = DefaultScreen(display); visual = DefaultVisual(display, screen); depth = DefaultDepth(display, screen); cmap = DefaultColormap(display, screen); -#if !defined(PLATFORM_MSDOS) /* look for good enough visual */ vinfo_template.screen = screen; vinfo_template.class = (depth == 8 ? PseudoColor : TrueColor); @@ -79,7 +99,6 @@ static void X11InitDisplay() (depth > 8 && visual->class != TrueColor && visual->class != DirectColor)) Error(ERR_EXIT, "X11 display not supported (inappropriate visual)"); -#endif /* !PLATFORM_MSDOS */ } static DrawWindow *X11InitWindow() @@ -87,8 +106,7 @@ static DrawWindow *X11InitWindow() DrawWindow *new_window = CreateBitmapStruct(); unsigned int border_width = 4; XGCValues gc_values; - unsigned long gc_valuemask; -#if !defined(PLATFORM_MSDOS) + unsigned int gc_valuemask; XTextProperty windowName, iconName; Pixmap icon_pixmap, iconmask_pixmap; unsigned int icon_width, icon_height; @@ -98,13 +116,12 @@ static DrawWindow *X11InitWindow() XClassHint class_hints; char *window_name = program.window_title; char *icon_name = program.window_title; - long window_event_mask; + int window_event_mask; Atom proto_atom = None, delete_atom = None; -#endif int screen_width, screen_height; int win_xpos, win_ypos; - unsigned long pen_fg = WhitePixel(display, screen); - unsigned long pen_bg = BlackPixel(display, screen); + unsigned int pen_fg = WhitePixel(display, screen); + unsigned int pen_bg = BlackPixel(display, screen); const int width = video.width, height = video.height; int i; @@ -114,13 +131,15 @@ static DrawWindow *X11InitWindow() win_xpos = (screen_width - width) / 2; win_ypos = (screen_height - height) / 2; + new_window->width = width; + new_window->height = height; + new_window->drawable = XCreateSimpleWindow(display, RootWindow(display, screen), win_xpos, win_ypos, width, height, border_width, pen_fg, pen_bg); -#if !defined(PLATFORM_MSDOS) proto_atom = XInternAtom(display, "WM_PROTOCOLS", FALSE); delete_atom = XInternAtom(display, "WM_DELETE_WINDOW", FALSE); if ((proto_atom != None) && (delete_atom != None)) @@ -182,7 +201,6 @@ static DrawWindow *X11InitWindow() KeyPressMask | KeyReleaseMask; XSelectInput(display, new_window->drawable, window_event_mask); -#endif /* create GC for drawing with window depth and background color (black) */ gc_values.graphics_exposures = False; @@ -212,6 +230,20 @@ static DrawWindow *X11InitWindow() return new_window; } +void X11CloseWindow(DrawWindow *window) +{ + if (window->drawable) + { + XUnmapWindow(display, window->drawable); + XDestroyWindow(display, window->drawable); + } + + if (window->gc) + XFreeGC(display, window->gc); + + free(window); +} + void X11ZoomBitmap(Bitmap *src_bitmap, Bitmap *dst_bitmap) { #if defined(TARGET_ALLEGRO) @@ -249,7 +281,7 @@ Bitmap *X11LoadImage(char *filename) char *error = "Read_PCX_to_Pixmap(): %s '%s'"; int pcx_err; XGCValues clip_gc_values; - unsigned long clip_gc_valuemask; + unsigned int clip_gc_valuemask; pcx_err = Read_PCX_to_Pixmap(display, window->drawable, window->gc, filename, &new_bitmap->drawable, &new_bitmap->clip_mask); @@ -363,15 +395,18 @@ void X11FillRectangle(Bitmap *bitmap, int x, int y, } void X11FadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, - int fade_mode, int fade_delay, int post_delay) + int fade_mode, int fade_delay, int post_delay, + void (*draw_border_function)(void)) { - /* fading currently not supported -- simply copy target image to screen */ + /* fading currently not supported -- simply copy backbuffer to screen */ if (fade_mode == FADE_MODE_FADE_OUT) - X11FillRectangle(window, x, y, width, height, BLACK_PIXEL); - else - X11CopyArea(bitmap_cross != NULL ? bitmap_cross : backbuffer, window, - x, y, width, height, 0, 0, BLIT_OPAQUE); + X11FillRectangle(backbuffer, x, y, width, height, BLACK_PIXEL); + + if (draw_border_function != NULL) + draw_border_function(); + + X11CopyArea(backbuffer, window, x, y, width, height, x, y, BLIT_OPAQUE); /* as we currently cannot use the fade delay, also do not use post delay */ }